Python numpy的线性回归

Jon*_*han 7 python numpy linear-regression

我试图做一个简单的线性回归函数,但继续遇到一个

numpy.linalg.linalg.LinAlgError:奇异矩阵错误

现有功能(带调试打印):

def makeLLS(inputData, targetData):
    print "In makeLLS:"
    print "    Shape inputData:",inputData.shape
    print "    Shape targetData:",targetData.shape
    term1 = np.dot(inputData.T, inputData)
    term2 = np.dot(inputData.T, targetData)
    print "    Shape term1:",term1.shape
    print "    Shape term2:",term2.shape
    #print term1
    #print term2
    result = np.linalg.solve(term1, term2)
    return result
Run Code Online (Sandbox Code Playgroud)

使用我的测试数据输出到控制台是:

In makeLLS:
    Shape trainInput1: (773, 10)
    Shape trainTargetData: (773, 1)
    Shape term1: (10, 10)
    Shape term2: (10, 1)
Run Code Online (Sandbox Code Playgroud)

然后它在linalg.solve线上出错.这是一本教科书线性回归函数,我似乎无法弄清楚为什么它会失败.

什么是奇异矩阵误差?

Muh*_*uri 17

正如在另一个答案中解释的那样,linalg.solve期望一个满秩矩阵.这是因为它试图解决矩阵方程而不是线性回归,这应该适用于所有等级.

线性回归有几种方法.我建议最简单的方法是标准最小二乘法.只需使用numpy.linalg.lstsq.包含示例的文档就在这里.


Jus*_*eel 8

奇异矩阵是行列式为零的矩阵.这表明您的矩阵具有非线性独立的行.例如,如果其中一行不是线性独立于其他行,那么它可以通过其他行的线性组合来构造.我将使用numpy的linalg.solve示例来演示.这是doc的例子:

>>> import numpy as np
>>> a = np.array([[3,1], [1,2]])
>>> b = np.array([9,8])
>>> x = np.linalg.solve(a, b)
>>> x
array([ 2.,  3.])
Run Code Online (Sandbox Code Playgroud)

现在,我将a改为使它变得奇异.

>>> a = np.array([[2,4], [1,2]])
>>> x = np.linalg.solve(a, b)
...
LinAlgError: Singular matrix
Run Code Online (Sandbox Code Playgroud)

这是一个非常明显的例子,因为第一行只是第二行的两倍,但希望你明白这一点.