我正在使用scikit-learn的LDA分类器在我创建的机器学习管道中对2类一维数据进行分类。发生以下异常:
ValueError:内部工作数组大小计算失败:-10
在以下行:
LinearDiscriminantAnalysis.fit(X,y)
其中X = [-5e15,-5e15,-5e15、5.7e16],y = [0、0、0、1],均为float64数据类型
此外,以下错误已打印到控制台:
Intel MKL错误:输入DGESDD时参数10不正确
在Google进行快速搜索之后,dgesdd是LAPACK中的一个函数,可通过cikit学习relies upon。 dgesdd documentation告诉我们该函数计算的是真正的M×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
的屏幕截图答案 0 :(得分:0)
这是DGESDD的定义:
subroutine dgesdd (JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
您遇到的错误表明,传递给MKL的第十个参数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,则工作区分析将很好地运行。
答案 1 :(得分:0)
关于Intel MKL错误:输入DGESDD问题时参数10不正确。实际上,此问题已在MKL v.2018 u4(2018年9月)中得到修复。这是link to MKL 2018 bug fix list。 通过将env变量MKL_VERBOSE = 1设置为系统环境,然后查看包含此类信息的输出,可能会更容易检查所使用的MKL的版本。 E.x: MKL_VERBOSE英特尔(R)MKL 2019.0 Update 2适用于英特尔(R)64架构的产品版本20190118英特尔(R)高级矢量扩展(Intel(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