使用Python的numpy进行线性回归

8

我正在尝试制作一个简单的线性回归函数,但仍然遇到一个

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

我使用我的测试数据输出到控制台的结果为:

In makeLLS:
    Shape trainInput1: (773, 10)
    Shape trainTargetData: (773, 1)
    Shape term1: (10, 10)
    Shape term2: (10, 1)

然后程序在linalg.solve这一行出现了错误。这是一个经典的线性回归函数,但我似乎无法找出它失败的原因。

“奇异矩阵错误”是什么意思?


1
你也可以使用 np.polyfit(x, y, 1) - naught101
2个回答

19

如其他答案所解释的那样,linalg.solve需要一个满秩矩阵。这是因为它尝试解决矩阵方程而不是进行线性回归,后者应适用于所有等级。

线性回归有几种方法。我建议使用最简单的标准最小二乘法。只需使用numpy.linalg.lstsq即可。文档包括示例在内可以在此处找到。


8

奇异矩阵的行列式为零,这意味着您的矩阵具有不是线性无关的行。例如,如果其中一行与其他行不是线性无关的,则可以通过其他行的线性组合构造它。我将使用numpy的linalg.solve示例进行演示。这是文档中的示例:

>>> 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.])

现在,我将改变a使其成为单数形式。
>>> a = np.array([[2,4], [1,2]])
>>> x = np.linalg.solve(a, b)
...
LinAlgError: Singular matrix

这是一个非常明显的例子,因为第一行只是第二行的两倍,但希望你能理解重点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接