线性回归模型和最小二乘法

1. 线性回归基本概念

  线性回归假设因变量与自变量之间存在线性关系,因变量可通过自变量线性叠加而得到,即因变量和自变量之间可用如下方式表示。

  

  式中为自变量,为权重系数,为偏置。

  线性回归就是要解决如何利用样本求取拟合出上述表达式,获得最佳直线的问题,最常用的就是最小二乘法。

  最小二乘法:最佳拟合线性,将已知样本的自变量代入拟合直线,得到的观测值与实际值之间的误差平方和最小。

2、一元线性回归

  为了好理解,先从简单的情况开始,即一元线性回归。

(1)利用方程组来解系数

  假设因变量和自变量可用如下函数表示:

  对于任意样本点有误差误差平方和

  

  那什么样的a和b会使得误差平方和最小呢?

  上面是求最值的问题,我们会想到导数和偏导数,这里在偏导数等于0的地方能取到极值,并且也是最值。
分别对a和b求偏导得到如下表达式:

  

  通过对二元一次方程组

  

  进行求解,可以得到如下解:

  

  上面的数学过程用代码表示如下:

import numpy as np
import matplotlib.pyplot as plt

def calcAB(x,y):
    """
    一元线性回归
    """
    n = len(x)
    sumX, sumY, sumXY, sumXX = 0, 0, 0, 0
    for i in range(0, n):
        sumX += x[i]
        sumY += y[i]
        sumXX += x[i] * x[i]
        sumXY += x[i] * y[i]
    a = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX)
    b = (sumXX * sumY - sumX * sumXY) / (n * sumXX - sumX * sumX)
    return a, b
    
xi = [1,2,3,4,5,6,7,8,9,10]
yi = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
a,b=calcAB(xi,yi)
print("y = %10.5fx + %10.5f" %(a,b))

x = np.linspace(0,10)
y = a * x + b
plt.plot(x,y)
plt.scatter(xi,yi)
plt.show()

  python数据散点和拟合的直线如下:

  

(2)利用矩阵的方法来求解系数

  函数

  也可以表示成如下的形式

  

  式中

  对于n个样本,此时损失函数(即误差平方和)为:

  

  假如我们将样本表示成如下形式:

  

  则

  

  进一步,可以将损失函数表示如下形式:

  

  L对W求导,可得到

  

  令导数为0,则有

  

  从而

  

  进而可以求得

  

x = [1,2,3,4,5,6,7,8,9,10]
y = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
X = np.vstack([np.ones(len(x)),x]).T
Y = np.array(y).T
W=np.dot(np.matrix(np.dot(X.T,X))**-1,np.dot(X.T,Y))
yi=np.dot(X,W.T)#这里公式里是不需要转置的,但由于矩阵运算时W自动保存成一行多列的矩阵,所以多转置一下,配合原公式的计算。
print(X)
print(Y)
print(W)
print(yi)#拟合出的预测点
plt.plot(x,y,'o',label='data',markersize=10)
plt.plot(x,yi,'r',label='line')
plt.show()

 结果如下:

  X=

  [[ 1. 1.]

  [ 1. 2.]

  [ 1. 3.]

  [ 1. 4.]

  [ 1. 5.]

  [ 1. 6.]

  [ 1. 7.]

  [ 1. 8.]

  [ 1. 9.]

  [ 1. 10.]]

  Y=

  [ 10. 11.5 12. 13. 14.5 15.5 16.8 17.3 18. 18.7]

  W=

  [[ 9.30666667 0.98606061]]

  yi=

  [[ 10.29272727]

  [ 11.27878788]

  [ 12.26484848]

  [ 13.25090909]

  [ 14.2369697 ]

  [ 15.2230303 ]

  [ 16.20909091]

  [ 17.19515152]

  [ 18.18121212]

  [ 19.16727273]]

  

3、多元线性回归

  将一元线性回归及回归系数的计算公式推广到多元线性回归也是一样。
  损失函数可表示如下:

  

  对L求导有

  

  不防令

  

  则上式可化简为

  

  

  

  

  

  记

  

  则

  

(1)当矩阵满秩时(数据点的个数大于x的维度时)

  令导数为0的方程组有足够的已知条件求解,令导数为0,则有

  

  而

  

  则有

  

  从而有

  

(2)当矩阵不满秩时

  此时利用导数为0方程组个数不够,不能够全部解出参数,
可利用梯度下降法求近似最优解

  

  而梯度下降步长初始化可随机设置,因而上式不防写成

  

  最小二乘法多项式曲线拟合

  多项式曲线拟合与多元线性回归拟合不同点在于,多元线性回归自变量有多个,因变量是多个自变量的线性组合,其形式为

  

  而多项式拟合自变量还是一个,只不过因变量可以看作是自变量不同多项式的线性组合,其形式为

  

  但利用矩阵计算时,如果满秩,两者系数的表达方式是一样的

  

  概念

  默认地认为因变量是自变量的多项式的线性组全,即有如下形式

  

  最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是拟合曲线上的数据点到原数据点的误差平方和最小。即有

  

  回归系数求解

  求最值问题,如果直接求解那么必然在可能的极值点获得(此时没有边界限制)。对(1)式求偏导,如下

  

  
为便于理解,我们每次都只对w的一个维度求偏导,则有

  

  即

  

  即

  

  即

  

  写成矩阵形式有

  

  将这个范德蒙得矩阵化简后可得到:

  

  

  

  便得到了系数矩阵 A,同时,我们也就得到了拟合曲线。
其实我想说的是看到(2)中的矩阵等式,这个等式都不用推导的,因为函数的表达式就是这样的代入,代入样本后自然会有这样的等式。
而(3)通过矩阵运算自然就能得到。

  用python代码编写多项式回归代码,结果如下:

  

注:以上内容转载自 http://dy.163.com/v2/article/detail/DQ00ILDU0538057A.html,写得清晰明了,感谢博主分享!

猜你喜欢

转载自www.cnblogs.com/xiaobingqianrui/p/10243326.html