我正在创建的机器学习管道中使用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 upon,dgesdd 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的屏幕截图
2条答案
按热度按时间nbnkbykc1#
这是DGESDD的定义:
您遇到的错误表明,传递给例程的MKL实现的第10个参数LDVT(
V**T
矩阵的前导维)的值不符合所述路由的预期。这可能是英特尔实现中的一个bug,可能性很小,假设有一个电池在测试压力测试这个例程,但也不是不可能。这是MKL的哪个版本?或者是LDA代码中的bug,可能性很小:
请打印M、N、LDA、LDU和LDVT,好吗?
如果正确设置LDVT,工作空间分析将正常运行。
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