
当直线不能较好拟合分布时我们需要使用曲线拟合
import numpy as npimport kerasimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers import Dense,Activationfrom keras.optimizers import SGDfrom tqdm import tqdmx_data = np.linspace(-0.5,0.5,200)noise = np.random.normal(0,0.02,x_data.shape)# 开平方 加噪声y_data = np.square(x_data) + noise# 构建顺序模型model = Sequential()# 1-10-1 10个隐藏层model.add(Dense(units=10,input_dim=1))# 添加双曲线激活函数# model.add(Dense(units=10,input_dim=1,activation='relu'))model.add(Activation('tanh'))model.add(Dense(units=1))model.add(Activation('tanh'))# sgd 默认学习率是0.01 可以替换sgd = SGD(lr=0.5)model.compile(optimizer=sgd,loss='mse')# 训练2000次 分批次 因为数据不是很大 干脆每批次寻来拿所有数据for i in tqdm(range(2000)):# train_on_batch 返回cost = model.train_on_batch(x_data,y_data)w, b = model.layers[0].get_weights()print('W:',w)print('B:',b)print(cost)# 预测y_pred = model.predict(x_data)# 显示预测结果plt.scatter(x_data,y_data)plt.plot(x_data,y_pred,'r-',lw=3)# 打印误差均值lost = y_pred-y_datalost = np.where(lost>=0,lost,-lost)print(np.mean(lost))plt.show()

