繁体   English   中英

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

[英]SVD calculation error from lapack function when using scikit-learn's Linear Discriminant Analysis class

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

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

在以下行:

LinearDiscriminantAnalysis.fit(X,y)

其中X = [-5e15,-5e15,-5e15、5.7e16]和y = [0、0、0、1],均为float64数据类型

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

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

在Google快速搜索之后,dgesdd是LAPACK中的一个功能,scikit-learn 依赖 dgesdd文档告诉我们,该函数计算真实的M×N矩阵A的奇异值分解 (SVD)。

让我们再回到原来的异常,我发现它在提出scipy.linalg.lapack.py在_compute_lwork功能。 该函数将一个函数作为输入,在这种情况下,我认为是dgesdd函数。 dgesdd文档页面上的CTRL-F“ -10”提供了此错误代码背后的逻辑,但是我不知道Fortran,因此我不确定它的含义。

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

我将继续阅读SVD及其限制。 对于如何避免此错误的任何见解将不胜感激。

这是错误的屏幕截图

这是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,则工作区分析将运行良好。

关于英特尔MKL错误:进入DGESDD问题时参数10不正确。 实际上,此问题已在MKL v.2018 u4(2018年9月)中得到修复。 这是MKL 2018错误修复列表链接 通过将env变量MKL_VERBOSE = 1设置为系统环境,然后查看包含此类信息的输出,可能会更容易检查所使用的MKL的版本。 例:MKL_VERBOSE Intel MKL 2019.0 Update 2适用于Intel(R)64架构的英特尔®高级矢量扩展(Intel(AV))处理器的产品版本20190118,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM