2012-07-10 107 views
1

如果这个答案已经在我无法找到的地方回答,请随时向论坛打我一巴掌。用Numpy最小二乘回归矩阵

我在计算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)中的每一列之间的lstsq回归矩阵和(1,N)矩阵。

例如,

之间
[1] and [1] 
[2]  [2] 
[3]  [3] 

然后回归

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

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

到目前为止,在numpy/scipy文档和'网络中,我只找到一次计算一列的例子。我原以为numpy的还必须计算在一组每列回归与标准

np.linalg.lstsq(arrayA,arrayB) 

的能力,但返回错误

ValueError: array dimensions must agree except for d_0 

我需要的列拆分为自己的阵列,然后一次计算一个? 有没有一个参数或矩阵操作,我需要使用numpy计算每列独立的回归?

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

+0

你说你的矩阵是(N,M) (1,N)。 Lstsq期望(N,M)和(N),你是否尝试使用arrayB的转置?虽然(LinAlgError:不兼容的维),我得到了一个稍微不同的例外,我使用Python2.7,与numpy1.6 – Dhara 2012-07-10 17:35:04

回答

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) 
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维矩阵将给出相同的结果 - 但阵列的形状将不同。

我得到一个稍微不同的异常由你,但可能是由于不同的版本(我使用Python 2.7,numpy的1.6在Windows上):

>>> 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