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

  • 相关阅读:
    使用 Apache MINA 开发高性能网络应用程序
    工商银行网上支付接口PHP的demo(原创) 发送篇
    netty服务器和跨域访问
    网站集成支付宝接口
    [翻译]C#数据结构与算法 – 第五章栈与队列(Part 2)
    基于ArcGIS10.0和Oracle10g的空间数据管理平台(C#开发)ArcGIS_Engine中的数据访问
    基于ArcGIS10.0和Oracle10g的空间数据管理平台(C#开发)项目中专业名称介绍
    基于ArcGIS10.0和Oracle10g的空间数据管理平台八(C#开发)图层分类标准定义
    基于ArcGIS10.0和Oracle10g的空间数据管理平台(C#开发)背景介绍
    基于ArcGIS10.0和Oracle10g的空间数据管理平台九(C#开发)空间数据导入RDBMS上Shape格式
  • 原文地址:https://www.cnblogs.com/whiteBear/p/12614592.html
Copyright © 2011-2022 走看看