Statsmodels框架中CanCorr方法维度相关报错问题求助
解决statsmodels CanCorr的"exog is collinear"错误
这个错误的核心原因不是输入维度不匹配,而是你的输入矩阵存在多重共线性——即矩阵中某一列可被其他列线性表示,导致矩阵不满秩,而CanCorr的计算依赖满秩矩阵,因此触发报错。结合你的数据特征(700样本,34/58个非负整数特征),大概率是以下情况导致:
- 存在全0的常数列
- 有完全重复的列
- 某列是其他列的线性组合(非负整数数据容易出现这类情况)
解决步骤:
移除常数列
先过滤掉方差为0的列(全0或全相同值的列):import numpy as np # 清理矩阵a a_var = np.var(a, axis=0) a_clean = a[:, a_var != 0] # 清理矩阵b b_var = np.var(b, axis=0) b_clean = b[:, b_var != 0]剔除线性相关列
通过QR分解找出独立列,保留矩阵的满秩部分:# 处理a矩阵 q, r = np.linalg.qr(a_clean) tol = 1e-10 # 阈值可根据数据调整 independent_cols_a = np.where(np.abs(np.diag(r)) > tol)[0] a_final = a_clean[:, independent_cols_a] # 处理b矩阵 q_b, r_b = np.linalg.qr(b_clean) independent_cols_b = np.where(np.abs(np.diag(r_b)) > tol)[0] b_final = b_clean[:, independent_cols_b]数据标准化(推荐)
标准化能消除量纲影响,避免伪共线性,同时提升计算稳定性:from sklearn.preprocessing import StandardScaler scaler = StandardScaler() a_scaled = scaler.fit_transform(a_final) b_scaled = scaler.fit_transform(b_final)重新运行CanCorr
使用清理后的矩阵执行分析:from statsmodels.multivariate.cancorr import CanCorr c = CanCorr(a_scaled, b_scaled)
注意:
不要转置输入矩阵——转置后样本数远小于特征数(34样本vs700特征),必然会触发共线性错误,这是无效操作。
内容的提问来源于stack exchange,提问作者pr2
相关产品推荐
相关产品推荐

