Numpy矩阵的最小二乘回归

时间:2012-07-10 15:42:36

标签: python numpy regression linear

如果在我无法找到的某个地方找到了答案,请随时发表论文。

我希望在N-1矩阵中计算N×M矩阵和一组已知的地面实数解的最小二乘线性回归。从那里,我想得到每个回归的斜率,截距和剩余价值。基本的想法是,我知道应该为N行中的每个样本预测其实际值,并且我想确定使用残差在M列中哪组预测值最准确。

我没有很好地描述矩阵,所以这是一张图:

(N,M) matrix with predicted values for each row N
 in each column of M...

##NOTE: Values of M and N are not actually 4 and 3, just examples
   4 columns in "M"
  [1, 1.1, 0.8, 1.3]
  [2, 1.9, 2.2, 1.7]  3 rows in "N"
  [3, 3.1, 2.8, 3.3]


(1,N) matrix with actual values of N


  [1]
  [2]   Actual value of each sample N, in a single column
  [3]  

因此,为了清楚起见,我想要计算(N,M)矩阵和(1,N)矩阵的每一列之间的lstsq回归。

例如,

之间的回归
[1]   and [1]
[2]       [2]
[3]       [3]

然后回归

[1]   and  [1.1]
[2]        [1.9]
[3]        [3.1]

等,输出计算的每个回归的斜率,截距和标准误差(平均残差)。

到目前为止,在numpy / scipy文档和'net'周围,我只找到了一次计算一列的示例。我曾经认为numpy能够使用标准

计算集合中每列的回归
np.linalg.lstsq(arrayA,arrayB)

但是返回错误

ValueError: array dimensions must agree except for d_0

我是否需要将列拆分为自己的数组,然后一次计算一个? 我需要使用参数或矩阵运算来让numpy独立计算每列的回归吗?

我觉得它应该更简单?我看了一遍,我似乎找不到任何人做类似的事情。

2 个答案:

答案 0 :(得分:1)

也许你换了A和b?

以下为我效劳:

A=np.random.rand(4)+np.arange(3)[:,None]
# A is now a (3,4) array
b=np.arange(3)
np.linalg.lstsq(A,b)

答案 1 :(得分:0)

arrayB的第0维必须与arrayA的第0维相同(参考:np.linalg.lstsq的官方文档)。您需要维度为(N, M) and (N, 1)(N, M) and (N)的矩阵,而不是您现在使用的(N,M) and (1,N)矩阵。

请注意,(N, 1)N维矩阵会得到相同的结果 - 但数组的形状会有所不同。

我得到了一个稍微不同的例外,但这可能是由于不同的版本(我在Windows上使用Python 2.7,Numpy 1.6):

>>> A = np.arange(12).reshape(3, 4)
>>> b = np.arange(3).reshape(1, 3)

>>> np.linalg.lstsq(A,b)
# This gives "LinAlgError: Incompatible dimensions" exception

>>> np.linalg.lstsq(A,b.T)
# This works, note that I am using the transpose of b here