zoukankan      html  css  js  c++  java
  • 实现最小二乘的问题——求矩阵的逆

    我们可以使用最小二乘法求解线性回归:

    β即是我们模型训练获得的系数。但是这里有个问题即是涉及到了矩阵求逆,这就要求XTX可逆,在实际的应用中,很多情况下,矩阵是不可逆的,如何处理呢?我们可以求矩阵的伪逆,函数原型:numpy.linalg.pinv(a,rcond=1e-15)
    计算一个矩阵的伪逆(Moore-Penrose)。

    • a:(m,n)要求逆的矩阵
    • rcond:删除在最小二乘解中“很小的”奇异值。奇异值小于rcond*largest_singular_value将被置为0
      如果SVD计算不收敛,该函数将会抛出LinAlgError异常
      矩阵A的伪逆,记为:A+,被定义为:最小二乘问题Ax=b中的“算子”。比如,如果x为最小二乘问题中的解,那么A+应满足:x=A+b
      如果:是A的奇异值分解,其中Q1,2是正交矩阵,是由A的奇异值组成的对角阵,而是A的奇异值的倒数组成的对角阵(用0填充)。

    G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, pp. 139-142.

    使用样例:在最小二乘实现线性回归中:

        def olsr(dataMatrix,classLabels):
            dataMatrix=np.mat(dataMatrix)
            classLabels=np.mat(classLabels)
            pinv_X=np.linalg.pinv(dataMatrix,0.01)#过滤掉小于(rcond=0.01*最大奇异值)的“小奇异值”
            ws=pinv_X*classLabels.T#classLabels.T:保证classLabels.T为列向量
            return ws#返回训练模型获得的系数
    

    补充:

    1. 正交矩阵:
      如果A是n阶矩阵,满足AAT=ATA=E,则A是正交矩阵。
      如果A是正交矩阵<->AT=A-1<->A的行列向量组是正交规范化向量组。且|A|=1或者-1
      2.解决线性回归相关的函数还有numpy.linalg.lstsq.参见:numpy.linalg.lstsq。该函数返回一个线性矩阵方程的最小二乘解。函数原型:
      numpy.linalg.lstsq(a,b,rcond=-1).其中:
    • a相当于x-y坐标系中的x

    • b相当于x-y坐标系中的y。可以对b传入矩阵,那么返回的也将是一个矩阵。

    • rcond与pinv()中的参数值相同,目的在于减少小奇异值的影响。

        >>>x=np.array([0,1,2,3])
        >>>y=np.array([-1,0.2,0.9,2.1])
        >>>A=np.vstack([x,np.ones(len(x))]).T#添加全为1的偏置单位,并转置
      
        >>> A
        array([[ 0.,  1.],
            [ 1.,  1.],
            [ 2.,  1.],
            [ 3.,  1.]])
      
        >>>m,c=np.linalg.lstsq(A,y)[0]#m,c即为该线性函数的系数
  • 相关阅读:
    Max关闭WPF
    InstallShield安装过程介绍
    InstallShield相关资料整理
    .net reflection的一点研究
    (转)VMware增加磁盘容量方法
    领域驱动设计《读书笔记》
    《领域驱动设计C#2008实现》读书笔记
    深入研究c++对象模型
    <转载>com之包容聚合
    基于插件开发的架构研究
  • 原文地址:https://www.cnblogs.com/mengnan/p/9307636.html
Copyright © 2011-2022 走看看