Python numpy 线性回归

9 投票
2 回答
40487 浏览
提问于 2025-04-16 05:24

我正在尝试制作一个简单的线性回归函数,但不断遇到一个错误:

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 这一行出错了。这是一个教科书式的线性回归函数,但我似乎无法弄明白为什么会失败。

什么是奇异矩阵错误?

2 个回答

9

一个奇异矩阵是指它的行列式为零的矩阵。这意味着这个矩阵的行之间不是线性独立的。简单来说,如果其中一行可以通过其他行的线性组合得到,那么这行就不是线性独立的。我会用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

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

20

正如其他回答中所解释的,linalg.solve 需要一个满秩的矩阵。这是因为它试图解决一个矩阵方程,而不是进行线性回归,后者可以适用于所有秩的情况。

线性回归有几种方法。我建议最简单的方法是标准的最小二乘法。你可以直接使用 numpy.linalg.lstsq。有关文档和示例可以在 这里 找到。

撰写回答