我正在使用 scikit-learn 的 LDA 对 2 类一维数据进行分类我创建的机器学习管道中的分类器。发生以下异常:
ValueError: Internal work array size computation failed: -10
在下面一行:
LinearDiscriminantAnalysis.fit(X,y)
其中 X = [-5e15, -5e15, -5e15, 5.7e16] 且 y = [0, 0, 0, 1],均为 float64 数据类型
此外,控制台还打印了以下错误:
Intel MKL ERROR: Parameter 10 was incorrect on entry to DGESDD
经过 Google 快速搜索,dgesdd 是 LAPACK 中的一个函数。哪个 scikit-learn relies upon 。 dgesdd documentation告诉我们该函数计算 singular value decomposition (SVD) 实数 M×N 矩阵 A。
回到最初的异常,我发现它是在 scipy.linalg.lapack.py 中引发的。在 _compute_lwork 函数中。该函数接受一个函数作为输入,在本例中我认为该函数是 dgesdd 函数。 dgesdd 文档页面上的 CTRL-F "-10"给出了此错误代码背后的逻辑,但我不了解 Fortran,所以我不太确定它的含义。
我敢打赌,SVD 计算会失败,因为 (1) X 数组中的值很大,或者 (2) X 数组中的 3 个值是完全相同的数字。
我将继续阅读 SVD 及其局限性。任何有关如何避免此错误的见解将不胜感激。
这是 error 的屏幕截图
最佳答案
这是 DGESDD 的定义:
subroutine dgesdd (JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
您遇到的错误表明,传递给第 10 个参数 LDVT(V**T
矩阵的前导维度)例程的 MKL 实现的值不符合要求期望所述路由。
这可能是英特尔实现中的一个错误,不太可能,假设有一个电池来测试压力测试这个例程,但并非不可能。这是哪个版本的 MKL?或者这是 LDA 代码中的错误,很可能:
LDVT is INTEGER
The leading dimension of the array VT. LDVT >= 1;
if JOBZ = 'A' or JOBZ = 'O' and M >= N, LDVT >= N;
if JOBZ = 'S', LDVT >= min(M,N).
请打印 M、N、LDA、LDU 和 LDVT 吗?
如果正确设置 LDVT,工作区分析将运行良好。
关于python - 使用 scikit-learn 的线性判别分析类时 lapack 函数的 SVD 计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54600809/