Python中OLS单变量线性回归:估计系数矩阵维度异常求助
解决单变量线性回归系数矩阵维度异常的思路
嗨,我来帮你捋捋这个问题——你估计出来的beta维度是n×n而不是预期的1×1,核心问题大概率出在特征矩阵的维度构造和矩阵运算顺序上,咱们一步步拆解:
先看你代码里的关键问题点
你现在的x = np.array([x_original])会生成一个(1, 100)的行向量,但线性回归的最小二乘公式要求特征矩阵X是**(样本数n, 特征数p)**的形状,单变量场景下就是(100, 1)的列向量。行向量直接参与矩阵运算时,会导致后续的转置、乘法完全偏离预期维度。
另外你注释掉了x_transpose = x.T,但就算解开注释,行向量转置后是(100,1),如果后续运算顺序错了(比如算x @ x.T而不是x.T @ x),也会得到不符合要求的矩阵维度。
具体修正步骤
1. 修正特征矩阵x的维度
把行向量改成列向量,最简单的方式是用reshape:
import numpy as np from scipy.linalg import lstsq x_original = np.random.normal(1, 1, 100) x = x_original.reshape(-1, 1) # 转为(100, 1)的列向量,-1表示自动推导行数
2. 正确构造响应变量y
确保真实系数和噪声的维度和x匹配,避免numpy广播带来的隐性问题:
beta_true = np.array([[5]]) # 用(1,1)的矩阵存储真实系数 y = x @ beta_true + np.random.normal(0, 10, size=(100, 1)) # y是(100,1)的列向量
3. 按最小二乘公式正确计算估计系数
严格遵循公式:$\hat{\beta} = (X^T X)^{-1} X^T y$,代码实现如下:
# 计算X^T X并求逆 xtx_inv = np.linalg.inv(x.T @ x) # 计算X^T y xty = x.T @ y # 得到估计的beta beta_estimated = xtx_inv @ xty
这时候beta_estimated的维度就是(1,1),完全符合你的预期。
4. 用现成库函数验证(更省心)
如果不想手动写矩阵运算,直接用scipy的最小二乘函数,它会自动处理维度问题:
beta_estimated, _, _, _ = lstsq(x, y)
返回的beta_estimated同样是(1,1)的数组。
为什么之前会得到n×n的矩阵?
假设你之前错误地用行向量x=(1,100)计算了x.T @ x,这会得到一个(100,100)的矩阵(因为100维列向量乘100维行向量),再对这个矩阵求逆,自然就是(100,100)的结果——这就是你看到的n×n维度问题的根源。
内容的提问来源于stack exchange,提问作者Franz




