You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:47:40