zoukankan      html  css  js  c++  java
  • 最小二乘法思想

    最小二乘法主要用于函数拟合或函数极值,其思想主要是通过将理论值与预测值的距离的平方和达到最小。在机器学习,尤其是回归模型中,经常可以看到最小二乘法的身影。

    最小二乘法的原理与要解决的问题

    最小二乘法的形式如下式所示:

    [目标函数 = sum(理论值 - 预测值)^2 ]

    理论值是样本数据,预测值是拟合函数得到的预测值。目标函数就是机器学习中的损失函数。我们的目标就是得到使目标函数最小化时候的拟合函数的模型。
    举个线性回归的例子,比如有m个只有一个特征的样本。

    [(x_{1},y_{1}),(x_{2},y_{2}),...(x_{m},y_{m}) ]

    由于只有一个特征,假设采用的拟合函数为:

    [h_{ heta}(x) = heta_0 + heta_1x ]

    这样就有了一个特征,对应的拟合函数的两个参数( heta_0 和 heta_1x)需要求出
    目标函数为:

    [J( heta_0, heta_1)= sum_{i=0}^{m}(y_{i}-h_{ heta}x_{i})^2 ]

    用最小二乘法做什么那?使(J( heta_0, heta_1))最小,求出使(J( heta_0, heta_1))最小时的( heta_0 和 heta_1),那最小二乘法怎么才能使(J( heta_0, heta_1))最小呢?

    最小二乘法的代数法解法

    要使(J( heta_0, heta_1))最小,方法就是对( heta_0 和 heta_1)分别来求偏导数,令偏导数为0,得到一个关于( heta_0 和 heta_1)的二元方程组,求解这个方程组就可以得到( heta_0 和 heta_1)的值。
    (J( heta_0, heta_1))( heta_0)求导,得到如下方程:

    [sum_{i=1}^m(y_{i}- heta_0 - heta_1x_{i}) = 0 ag{1} ]

    (J( heta_0, heta_1))( heta_1)求导,得到如下方程:

    [sum_{i=1}^m(y_{i}- heta_0 - heta_1x_{i})x^{i} = 0 ag{2} ]

    对公式(1)展开有如下表达;

    [msum_{i=1}^mfrac{y_i}{m}-m heta_0-m heta_1sum_{i=1}^mfrac{x_i}{m}=0 ]

    (vec x=sum_{i=1}^mfrac{x_i}{m},vec y=sum_{i=1}^mfrac{y_i}{m})
    则公式(1)有如下表达:

    [mvec y - m heta_0 - m heta_1vec x=0 ]

    [=> heta_0= vec y - heta_1vec x ag{3} ]

    将公式(3)代入(2)中有:

    (sum_{i=1}^my_ix_i- heta_0sum_{i=1}^mx_i- heta_1sum_{i=1}^mx_i^2=0)
    =>(sum_{i=1}^my_ix_i-(vec y - heta_1vec x)sum_{i=1}^mx_i- heta_1sum_{i=1}^mx_i^2=0)
    =>( heta_1=frac{sum_{i=1}^my_i x_i - vec ysum_{i=1}^mx_i}{sum_{i=1}^mx_i^2-vec x sum_{i=1}^mx_i})
    =>( heta_1=frac{sum_{i=1}^my_i x_i - vec ysum_{i=1}^mx_i - mvec yvec x +mvec yvec x}{sum_{i=1}^mx_i^2-2vec x sum_{i=1}^mx_i+vec xsum_{i=1}^mx_i})
    =>( heta_1=frac{y_ix_i-vec yx_i-y_ivec x+vec yvec x}{sum_{i=1}^m(x_i^2-2vec xx_i+vec x^2)})
    =>( heta_1=frac{(x_i-vec x)(y_i-vec y)}{sum_{i=1}^m(x_i-vec x)^2})

    ( heta_0 也可根据 heta_0= vec y - heta_1vec x得到)

    最小二乘法的矩阵法解法

    假设函数(h_ heta(x_1,x_2,...,x_n)= heta_0x_0+ heta_1x_1+...+ heta_{n-1}x_{n-1})的矩阵表达为:

    [h_ heta(x) = X heta ]

    其中,假设函数(h_ heta(x))为m x 1的向量,( heta)为n x 1的向量,里面有n个代数法的模型参数。X为m x n维的矩阵,m代表样本的个数,n代表样本特征数
    损失函数定义为(J( heta)=frac{1}{2}(X heta-Y)^T(X heta-Y))
    其中Y是样本的输出向量,维度为m x 1,(frac{1}{2})主要是为求导后系数为1,方便计算
    根据最小二乘法原理,对这个损失函数对( heta)向量求导取0,结果如下所示:

    [frac{partial J( heta)}{partial heta} =X^T(X heta-Y)=0 ]

    这里用到了链式求导法则以及两个矩阵求导的公式

    公式1:(frac{partial}{partial x}(X^TX) = 2X,X为向量)
    公式2:( abla x f(AX+B)=A^T abla_Yf,Y=AX+B,f(Y)为标量)

    对上述求导等式整理可得:

    [X^TX heta = X^TY ]

    两边同时左乘((X^TX)^{-1})可得:

    [ heta = (X^TX)^{-1}X^TY ]

    也就是正规方程(normal equation)

    最小二乘法的局限性和使用场景

    从上面可以看出,最小二乘法适用简洁高效,比梯度下降这样的迭代法似乎方便很多。但是这里我们就聊聊最小二乘法的局限性。

    • 第一、最小二乘法需要计算(X^TX)的逆矩阵,有时它的逆矩阵是不存在的,这样就不能直接只用最小二乘法了。此时以梯度下降法为代表的迭代法仍然可用。当然,我们也可以对样本数据进行整理,去除掉冗余特征,让(X^TX)的行列式不为0,然后继续使用
    • 第二、当样本特征n非常da的时候,计算(X^TX)的逆矩阵是一个非常耗时的工作(n x n的矩阵求逆),甚至不可行。此时以梯度下降法为代表的迭代法仍然可用。那这个n到底多大就不适合最小二乘法呢?如果你没有很多的分布式大数据计算资源,建议超过10000个特征就用迭代法吧,或者通过主成分分析降低特征的维度后再用最小二乘法
    • 第三、如果拟合函数不是线性的,这时无法使用最小二乘法,需要通过一些技巧转化为线性才能使用,此时梯度下降仍可使用
    • 第四、特殊情况,当样本量m很少,小于特征数n的时候,这时拟合方程是欠定的,常用的优化方法都无法去拟合数据。当样本量m等于特征数n的时候,用方程组求解就可以了。当m大于n时,拟合方程是超定的,也就是我们常用与最小二乘法的场景了。

    参考:https://www.cnblogs.com/pinard/p/5976811.html

  • 相关阅读:
    团队项目-第一阶段冲刺7
    团队项目-第一阶段冲刺6
    Spring Boot 揭秘与实战(七) 实用技术篇
    Spring Boot 揭秘与实战(七) 实用技术篇
    Spring Boot 揭秘与实战(六) 消息队列篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(四) 配置文件篇
  • 原文地址:https://www.cnblogs.com/whiteBear/p/12614592.html
Copyright © 2011-2022 走看看