目录
线性回归
什么是线性回归?
当我们的数据集提供给我们一组分立的数据时我们使用线性回归的方法拟合出一条曲线使曲线到数据点的距离差异最小。


图为Python线性回归拟合曲线的示例
数据使用Kaggle网站上的cost-of-living-index-2022
线性回归基本步骤
预测函数(Hypothesis Function)
此处使用一元线性函数来拟合曲线为预测(函数,
是我们要寻找的目标函数。
其中,可视为一个n + 1维向量
,n取决于函数的维数,同时将
所对应的参数视为1,参数X也可以视为一个n + 1维向量
,
也可写作以下公式。
代价函数(Cost Function)
对于预测函数我们使用
来描述所预测的函数与数据集中实际给出的数据的相似程度,对于
有如下定义
即真实值与预测值之间的距离的均方误差。
同样有向量化的表达形式,本文不再赘述。
从上述公式可以看出对于代价函数,
的值越小代表拟合程度越高,下文讨论如何降低代价函数。
下为Octave描述:
function J = computeCost(X, y, theta)
m = length(y);
J = 0;
delta = (X * theta - y) .^ 2;
J = 1 / (2 * m) * sum(delta);
end
梯度下降法(Gradient Decent)
对各参量
求偏导,可得出
在此时的梯度,使
沿梯度方向下降可使
收敛于局部最小值(若存在收敛点)。公式如下。
对偏导数化简得:
注意:此时下降时对n + 1维要同时下降,否则会影响下降结果。
其中,为下降的“步长”,对于不同的实际问题,要恰当的选择
,若
过小则下降效率会过低,若
过大则有可能会在下降的过程中“错过”收敛点甚至会转变为发散的状态。
值得注意的是,我们在恰当选取之后在下降的过程之中无需调整
的取值,因为在整个代价函数趋于收敛的过程之中,对应的偏导数会逐渐下降,
与偏导数的乘积也会逐渐下降,从而达到一种逐渐降低“步长”的效果。
下为Octave描述:
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y);
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
theta = theta - alpha / m * X' * (X * theta - y);
J_history(iter) = computeCost(X, y, theta);
end
end
正规方程法(Normal Equation)
正规方程法,区别于梯度下降法所用的迭代思想,可以说是一步到位可以求得的收敛点。对于矩阵相乘形式的
与
,尤其是对于
中求偏导的部分,采用向量化矩阵化的思想得到最后结果如下:
比较
对于梯度下降法和正规方程法这两者在数据集不同时需灵活选取方法,此二者优劣如下。
梯度下降:
优点:
1.当维数较大时(>1e6)计算效果较好。
缺点:
1.需适当且合理地选取。
2.需要迭代多代。
正规方程:
优点:
1.可以”一步到位“。
缺点:
1.在维数较低时(<1e6)计算效果较好。
2.由于公式中需要计算逆矩阵,所以在维数较大时效果较差。
总结
线性回归是针对于线性的数据集效果较好的一种算法,其较为易于理解,并且是很多非线性问题的基础思想,但是其对于非线性数据或者是高度复杂的数据较为难以描述。