使用scikit-learn LDA时LAPACK DGESDD函数SVD计算报错求助
解决LDA.fit()报错ValueError与MKL DGESDD错误的方案
这个报错的根源是你的数据存在两个关键问题:极端悬殊的数值量级和其中一类样本完全重复导致类内方差为0,两者共同引发了LAPACK库中奇异值分解(SVD)计算的数值不稳定,进而触发MKL的参数错误。下面是具体的解决思路和代码示例:
1. 对数据进行标准化/缩放
你的数据中两类样本的数值量级差了100多倍(-5e15 vs 5.7e16),这种极端差异会导致协方差计算时出现数值溢出,进而让SVD函数的工作空间计算出错。通过标准化将数据映射到均值为0、方差为1的范围,能有效避免这类数值问题:
from sklearn.preprocessing import StandardScaler from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # 注意:sklearn要求输入X是二维数组(样本数×特征数),需调整原始数据格式 X = [[-5e15], [-5e15], [-5e15], [5.7e16]] y = [0, 0, 0, 1] # 标准化处理 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 重新训练LDA lda = LinearDiscriminantAnalysis() lda.fit(X_scaled, y)
如果数据中存在更多极端值,也可以尝试RobustScaler(基于中位数和四分位数缩放,对异常值更鲁棒)替代StandardScaler。
2. 处理类内方差为0的样本
第一类的3个样本完全相同,导致该类的协方差矩阵(一维场景下就是方差)为0,这会让LDA计算中需要的协方差逆矩阵不存在,进而触发SVD的异常。你可以给重复样本添加微小的随机噪声,让类内产生微小方差:
import numpy as np from sklearn.discriminant_analysis import LinearDiscriminantAnalysis X = np.array([[-5e15], [-5e15], [-5e15], [5.7e16]], dtype=np.float64) y = [0, 0, 0, 1] # 给重复的第一类样本添加微小噪声(量级远小于原始数据,避免影响分类逻辑) noise = np.random.normal(0, 1e-10, size=(3, 1)) X[:3] += noise # 训练LDA lda = LinearDiscriminantAnalysis() lda.fit(X, y)
3. 使用LDA的shrinkage正则化参数
sklearn的LinearDiscriminantAnalysis提供了shrinkage参数,通过正则化让奇异的协方差矩阵变得可逆,从而绕过SVD计算的数值问题。设置shrinkage='auto'时,模型会自动选择最优的正则化强度:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis X = [[-5e15], [-5e15], [-5e15], [5.7e16]] y = [0, 0, 0, 1] lda = LinearDiscriminantAnalysis(shrinkage='auto') lda.fit(X, y)
你也可以手动指定一个0到1之间的shrinkage值,比如shrinkage=0.1,来调整正则化强度。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

