image.png

    当直线不能较好拟合分布时我们需要使用曲线拟合

    1. import numpy as np
    2. import keras
    3. import matplotlib.pyplot as plt
    4. from keras.models import Sequential
    5. from keras.layers import Dense,Activation
    6. from keras.optimizers import SGD
    7. from tqdm import tqdm
    8. x_data = np.linspace(-0.5,0.5,200)
    9. noise = np.random.normal(0,0.02,x_data.shape)
    10. # 开平方 加噪声
    11. y_data = np.square(x_data) + noise
    12. # 构建顺序模型
    13. model = Sequential()
    14. # 1-10-1 10个隐藏层
    15. model.add(Dense(units=10,input_dim=1))
    16. # 添加双曲线激活函数
    17. # model.add(Dense(units=10,input_dim=1,activation='relu'))
    18. model.add(Activation('tanh'))
    19. model.add(Dense(units=1))
    20. model.add(Activation('tanh'))
    21. # sgd 默认学习率是0.01 可以替换
    22. sgd = SGD(lr=0.5)
    23. model.compile(optimizer=sgd,loss='mse')
    24. # 训练2000次 分批次 因为数据不是很大 干脆每批次寻来拿所有数据
    25. for i in tqdm(range(2000)):
    26. # train_on_batch 返回
    27. cost = model.train_on_batch(x_data,y_data)
    28. w, b = model.layers[0].get_weights()
    29. print('W:',w)
    30. print('B:',b)
    31. print(cost)
    32. # 预测
    33. y_pred = model.predict(x_data)
    34. # 显示预测结果
    35. plt.scatter(x_data,y_data)
    36. plt.plot(x_data,y_pred,'r-',lw=3)
    37. # 打印误差均值
    38. lost = y_pred-y_data
    39. lost = np.where(lost>=0,lost,-lost)
    40. print(np.mean(lost))
    41. plt.show()

    image.png