线性回归之最小二乘法
Posted liyier
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性回归之最小二乘法相关的知识,希望对你有一定的参考价值。
线性回归之最小二乘法
1.最小二乘法的原理
最小二乘法的主要思想是通过确定未知参数( heta)(通常是一个参数矩阵),来使得真实值和预测值的误差(也称残差)平方和最小,其计算公式为(E=sum_{i=0}^ne_i^2=sum_{i=1}^n(y_i-hat{y_i})),其中(y_i)是真实值,(hat{y_i})是对应的预测值。如下图所示(来源于维基百科,Krishnavedala的作品),就是最小二乘法的一个示例,其中红色为数据点,蓝色为最小二乘法求得的最佳解,绿色即为误差。
图中有四个数据点分别为:(1, 6), (2, 5), (3, 7), (4, 10)。在线性回归中,通常我们使用均方误差来作为损失函数,均方误差可以看作是最小二乘法中的E除以m(m为样本个数),所以最小二乘法求出来的最优解就是将均方误差作为损失函数求出来的最优解。对于图中这些一维特征的样本,我们的拟合函数为(h_ heta(x)= heta_0+ heta_1x),所以损失函数为 [J( heta_0, heta_1)=sum_{i=0}^m(y^{(i)}-h_ heta(x^{(i)}))^2=sum_{i=0}^m(y^{(i)}- heta_0- heta_1x^{(i)})^2](这里损失函数使用最小二乘法,并非均方误差),其中上标(i)表示第i个样本。
2.最小二乘法求解
要使损失函数最小,可以将损失函数当作多元函数来处理,采用多元函数求偏导的方法来计算函数的极小值。例如对于一维特征的最小二乘法,(J( heta_0, heta_1))分别对( heta_0),( heta_1)求偏导,令偏导等于0得:
[frac{partial J( heta_0, heta_1)}{partial heta_0}=-2sum_{i=1}^{m}(y^{(i)}- heta_0- heta_1x^{(i)}) = 0 ag{2.1}]
[frac{partial J( heta_0, heta_1)}{partial heta_1}=-2sum_{i=1}^{m}(y^{(i)}- heta_0- heta_1x^{(i)})x^{(i)} = 0 ag{2.2}]
联立两式,求解可得:
[ heta_0 =frac{sum_{i=1}^m(x^{(i)})^2sum_{i=1}^my^{(i)}-sum_{i=1}^mx^{(i)}sum_{i=1}^mx^{(i)}y^{(i)}}{msum_{i=1}^m(x^{(i)})^2-sum_{i=1}^mx^{(i)}(sum_{i=1}^mx^{(i)})^2} ag{2.3}]
[ heta_1 =frac{msum_{i=1}^mx^{(i)}y^{(i)}-sum_{i=1}^mx^{(i)}sum_{i=1}^my^{(i)}}{msum_{i=1}^m(x^{(i)})^2-sum_{i=1}^mx^{(i)}(sum_{i=1}^mx^{(i)})^2} ag{2.4}]
对于图1中的例子,代入公式((2.3))和((2.4))进行结算得,( heta_0 = 3.5, heta_1=1.4,J( heta) = 4.2)。
对于n维特征的样本,同样可以采用这种方式来求解。对于特征维度((x_1,x_2, cdots,x_n)),我们增加一个第0维(x_0=1),这样增广特征向量(x = (x_0,x_1,cdots,x_n)),增广权向量为( heta = ( heta_0, heta_1,dots, heta_n)).
此时我们的拟合函数变为:
[ h_ heta(x) = sum_{i=0}^n heta_ix_i = heta_0+ heta_1x_1 + cdots+ heta_nx_n ]
损失函数变为:
[J( heta)=sum_{j=1}^m(h_ heta(x^{(j)})-y^{(j)})^2=sum_{j=1}^m(sum_{i=0}^n heta_ix_i^{(j)}-y^{(j)})^2]
损失函数(J( heta))分别对( heta_i(i=0,1,dots,n))求偏导,得:
[frac{partial J( heta)}{partial heta_i} = 2sum_{j=1}^m(h_ heta(x^{(j)})-y^{(j)})x^{(j)}=2sum_{j=1}^m(sum_{i=0}^n heta_ix_i^{(j)}-y^{(j)})x^{(j)}quad (i=0,1,dots,n) ]
令偏导等于0,则有:
[sum{j=1}^m(sum{i=0}^n heta_ix_i^{(j)}-y^{(j)})x^{(j)}=0quad (i=0,1,dots,n) ]
这样最终得到的结果就是一个线性方程组,未知数的个数为n+1,方程的个数也为n+1,这样就可以通过高斯消元法解出( heta_i(i=0,1,dots,n)),具体可参见:详解最小二乘法原理和代码。
对于线性回归问题,我们可以依据拟合函数的形式进行特征空间变换,即广义线性回归。例如,(h_ heta(x)= heta_0+ heta_1x_1+ heta_2x_2^2),我们可以令(x_2:=x_2^2),这里(:=)表示赋值,即将右边的值赋给左边。这样又变成了我们所熟悉的拟合函数形式。
对于非线性回归问题,最小二乘法的思想同样适用,只不过函数形式有所变化。例如,对于拟合函数(h_ heta(x)= heta_0+ heta_1x+ heta_2l nx),此时(J( heta)=sum_{j=1}^m(h_ heta(x^{(j)})-y^{(j)})^2),求偏导的结果为:
[frac{partial J( heta)}{partial heta_i}=2sum_{j=1}^{m}(h_ heta(x^{(j)})-y^{(j)})frac{partial h_ heta(x)}{ heta_i}quad (i=0,1,2);其中frac{partial h_ heta(x)}{ heta_0} = 1, frac{partial h_ heta(x)}{ heta_2} = x, frac{partial h_ heta(x)}{ heta_2} = lnx]
同样可以构造线性方程组,用高斯消元法求解。
3.矩阵求解最小二乘法
对于函数(?_??(x)=??_0+??_1??_1+dots+??_????_??),我们将其用矩阵表示为:
[X heta = Y qquad ag{3.1}]
其中,
[X = left{egin{matrix} (x^{(1)})^T \\ (x^{(2)})^T \\ vdots \\(x^{(m)})^T end{matrix} ight} , Y = left{egin{matrix} y^{(1)} \\ y^{(2)} \\ vdots \\y^{(m)}) end{matrix} ight},x^{(j)}=left{egin{matrix} x_0^{(j)}) \\ x_1^{(j)} \\ vdots \\ x_n^{(j)} end{matrix} ight}, heta = left{egin{matrix} heta_0 \\ heta_1 \\ vdots \\ heta_n end{matrix} ight}]
m表示样本个数,n为特征维度,(x_0^{(i)}=1quad(i = 0,1,dots,m)),即(X)的第一列全为1,(x_i^{(j)})表示第j个样本的第i个特征,(X)为增广样本矩阵((1+n)*m维),(Y)为真实值组成的列向量。
损失函数表示为:
[J( heta)=sum_{j=1}^m(h_ heta(x^{(j)})-y^{(j)})^2=(X heta?Y)^T(X heta?Y) ag{3.2}]
根据最小二乘法,利用矩阵求导得:(具体推导参见线性回归矩阵推导和线性回归相关向量求导)
[frac{partial J( heta)}{partial heta}=2X^T(X heta-Y)]
令求导结果等于0矩阵,可得:
[X^TX heta = X^TYquadRightarrow quad heta = (X^TX)^{-1}X^TY ag{3.3}]
对于图1中的例子,利用公式((3.3))计算得:( heta = left{egin{matrix} 3.5 \\1.4end{matrix} ight})
4.总结
最小二乘法可以直接求解参数矩阵,在计算时可以直接套入公式。但是仍有一定的局限性,主要体现在:
1.(X^TX)的逆矩阵可能不存在,这个在Matlab中,可以通过求伪逆来进行计算。
2.对于((3.1))式,可以将其看成一个线性方程组(假设各方程线性无关)。如果样本个数m小于特征维数n,那么此方程组有无穷多个解。如果m = n,有唯一解。如果m大于n,无解(即存在矛盾解)。最小二乘法一般是在m大于n的时候使用,此时求出来的解是最优近似解。
3.最小二乘法的时间复杂度为(O(n^3)),当n特别大的时候(一般大于10000),求逆矩阵的过程非常复杂。此时采用最小二乘法,会非常耗时。
参考链接:
以上是关于线性回归之最小二乘法的主要内容,如果未能解决你的问题,请参考以下文章