Python运行statsmodels OLS回归报shapes not aligned错误如何解决
报错根因
这个形状不匹配报错由两个代码问题直接导致:
- 自变量未正确处理:你通过拉丁超立方采样生成的4维特征存在
data变量中,调用sm.OLS()时传入的X未被正确赋值,且没有给自变量添加截距项,OLS默认不会自动拟合截距。 - 因变量维度不符合要求:你生成的
y是形状为(100,2)的二维数组,包含2个输出目标,但statsmodels的原生OLS仅支持单维因变量(形状为(n_samples,)或(n_samples,1)),传入多列y时矩阵运算无法对齐维度。
*额外注意:你代码里调用的sampler.lhs_method(100)是错误写法,scipy的QMC拉丁超立方采样接口调用方法为sampler.random(n_samples)。
修复方案
按照以下步骤调整代码即可正常运行:
- 修正采样逻辑,正确生成自变量并补充截距项
import numpy as np import statsmodels.api as sm from scipy.stats import qmc # 修正采样接口调用 sampler = qmc.LatinHypercube(d=4) u_bounds = np.array([5.0, 5.0, 10.0, 10.0]) l_bounds = np.array([0.125, 0.125, 0.1, 0.1]) data = sampler.random(100) * (u_bounds - l_bounds) + l_bounds # 保留原有因变量生成逻辑 y = np.zeros((100,2)) for i in range(np.shape(data)[0]): y[i,0], y[i,1] = objectives(data[i,0], data[i,1], data[i,2], data[i,3]) # 给自变量添加常数列,用于拟合截距 X = sm.add_constant(data)
- 拆分多列因变量,分别做单输出OLS回归
原生OLS不支持多输出,如果你需要对y的两个输出分别建模,拆分y后逐列拟合即可:
# 拟合y的第一列结果 y_col1 = y[:, 0] model1 = sm.OLS(y_col1, X).fit() pred1 = model1.predict(X) print(model1.summary()) # 拟合y的第二列结果 y_col2 = y[:, 1] model2 = sm.OLS(y_col2, X).fit() pred2 = model2.predict(X) print(model2.summary())
报错逻辑说明
OLS计算回归系数时需要做矩阵运算:$\hat{\beta} = (XTX){-1}X^Ty$,要求X的列数与y的对应维度匹配。你传入多列y且X未正确赋值时,会出现X的维度1值为2、y的维度0值为100不相等的情况,直接触发维度对齐错误。
内容的提问来源于stack exchange,提问作者Espejito
相关产品推荐
相关产品推荐

