线性回归实验
侧边栏壁纸
  • 累计撰写 53 篇文章
  • 累计收到 5 条评论
ML

线性回归实验

bbchen
2022-09-21 / 2 评论 / 41 阅读 / 正在检测是否收录...
线性回归实验

线性回归

回归问题是非常常见的一类问题,目的是寻找变量之间的关系。比如要从数据中寻找房屋面积与价格的关系,年龄和身高的关系,气体压力和体积的关系等等。而机器学习要做的正是要让机器自己来学习这些关系,并为对未知的情况做出预测。

对于线性回归,假设变量之间的关系是线性的,即: hθ(x)=θ0+θ1x 其中 θθ 就是学习算法需要学习的参数,在线性回归的问题上,就是θ1θ0,而 x 是我们对于问题所选取的特征,也即输入。h表示算法得到的映射。

 

代价函数的表示

为了找到这个算法中合适的参数,我们需要制定一个标准。一般而言算法拟合出来的结果与真实的结果误差越小越好,试想一下如果算法拟合出来的结果与真实值的误差为零,那么就是说算法完美地拟合了数据。所以可以根据“真实值与算法拟合值的误差”来表示算法的“合适程度”。在线性回归中,我们经常使用最小二乘的思路构建代价函数: J(θθ)=12ni=1n(hθ(x(i))y(i))2 这里 hθ(x(i)) 由假设模型得出。对线性回归任务,代价函数可以展开为: J(θθ)=12ni=1n(θ0+θ1x(i)y(i))2 误差函数的值越小,则代表算法拟合结果与真实结果越接近。

 

梯度下降

梯度下降算法沿着误差函数的反向更新θ的值,知道代价函数收敛到最小值。梯度下降算法更新θi的方法为: θi=θiαθiJ(θθ)

其中 α表示学习率。对于线性回归的的参数,可以根据代价函数求出其参数更新公式: Jθ0=1ni=1n(hθ(x(i))y(i))1, Jθ1=1ni=1n(hθ(x(i))y(i))x(i).

 

代码实现

现在让我们开始动手实现,首先让我们回顾一下numpy和matplotlib:

运行时长: 403毫秒

结束时间: 2022-09-21 09:37:05

 

你需要实现绘制数据集中图像的函数,当你的实现|正确时,你应该会得到如下的图像:

运行时长: 190毫秒

结束时间: 2022-09-21 09:49:45

 

现在运用所学的知识,对上述数据利用线性回归进行拟合。首先我们对要学习的参数和数据做一个准备:

计算初始误差函数的值,你需要实现误差函数的计算:

 

现在你验证了代价计算的正确性,接下来就需要实现最核心的部分:梯度下降。在实现这一部分之前,确定你理解了上述各种变量及其表示。你需要完成梯度下降的核心代码部分:

为了验证梯度下降方法实现的正确性,你需要把学习的到的直线绘制出来,确定你的实现是否正确。前面你已经绘制了数据集中的点,现在你需要在点的基础上绘制一条直线,如果你的实现正确,那么得到的图像应该是如下这样: 拟合结果 现在你已经正确实现了线性回归,你可能会对误差函数的优化过程比较好奇。为了更好地理解这个过程,你可以将损失函数的图像绘制出来。为此你需要将需要优化的参数的各个取值时误差函数的取值在图像上绘制出来,以下代码需要你进行填写。

 

在梯度更新时,我们保留了代价的历史信息。在参数的学习过程中,代价函数的变化过程你也可以作一个图来查看。观察最后得到的J(θ)的图像以及代价的变化过程,可以加深你的理解。在梯度下降的迭代中,我们设置终止条件为完成了固定的迭代次数,但是在迭代次数完成时,由于学习率等参数的设置,可能得到的参数并不是使得代价最低的值。你可以通过观察代价函数的变化过程,想办法调整学习率等参数或者改进程序,使得参数的取值为搜索到的最优结果。

请利用历史信息,改造plot_visual_cost函数,在等高线图上绘制线性回归模型的优化迭代过程。

进阶

在实现中,你可能采取了像上面公式中给出的结果一样逐个样本计算代价函数,或者在梯度下降的更新时也采用了逐个样本计算的方式。但事实上,你可以采用numpy的矩阵函数一次性计算所有样本的代价函数。可以采用矩阵乘法(np.matmul())求和等方式(np.sum())。利用你学到的线性代数知识,将其实现更改一下吧。

0

评论

博主关闭了所有页面的评论