实现最小二乘的问题——求矩阵的逆

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

β即是我们模型训练获得的系数。但是这里有个问题即是涉及到了矩阵求逆,这就要求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即为该线性函数的系数
    
posted @ 2018-07-13 23:00  冬色  阅读(2347)  评论(0编辑  收藏  举报