0

我正在尝试找出多元线性回归中的回归系数。我为此使用了 numpy 模块。我有依赖和独立的值。我尝试过的内容如下

import numpy as np
y = [5.4,6.3,6.5,6.2,8.1,7.9,6.7,6.8,4.9,5.8]
X = [[0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0], [1.0, 1.0, 0.0, 1.0, 1.0, 1.0,   1.0, 1.0, 0.0, 1.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0], [1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0], [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], [0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0], [1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0], [1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]

b = y * X.T * np.linalg.inv(X*X.T)
print(b)

但它给出了一个错误,比如

Traceback (most recent call last):
File "C:/Python27/proj/new5.py", line 14, in <module>
b = y * X.T * np.linalg.inv(X*X.T)
AttributeError: 'list' object has no attribute 'T'

请帮我这样做。

4

2 回答 2

1

数组不能这样初始化。

你应该使用 np.array

y = np.array([5.4,6.3,6.5,6.2,8.1,7.9,6.7,6.8,4.9,5.8])

那么 T 属性将在那里。

对于 numpy 数组,您不能使用 * 进行乘法,因为 * 用于逐元素乘法。

如果要与矩阵相乘,例如 y * XT 应写为 y.dot(XT)

阅读此页面,了解 numpy 中数组和矩阵的使用差异。

http://www.scipy.org/NumPy_for_Matlab_Users#head-e9a492daa18afcd86e84e07cd2824a9b1b651935

==================================================== ===

因此,您可以使用伪逆获得最佳解决方案:

如果 X^T 的 svd 是:

X^T = U*S*V^T ([compact svd][1])

然后:

b = V*S^-1*U^T*y

这里 b 和 y 都是列向量。

如果您希望它们成为行向量,则只需在两侧进行转置即可。

于 2013-02-28T04:00:36.503 回答
0

试试这个:

y = np.matrix([[1,2,3,4,3,4,5,4,5,5,4,5,4,5,4,5,6,5,4,5,4,3,4]])

x = np.matrix([
     [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
     [4,2,3,4,5,4,5,6,7,4,8,9,8,8,6,6,5,5,5,5,5,5,5],
     [4,1,2,3,4,5,6,7,5,8,7,8,7,8,7,8,7,7,7,7,7,6,5],
     [4,1,2,5,6,7,8,9,7,8,7,8,7,7,7,7,7,7,6,6,4,4,4]
     ])

b = y * x.T * np.linalg.inv(x*x.T)

结果:

>>> b
matrix([[ 1.57044377, -0.0617812 ,  0.23596693,  0.24238522]])

我尝试将上述内容应用于您的数据,但出现奇异矩阵错误:

    raise LinAlgError, 'Singular matrix'
numpy.linalg.linalg.LinAlgError: Singular matrix

所以看起来你的一些变量X是完全相关的。

于 2013-02-28T04:34:33.030 回答