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

调用SciPy的stats.linregress做线性回归报维度匹配错误怎么办

错误原因

scipy.stats.linregress 仅支持单自变量的简单线性回归,要求输入的x为一维数组,你传入的x是包含11个特征的二维数组(shape为(100,11)),不符合接口的输入要求,因此触发维度匹配错误。而np.linalg.lstsq和sklearn.linear_model.LinearRegression原生支持多变量线性回归,所以相同输入可以正常运行。

可行解决方案

你需要选择适配多变量线性回归的方案来获取权重及对应统计量,可选方案如下:

方案1:基于Scipy底层接口手动计算统计量

如果你希望仅用Scipy完成需求,可以结合scipy.linalg.lstsq和Scipy的统计分布接口自行计算各权重的统计量,代码示例如下:

import numpy as np
from scipy import linalg, stats

# 准备输入数据
X = x.to_numpy()
# 若需要拟合截距项,执行下方代码,不需要可跳过
X = np.hstack([np.ones((X.shape[0], 1)), X])
y = y_copy

# 求解最小二乘权重
coef, residues, rank, _ = linalg.lstsq(X, y)

# 计算各权重对应的统计量
n_samples = X.shape[0]
# 残差自由度
df = n_samples - rank
# 残差均方
mse = residues / df
# 系数协方差矩阵
cov_mat = mse * linalg.inv(X.T @ X)
# 系数标准误
std_err = np.sqrt(np.diag(cov_mat))
# t统计量
t_vals = coef / std_err
# 双尾p值
p_vals = 2 * stats.t.sf(np.abs(t_vals), df)

# 打印结果,第一个值对应截距项的统计量,后续11个值对应11个特征的统计量
for idx in range(len(coef)):
    print(f"项{idx}: 权重={coef[idx]:.4f}, 标准误={std_err[idx]:.4f}, t值={t_vals[idx]:.4f}, p值={p_vals[idx]:.4f}")

方案2:使用Statsmodels直接输出完整统计结果(更简便)

Statsmodels是专门用于统计建模的Python库,支持直接输出多变量线性回归的所有统计指标,调用方式更简单,代码示例如下:

import statsmodels.api as sm

# 增加截距项(不需要的话可跳过该步骤)
X_with_const = sm.add_constant(x)
# 拟合模型
model = sm.OLS(y, X_with_const).fit()

# 输出完整统计报告
print(model.summary())
# 单独提取所需指标
print("各特征权重:", model.params)
print("权重标准误:", model.bse)
print("权重p值:", model.pvalues)
print("权重t值:", model.tvalues)

方案3:逐个特征做单变量回归(仅适合单变量分析场景)

如果你确实需要用scipy.stats.linregress接口,可以逐个取出x的单列特征和y做回归,但注意该方法得到的是单变量回归的权重,和多变量回归控制其他变量得到的权重结果完全不同,仅适合单变量分析场景:

for col_name in x.columns:
    res = stats.linregress(x[col_name], y)
    print(f"特征{col_name}: 权重={res.slope:.4f}, p值={res.pvalue:.4f}, 标准误={res.stderr:.4f}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:06:04