在Python中实现线性回归权重向量公式时遭遇奇异矩阵报错
线性回归闭式解实现的问题解决
问题根源分析
- 公式理解偏差
公式里的$\widetilde{x}^{(i)}$是增广特征向量——也就是给每个样本的特征向量前添加一个值为1的偏置项,用来拟合线性回归的截距。你直接用原始特征向量计算,不仅维度不匹配,还可能因为缺少偏置项导致特征矩阵秩不足,引发奇异矩阵问题。
另外,公式中的求和操作不需要逐样本迭代,它等价于增广特征矩阵$X$(每行对应一个样本的$\widetilde{x}{(i)}$转置)的转置与自身的矩阵乘积,即$\sum_{i=1}n \widetilde{x}{(i)}[\widetilde{x}{(i)}]^T = X^T X$,直接用矩阵运算就能高效完成。
代码运算错误
你的代码里用了*运算符,这是numpy的逐元素乘法,不是公式要求的矩阵乘法。正确的矩阵乘法应该用@运算符或者np.dot()函数。而且你对x的维度处理错误,导致计算出的矩阵完全不是公式中的$X^T X$,最终出现奇异矩阵报错。奇异矩阵的本质原因
当特征矩阵存在线性相关的列(比如所有样本特征值相同、特征是其他特征的线性组合),或者样本数量小于特征数量时,$X^T X$会是奇异矩阵(行列式为0),无法直接求逆。这时候需要用伪逆来计算最小二乘意义下的最优解。
正确实现代码
import numpy as np # 示例数据:x是单特征数组,y是对应标签 x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 4, 5, 4, 5]) # 构造增广特征矩阵X:每行格式为[1, x_i],包含偏置项 X = np.c_[np.ones(len(x)), x] # 用伪逆计算闭式解,避免奇异矩阵问题 # 当矩阵非奇异时,伪逆和直接求逆结果一致 w = np.linalg.pinv(X.T @ X) @ (X.T @ y) print("拟合的权重向量(截距,斜率):", w)
补充说明
- 如果是多特征场景,只需要把x换成n×d的特征矩阵(n是样本数,d是特征数),再用
np.c_[np.ones(n), x]添加偏置项即可。 np.linalg.pinv()会计算Moore-Penrose伪逆,即使矩阵奇异也能得到最小二乘最优解,是线性回归闭式解的稳健实现方式。
内容的提问来源于stack exchange,提问作者Infomagier
相关产品推荐
相关产品推荐

