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

为何分段运行线性回归代码正常,封装为函数却报Singular matrix错误?

问题原因及解决办法

核心原因

你在分段运行代码时,已经执行了X = np.column_stack([ones, X]),把偏置项(全1列)添加到了X中。但调用train_linear_regression函数时,传入的是这个已经加过偏置项的X,而函数内部又再次执行了X = np.column_stack([ones, X])——这会导致特征矩阵中出现两列完全相同的全1向量,特征列线性相关,进而使得XTX成为奇异矩阵(行列式为0),无法求逆,触发LinAlgError。

验证说明

分段代码执行后,X的维度是(9,4)(1列偏置+3列原始特征);函数内部再次添加ones后,X变成(9,5),前两列都是全1,线性相关,此时XTX的秩小于列数,矩阵不可逆。

解决办法

办法1:传入原始未处理的X(推荐)

恢复X为最初的3列特征数组,再调用函数:

# 原始特征数据(未添加偏置项)
X= [
    [148, 24,1385],
    [132,25,2031],
    [453,11,86],
    [158,24,185],
    [172,25,201],
    [413,11,86],
    [38,54,185],
    [142,25,431],
    [453,31,86]
]
X = np.array(X)

y = [10000,20000,15000,20050,10000,20000,15000,25000,12000]

def train_linear_regression(X, y):
    ones = np.ones(X.shape[0])
    X = np.column_stack([ones, X])

    XTX = X.T.dot(X)
    XTX_inv = np.linalg.inv(XTX)
    w = XTX_inv.dot(X.T).dot(y)
    
    return w[0], w[1:]

w0, w = train_linear_regression(X, y)
print(w0, w)
# 输出:25844.754055766753 array([ -16.08906468, -199.47254894,   -1.22802883])

办法2:修改函数,去掉内部添加偏置项的逻辑

如果要传入已经处理好的含偏置项的X,修改函数如下:

def train_linear_regression(X, y):
    # 不再添加ones,假设X已经包含偏置项
    XTX = X.T.dot(X)
    XTX_inv = np.linalg.inv(XTX)
    w = XTX_inv.dot(X.T).dot(y)
    
    return w[0], w[1:]

# 此时X是已经添加过偏置项的(9,4)数组
w0, w = train_linear_regression(X, y)
print(w0, w)

内容的提问来源于stack exchange,提问作者Gregory Morris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:31:26