第2.7节 线性回归(目标函数推导)
各位朋友大家好,欢迎来到月来客栈,我是掌柜空字符。
本期推送内容目录如下,如果你觉得本期内容对你有所帮助欢迎点赞、收藏、转发。
2.7 目标函数推导 2.7.1 目标函数 2.7.2 求解梯度 2.7.3矢量化计算 2.7.4从零实现线性回归 2.7.5 小结
2.7 目标函数推导
经过前面几节内容的介绍,我们知道了什么是线性回归、怎样转换求解问题、如何通过sklearn进行建模求解及梯度下降法的原理与推导。同时,在2.6节中还通过一个故事来讲解了最小二乘法的来历,以及误差服从高斯分布的事实。下面,我们就来完成线性回归中的最后两个任务,线性回归的推导及Python代码的实现。
2.7.1 目标函数
根据前面的介绍,现在我们对线性回归的目标函数做如下定义: 设样本为,对样本的观测(预测)值记为,则有
其中表示第个样本预测值与真实值之间的误差,和均为一个列向量,为一个标量,同时由于误差独立同分布于均值为0的高斯分布[1],于是有
接着将式(2.23)代入式(2.24)有
此时需要注意式(2.25)的右边部分(从右往左看),站在的角度看显然是随机变量服从于以为均值的正态分布Machine Learning [2] (想想正态分布的表达式)。又由于此时的密度函数与参数、和有关(随机变量是、和下的条件分布),于是有
到目前为止,也就是说此时真实值服从于均值为,方差为的正态分布。同时,由于是依赖于参数和的变量,那么什么样的一组参数和能够使已知的真实值最容易发生呢?此时就需要用到极大似然估计进行参数估计
为了便于求解,可以在等式(2.27)的两边同时取自然对数
由于 等价于,所以
于是得到目标函数
2.7.2 求解梯度
设表示第个样本的真实值; 表示第个样本的预测值;表示权重(列)向量,表示其中的一个分量;表示数据集,形状为,为样本个数,为特征维度; 为一个(列)向量,表示第个样本,为第j维特征。
由此可以写出目标函数为
目标函数关于的梯度求解过程为
目标函数关于的梯度求解过程为
此时便得到了目标函数关于参数的梯度计算公式
在推导得到每个参数的梯度更新公式后,就能根据梯度下降算法来对迭代的对参数值进行更新,直到目标函数收敛。到此,对于整个线性回归部分阶段二的内容就介绍完了,下面继续来看最后一个阶段的内容。
2.7.3矢量化计算
为了在编程时高效地计算,需要对式(2.34)~式(2.36)进行矢量化,代码如下:
y_hat=np.matmul(X, W) + b
J(W,b)= 0.5 * (1 / m) * np.sum((y – y_hat) ** 2)
grad_w=-1/m*np.matmul(X.T,(y-y_hat))
grad_b=-1/m*np.sum(y-y_hat)
同时,这里有一个小技巧值得分享。当我们在矢量化公式时,如果不知道哪个变量该放在哪个位置或者要不要进行转置,则可带上变量的维度一起进行计算。例如根据式(2.34)~式(2.36)可以看出的梯度计算公式大致的格式,所以矢量化后的结果也差不多是那种格式。同时的形状是[],而真实值减去预测值后的形状为[],因此在和计算后为了得到的形状,只能是一个[]的矩阵乘以[]的矩阵才可能得到那样的结果。故,应该把的转置放在前面。
2.7.4从零实现线性回归
下面笔者依旧以波士顿房价预测模型为例,通过手动编写代码进行模型的建模与求解,完整代码见Book/Chapter02/06_boston_price_train.py
文件。