简介

最小二乘法就是用过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便的求得未知的数据。

一元线性回归下的最小二乘法

下面来讲解一下最小二乘法(以二维数据为例) 首先,我们得到一组数据(x_1,y_1), (x_2,y_2)...(x_n,y_n),我们的预测函数 f(x_i)=\omega x_i+b,也就是预测值\hat y_i, 那么我们的误差的平方和为:

\sum_{i=1}^n(y_i-\hat y_i)^2=\sum_{i=1}^n(y_i-\omega x_i-b)^2

而我们需要使得上面的式子为最小值,从而求得我们需要的\omega和b, 我们将其记作(\omega^*, b^*),即

(\omega^*,b^*)=\arg\min_{(\omega, b)}\sum^n_{i=1}(y_i-\hat y_i)^2=\arg\min_{(\omega,b)}(y_i-\omega x_i-b)^2

求解\omegab的使得E_{(\omega, b)}=\sum^n_{i=1}(y_i-\hat y_i)^2的过程,称为线性回归模型的最小二乘"参数估计" 我们要求得E_{(\omega, b)}的最小值,只需要求得其极值即可。 我们可将E_{(\omega, b)}分别对\omegab求偏导:

\frac{\partial E{(\omega, b)}}{\partial\omega}=2\left(\omega\sum^n_{i=1}x_i^2-\sum^n_{i=1}(y_i-b)x_i\right)=0 \frac{\partial E{(\omega, b)}}{\partial b}=2\left(nb-\sum^n_{i=1}(y_i-\omega x_i)\right)=0

对上面的方程求解可以得到

\omega=\frac{\sum^n_{i=1}y_i(x_i-\overline x)}{\sum^n_{i=1}x^2_i-\frac1m\left(\sum^m_{i=1}x_i\right)^2} b = \frac1m\sum^n_{i=1}(y_i-\omega x_i)

其中\overline x=\frac1n\sum^n_{i=1}x_i\overline xx的均值

通过上面的步骤我们就可以得到最小二乘法的\omega和b了。 从而我们就可以得到关系式f(x_i)=\omega x_i+b

多元线性回归下的最小二乘法

同样的,如果将最小二乘法应用到n维数据中 我们的数据x如下:

x=\left( \begin{matrix} x_{11}&x_{12}&\dots&x_{1n}\\ x_{21}&x_{22}&\dots&x_2n\\ \vdots&\vdots&\ddots&\vdots\\ x_{m1}&x_{m2}&\dots&x_{mn} \end{matrix} \right)

对应的\omega\left(\begin{matrix}\omega_1&\omega_2&\dots&\omega_n\end{matrix}\right),所对应的方程为 \omega_1 x_1+\omega_2 x_2+\dots+\omega_n x_n+b 为了方便计算,我们可以将b放在x\omega中,即将b作为一维,其为固定值1,参数为\omega_b

x=\left( \begin{matrix} x_{11}&x_{12}&\dots&x_{1n}&1\\ x_{21}&x_{22}&\dots&x_2n&1\\ \vdots&\vdots&\ddots&\vdots&\vdots\\ x_{m1}&x_{m2}&\dots&x_{mn}&1 \end{matrix} \right)= \left( \begin{matrix} x_1^T&1\\ x_2^T&1\\ \vdots&\vdots\\ x_m^T&1 \end{matrix} \right)\\ \omega=\left(\begin{matrix}\omega_1&\omega_2&\dots&\omega_n&\omega_b\end{matrix}\right)

因此,我们的方程就变为了f(x_i) = \omega^Tx 与上方一元线性回归下的误差类似地

\omega^*=\arg\min_{\omega}(y-X\omega)^T(y-X\omega)

E_\omega=(y-X\omega)^T(y-X\omega),对\omega求导可得:

\frac{\partial E_\omega}{\partial\omega}=2X^T(X\omega-y)

令上式等于零可得\omega的最优解:

\omega^*=(X^TX)^{-1}X^Ty

从而可以得到我们需要的函数f(x_i)=\omega'^Tx'=\omega^Tx+\omega_b=\omega^Tx+b也就是f(x_i)=x_i^T(X^TX)^{-1}X^Ty

多元最小二乘法也是用与一元线性回归

最小二乘法的代码实现

def LeastSquareMethod(X, Y):
    """
        最小二乘法
    :param X: 未进行扩展的X矩阵
    :param Y: X矩阵相对应的结果集矩阵
    :return X_b: 进行扩展处理后的X矩阵
    :return omega: 使用最小二乘法求得的w
    """
    # 对X矩阵进行扩展
    X_b = np.c_[np.ones((len(X), 1)), X]
    '''
    np.linalg.inv用来求矩阵的逆矩阵
    dot表示矩阵祥恒
    T表示矩阵的转置
    '''
    omega = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(Y)
    return X_b, omega

实例

import numpy as np
import matplotlib.pyplot as plt

def LeastSquareMethod(X, Y):
    """
        最小二乘法
    :param X: 未进行扩展的X矩阵
    :param Y: X矩阵相对应的结果集矩阵
    :return X_b: 进行扩展处理后的X矩阵
    :return omega: 使用最小二乘法求得的w
    """
    # 对X矩阵进行扩展
    X_b = np.c_[np.ones((len(X), 1)), X]
    '''
    np.linalg.inv用来求矩阵的逆矩阵
    dot表示矩阵祥恒
    T表示矩阵的转置
    '''
    omega = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(Y)
    return X_b, omega

if __name__ == '__main__':
    X = np.random.rand(100, 1)
    Y = 4 + 3 * X + np.random.rand(100, 1)
    X_b, omega = LeastSquareMethod(X, Y)
    Y2 = X_b.dot(omega)
    plt.plot(X, Y, 'o')
    plt.plot(X, Y2, 'r')
    plt.show()

得到的图像为 最小二乘法数据拟合

文章目录