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

问题描述 投票:1回答:2

我正在使用scikit-learn的LDA分类器在我创建的机器学习管道中对2级1-D数据进行分类。发生以下异常:

ValueError:内部工作数组大小计算失败:-10

在以下行:

LinearDiscriminantAnalysis.fit(X,Y)

其中X = [-5e15,-5e15,-5e15,5.7e16]和y = [0,0,0,1],两者都是float64数据类型

此外,以下错误已打印到控制台:

英特尔MKL错误:进入DGESDD时参数10不正确

经过快速谷歌搜索,dgesdd是LAPACK中的一个功能,它可以学习relies upondgesdd documentation告诉我们该函数计算真实M-by-N矩阵A的singular value decomposition(SVD)。

回到最初的异常,我发现它是在_compute_lwork函数的scipy.linalg.lapack.py中引发的。这个函数将一个函数作为输入,在这种情况下我认为是dgesdd函数。 dgesdd文档页面上的CTRL-F“-10”给出了这个错误代码背后的逻辑,但我不知道Fortran,所以我不确定它的含义。

我想打赌SVD计算失败是由于(1)X数组中的大值,或(2)X数组中的3个值是完全相同的数字。

我将继续阅读SVD及其局限性。任何有关如何避免此错误的见解都将非常受欢迎。

这是error的截图

python scipy lapack svd intel-mkl
2个回答
0
投票

这是DGESDD的定义:

subroutine  dgesdd (JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)

您所拥有的错误表示传递给MKL的第10个参数例程LDVT的实现的值,V**T矩阵的前导维度不符合所述路由的预期。

这可能是英特尔实施中的一个错误,相当不太可能,假设测试压力测试这个例程有电池,但并非不可能。这是哪个版本的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,工作区分析将运行正常。


0
投票

关于英特尔MKL错误:进入DGESDD问题时参数10不正确。实际上这个问题已经在MKL v.2018 u4(2018年9月)中得到修复。这是link to MKL 2018 bug fix list。通过将env变量MKL_VERBOSE = 1设置为系统环境,您可以更轻松地检查所使用的MKL版本,并查看包含此类信息的输出。例如:MKL_VERBOSE英特尔(R)MKL 2019.0更新2产品版本20190118,用于英特尔(R)64架构英特尔(R)高级矢量扩展(支持英特尔(R)AVX)处理器,Lnx 2.80GHz lp64 intel_thread MKL_VERBOSE ZGETRF(85,85, 0x13e66f0,85,0x13e1080,0)6.18ms CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:20

© www.soinside.com 2019 - 2024. All rights reserved.