"不兼容的尺寸"使用lstsq和Python的numpy

时间:2016-04-20 22:41:28

标签: python numpy least-squares

首先是我的代码:

import numpy as np

def square(list):
    return [i ** 2 for i in list]

def multLists(x, y):
    return x * y

def main():
    x = np.array([1.02, 0.95, 0.87, 0.77, 0.67, 0.55, 0.44, 0.30, 0.16, 0.01])
    y = np.array([0.39, 0.32, 0.27, 0.22, 0.18, 0.15, 0.13, 0.12, 0.13, 0.15])

    a = square(y)
    b = multLists(x,y)
    c = x
    d = y
    e = np.ones(len(x))
    x2 = square(x)

    Matrix = np.matrix([a,b,c,d,e])

    Output = np.linalg.lstsq(Matrix,x2)[0]
    print Output


main()

我的错误代码:

Traceback (most recent call last):
File "problem6.py", line 26, in <module>
main()
File "problem6.py", line 22, in main
Output = np.linalg.lstsq(Matrix,x2)[0]
File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 1828, in lstsq
raise LinAlgError('Incompatible dimensions')
numpy.linalg.linalg.LinAlgError: Incompatible dimensions

基本上,我试图解决Ax = b,A等于&#34;矩阵&#34;和b =&#34; x2&#34;。我然后尝试使用最小二乘来求解X,但它不起作用。但是,如果我将Matrix更改为等于:

Matrix = [[0 for x in range(5)] for x in range(10)] 

然后代码编译并正常运行(虽然显然有错误的值,因为Matrix不应该等于那个。任何想法?谢谢。

1 个答案:

答案 0 :(得分:2)

您需要转置矩阵:

Output = np.linalg.lstsq(Matrix.T, x2)[0]

您的代码损坏会产生一个包含5行10个元素的矩阵。您的工作代码生成一个包含10行5个元素的矩阵。

您可能也应该使用np.array而不是np.matrix,并返回np.array而不是square

中的列表