scipy 当使用scikit-learn的线性判别分析类时,lapack函数的SVD计算误差

nvbavucw  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(121)

我正在创建的机器学习管道中使用scikit-learn的LDA分类器对2类一维数据进行分类,发生了以下异常:
ValueError:内部工作数组大小计算失败:-10
在以下行中:
LinearDiscriminantAnalysis.fitX,y)
其中X = [-5e15,-5e15,-5e15,-5e15,5.7e16]且y = [0,0,0,1],两者都是浮点64数据类型
此外,以下错误被打印到控制台:
英特尔® MKL错误:输入DGESDD时参数10不正确
在谷歌上快速搜索一下,dgesdd是LAPACK中的一个函数,scikit-learn是relies upondgesdd documentation告诉我们这个函数计算一个真实的M × N矩阵A的singular value decomposition(SVD)。
回到最初的异常,我发现它是在scipy.linalg.lapack.py的_compute_lwork函数中引发的。这个函数接受一个函数作为输入,在这个例子中我相信是dgesdd函数。dgesdd文档页上的CTRL-F“-10”给出了这个错误代码背后的逻辑,但是我不知道Fortran,所以我不确定它到底是什么意思。
我敢打赌,SVD计算失败的原因可能是(1)X数组中的值过大,或者(2)X数组中的3个值是完全相同的数字。
我将继续阅读SVD及其局限性。任何关于如何避免这种错误的见解都将非常感激。
这是error的屏幕截图

nbnkbykc

nbnkbykc1#

这是DGESDD的定义:

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

您遇到的错误表明,传递给例程的MKL实现的第10个参数LDVT(V**T矩阵的前导维)的值不符合所述路由的预期。
这可能是英特尔实现中的一个bug,可能性很小,假设有一个电池在测试压力测试这个例程,但也不是不可能。这是MKL的哪个版本?或者是LDA代码中的bug,可能性很小:

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,工作空间分析将正常运行。

zbdgwd5y

zbdgwd5y2#

关于英特尔MKL错误:参数10在进入DGESDD问题时不正确。实际上,这个问题已在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.80 GHz lp64英特尔线程MKL_VERBOSE ZGETRF(85,85,0x13e66f0,85,0x13e1080,0)6.18毫秒CNR:OFF动态:1快速MM:1 TID:0 NThr:20

相关问题