我正在尝试制作简单的线性回归函数,但继续遇到
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行上出错。这是一本教科书线性回归函数,我似乎无法弄清楚为什么它会失败。
什么是奇异矩阵误差?
答案 0 :(得分:17)
如另一个答案中所解释的那样linalg.solve
需要一个完整的秩矩阵。这是因为它试图解决矩阵方程而不是线性回归,这应该适用于所有等级。
有几种线性回归方法。我建议最简单的方法是标准最小二乘法。只需使用numpy.linalg.lstsq
代替。包含示例的文档是here。
答案 1 :(得分: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.])
现在,我将更改a
以使其成为单数。
>>> a = np.array([[2,4], [1,2]])
>>> x = np.linalg.solve(a, b)
...
LinAlgError: Singular matrix
这是一个非常明显的例子,因为第一行只是第二行的两倍,但希望你明白这一点。