国庆后第三次作业

首先我想说一下我对梯度下降法的理解过程:

在进⾏数据分析的⼯作时,我们会尝试为某种场景找到最佳模型。“最佳”意味着“最⼩化模型残差”或“最⼤化数据的可能性”。换句话说,它将代表某种优化问题的解决⽅案。 这意味着我们需要解决⼀连串的最优化问题,尤其是需要从零开始解决问题。采⽤的⽅法是⼀种称为梯度下降法,它很适合用于从0开始解决最优化的问题。

如果要理解梯度下降法,就得先理解梯度的定义:

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

然后从python的角度,引入理解梯度的思想:

梯度下降的思想,假设有某个函数 f,它将实数向量作为输⼊,并输出⼀个实数。⼀个简 单的例⼦是我们经常需要最⼤化或最⼩化这个函数。也就是说,我们需要找到产⽣最⼤(或最⼩)可能值的输⼊ x。

from scratch.linear_algebra import Vector, dot
def sum_of_squares(v: Vector) -> float:
 """计算v中元素的平⽅和"""
 return dot(v, v)

因此,⼀种最⼤化函数的⽅法是选择⼀个随机起始点,计算梯度,在梯度⽅向上前进⼀⼩步(即导致函数增加最多的⽅向),然后⽤新的初始点重复这个过程

如果⼀个函数具有唯⼀的全局最⼩点,则此过程可能会找到它。如果函数具有多个(局部)最⼩点,则此过程可能“找到”⼀个局部最优解,在这种情况下,可以从不同的起点重新运⾏该过 程。如果⼀个函数没有最⼩点,那么该过程可能会⼀直持续下去。

波士顿房价问题:

波士顿房价预测是一个经典的机器学习任务,类似于程序员世界的“Hello World”。和大家对房价的普遍认知相同,波士顿地区的房价是由诸多因素影响的。该数据集统计了13 种可能影响房价的因素和该类型房屋的均价,期望构建一个基于 13 个因素进行房价预测的模型,如图所示。

对于预测问题,可以根据预测输出的类型是连续的实数值,还是离散的标签,区分为回归任务和分类任务。因为房价是一个连续值,所以房价预测显然是一个回归任务。
 

然后,使用梯度下降法预测波士顿房价

先定义一个函数 linear_model,用data载入波士顿房价的数据

def linear_model():
  
    # 1.获取数据
    data = load_boston()

然后对数据集按x y 测试集和训练集进行划分

 x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)

之后,再对数据进行标准化、归一化

transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)

在这里再解释一波为何进行标准化:可以提高计算机的计算速度,提高模型训练效率, 而且可以减少量纲对结果的影响。本实验采用标准化方法,它适用于数据分布有明显边界的情况。

调用python中库自带的函数,对数据进行机器学习:

 estimator = SGDRegressor(max_iter=1000)
    estimator.fit(x_train, y_train)

获取系数与预测值:

y_predict = estimator.predict(x_test)
    print("预测值为:\n", y_predict)
    print("模型中的系数为:\n", estimator.coef_)
    print("模型中的偏置为:\n", estimator.intercept_)

最后评估一下模型的效果:

error = mean_squared_error(y_test, y_predict)
    print("误差为:\n", error)

调用pyplot库 画出波士顿房价的拟合效果图,至此波士顿房价的拟合问题就利用梯度下降法解决了。


import matplotlib.pyplot as plt
training_data,test_data=load_data()
x=test_data[:,:-1]
y=test_data[:,-1:]
y_predict=net.forward(x)
plot_x=np.arange(len(y_predict))
plot_y=np.array(y_predict)
plt.plot(plot_x,plot_y)
plot_y1=np.array(y)
plt.plot(plot_x,plot_y1)
plt.legend(['predict','true'],loc='upper left')
plt.ylim([-0.7,0.5])
plt.show()
plot_y2=np.array(y-y_predict)
plt.plot(plot_x,plot_y2)
plt.ylabel('predict error')
plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值