LDA计算Q残差与Hotelling's T统计量numpy减法广播报错如何解决
报错修复方案
你遇到的维度不匹配报错核心是两处逻辑错误:
- 载荷矩阵构造错误:不能将LDA得分矩阵的转置作为载荷矩阵使用,sklearn中拟合完成的LDA模型,载荷矩阵存储在
scalings_属性中,维度为(特征数, 判别分量数),对应你的场景是(7, 2)(假设为3分类任务,保留2个判别分量)。 - 硬编码维度错误:代码中写死
reshape(2,50)的操作完全不符合你的输入维度,你的特征数为7而非50,该操作会直接导致重构后的矩阵维度和原输入不匹配。
修改后的核心代码如下:
第一步:修正变量定义
lda_f = lda.fit(X_std, y_Cat) LDA_scores = lda_f.transform(X_std) # 维度 (50, 2):50个样本,每个样本对应2个判别分量的得分 LDA_loading = lda_f.scalings_ # 维度 (7, 2):7个特征,每个特征对应2个分量的载荷,这是正确的载荷矩阵 eigenvalues = lda_f.explained_variance_ratio_
第二步:修正Q残差计算逻辑
# 重构样本矩阵:得分矩阵 @ 载荷矩阵的转置,得到和原输入同维度的重构结果 X_reconstruct = LDA_scores @ LDA_loading.T # 维度计算:(50,2) @ (2,7) = (50,7),和X_std维度完全匹配 Q_err = X_std - X_reconstruct Q_res = np.sum(Q_err ** 2, axis=1)
修改后矩阵减法的维度完全匹配,不会再报广播错误。
Q残差和Hotelling's T²统计量的输入要求
Q残差
Q残差衡量样本在判别分量正交空间的投影大小,用于检测离群样本,输入要求:
- 原标准化特征矩阵:维度
(样本数n, 特征数m) - LDA判别得分矩阵:维度
(n, 判别分量数k),k最大为类别数-1 - LDA载荷矩阵:维度
(m, k)
Hotelling's T²统计量
T²衡量样本在判别分量张成空间内的偏离程度,计算方式如下:
# 因LDA判别分量天然正交,直接用特征值标准化后求和即可 T2 = np.sum((LDA_scores ** 2) / eigenvalues, axis=1)
输入要求:
- LDA判别得分矩阵:维度
(n, k) - 各判别分量的特征值:长度为k的一维数组
注:你原有代码中贡献计算部分的多次单位矩阵乘法属于冗余操作,单位矩阵和任意矩阵相乘都等于原矩阵,可直接删除相关逻辑降低出错概率。
内容的提问来源于stack exchange,提问作者WDpad159
相关产品推荐
相关产品推荐

