python - 使用 scikit-learn 的线性判别分析类时 lapack 函数的 SVD 计算错误

标签 python scipy lapack svd intel-mkl

我正在使用 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 upondgesdd 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/

相关文章:

python - 支持向量机;训练数据不包含目标

python - 如何使用正则表达式中的变量来计算平均值

python - Selenium webdriver find_element_by_xpath 需要时间

python - 显示numpy数组由rgb(255,255,255)组成作为图像,为什么它输出纯黑色而不是纯白色?

python-3.x - 在 debian sid 上安装 pymc 时出错

c++ - 由于 LAPACK,使用 OpenMP 的程序速度较慢

python - 将 Excel.Writer 文件保存到新路径时出现问题

python - Python中scipy/numpy中的exp溢出?

python - Matlab 稀疏函数与稀疏函数Python Scipy.sparse 库

linux - 在 linux 上链接 clapack