#%% 特征归一化 (feature normalization) mu = trainX.mean() std = trainX.std() trainX = (trainX - mu) / std testX = (testX - mu) / std #%% 任务3. 实现 LinearRegression 的 get_grad 方法 # 通过观察下列语句的输出值检查梯度实现的正误 # 梯度检查的输出值应非常小,如果不是请检查梯度计算的代码 print(model.check_grad(trainX, trainy)) #%% 任务4. 实现 LinearRegression 的 update 方法 #%% 实现了 update 方法(梯度下降算法)后再进行以下迭代 model = LinearRegression(lr) for i in range(n_iter): model.update(trainX, trainy) model.evaluate(testX, testy) # 分别解除下列语句的注释,从不同角度观察模型的优化过程 utils.plot_loss(model, n_iter) #utils.show_data_model(model, trainX, trainy) #utils.show_contour_model(model, trainX, trainy) #%% 任务5. 输入你手的尺寸,观察模型预测的身高值 best_idx = np.argmin(model.testloss) model.k, model.b = model.snapshot[best_idx] my_size = float(input('输入你手的尺寸(以毫米为单位):')) print("预测你的身高为: %.2f mm" % (model.predict((my_size - mu) / std))) #%% 理解 supplementary 文件夹中关于 KNN 和 bayesian regression 两个算法
_, _, testX = utils.expand_feature1(testX, mu, std) #%% 任务1:实现 LinearRegression 的 get_grad 方法,向量化梯度的计算。 # 梯度检验。如果输出值较大,请检查梯度的计算过程。 model = LinearRegression(n_feature, lr) print('梯度数值计算结果与实际值的 Error Sum of Squares(SSE): {0}'.format( model.check_grad(trainX, trainy))) #%% 训练模型 # 创建模型对象 model = LinearRegression(n_feature, lr) # 用梯度下降方法进行迭代优化 for i in range(n_iter): model.update(trainX, trainy) model.evaluate(validX, validy) # 通过观察 learning curve 检视学习过程 utils.plot_loss(model, n_iter) #%% 查看训练结果 n = 100 x_origin = np.linspace(X.min(), X.max(), n) _, _, xdata = utils.expand_feature(x_origin.reshape((n, 1)), mu, std) ydata = model.predict(xdata) plt.figure() plt.plot(xdata[:, 1], ydata, 'r-') plt.scatter(trainX[:, 1], trainy) plt.xlabel('normalized hand-size') plt.ylabel('stature')
def test_evaluate(self): ''' Evaluate predict value for new input after trained ''' model = LinearRegression('SquaredError', 0, 1) self.assertEqual(5, model.evaluate(5))