使用 Numpy 对矩阵进行最小二乘回归
Posted
技术标签:
【中文标题】使用 Numpy 对矩阵进行最小二乘回归【英文标题】:Least-Squares Regression of Matrices with Numpy 【发布时间】:2012-07-10 03:30:11 【问题描述】:我正在寻找从 N x M 矩阵和一组已知的、真实的解决方案在 N-1 矩阵中计算最小二乘线性回归。从那里,我想得到每个回归的斜率、截距和残值。基本思想是,我知道应该为 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 文档和网络中,我只发现一次计算一列的示例。我原以为 numpy 有能力使用标准计算集合中每一列的回归
np.linalg.lstsq(arrayA,arrayB)
但这会返回错误
ValueError: array dimensions must agree except for d_0
是否需要将列拆分为自己的数组,然后一次计算一个? 我需要使用参数或矩阵运算来让 numpy 独立计算每列的回归吗?
我觉得它应该更简单?我已经看了一遍,似乎找不到任何人在做类似的事情。
【问题讨论】:
你说你的矩阵是 (N,M) (1,N)。 Lstsq期望(N,M)和(N),您是否尝试使用arrayB的转置?我从你那里得到了一个稍微不同的例外(LinAlgError:不兼容的尺寸),我使用的是 Python2.7,带有 numpy1.6 【参考方案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)
【讨论】:
【参考方案2】: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
【讨论】:
以上是关于使用 Numpy 对矩阵进行最小二乘回归的主要内容,如果未能解决你的问题,请参考以下文章
numpy.polyfit()方法与Stats.linregress( ) 方法最小二乘近似拟合斜率对比分析