Python 使用scikit learn';时,lapack函数的SVD计算错误;s线性判别分析类

Python 使用scikit learn';时,lapack函数的SVD计算错误;s线性判别分析类,python,scipy,lapack,svd,intel-mkl,Python,Scipy,Lapack,Svd,Intel Mkl,在我创建的机器学习管道中,我正在使用scikit learn的分类器对2类、1-D数据进行分类。发生以下异常: ValueError:内部工作数组大小计算失败:-10 在以下行: 线性微分分析拟合(X,y) 其中X=[-5e15,-5e15,-5e15,5.7e16]和y=[0,0,0,1],都是浮点64数据类型 此外,控制台上还打印了以下错误: 英特尔MKL错误:进入SDD时参数10不正确 在快速的谷歌搜索之后,dgesdd是scikit学习的一个功能。该函数告诉我们,该函数计算实M×N矩阵a

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

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

在以下行:

线性微分分析拟合(X,y)

其中X=[-5e15,-5e15,-5e15,5.7e16]和y=[0,0,0,1],都是浮点64数据类型

此外,控制台上还打印了以下错误:

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

在快速的谷歌搜索之后,dgesdd是scikit学习的一个功能。该函数告诉我们,该函数计算实M×N矩阵a的(SVD)

回到最初的异常,我发现它是在_compute_lwork函数中引发的。此功能将一个功能作为输入,在本例中,我认为这是dgesdd功能。SDD文档页面上的CTRL-F“-10”给出了此错误代码背后的逻辑,但我不懂Fortran,因此我不确定它的确切含义

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

我将继续阅读SVD及其局限性。任何关于如何避免这一错误的见解都将受到极大的赞赏


以下是

的屏幕截图这是SDD的定义:

subroutine  dgesdd (JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
您所遇到的错误表明,传递给MKL的第10个参数LDVT例程实现的值,
V**T
矩阵的前导维度不符合所述路由的经验

这可能是Intels实现中的一个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,工作区分析将正常运行

这是SDD的定义:

subroutine  dgesdd (JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
您所遇到的错误表明,传递给MKL的第10个参数LDVT例程实现的值,
V**T
矩阵的前导维度不符合所述路由的经验

这可能是Intels实现中的一个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,工作区分析将正常运行

关于英特尔MKL错误:输入SDD问题时,参数10不正确。实际上,该问题已在MKL v.2018 u4(2018年9月)中修复。这是你的电话号码。 通过将env变量MKL_VERBOSE=1设置为系统环境,并查看包含此类信息的输出,可以更容易地检查所使用的MKL的版本。 E.x: MKL_详细英特尔(R)MKL 2019.0更新2产品版本20190118,适用于支持英特尔(R)64体系结构的英特尔(R)高级矢量扩展(英特尔(R)AVX)处理器,Lnx 2.80GHz lp64英特尔_线程
MKL_详细ZGETRF(85,85,0x13e66f0,85,0x13e1080,0)6.18ms CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:20关于英特尔MKL错误:进入SDD问题时参数10不正确。实际上,该问题已在MKL v.2018 u4(2018年9月)中修复。这是你的电话号码。 通过将env变量MKL_VERBOSE=1设置为系统环境,并查看包含此类信息的输出,可以更容易地检查所使用的MKL的版本。 E.x: MKL_详细英特尔(R)MKL 2019.0更新2产品版本20190118,适用于支持英特尔(R)64体系结构的英特尔(R)高级矢量扩展(英特尔(R)AVX)处理器,Lnx 2.80GHz lp64英特尔_线程
MKL_VERBOSE ZGETF(85,85,0x13e66f0,85,0x13e1080,0)6.18ms CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:20能否请您提供一个失败的示例。最近,由于过时的BLAS程序,人们开始出现scipy问题。然而,它与OpenBLAS有关,而不是MKL。我很抱歉,但你所说的“示例”具体是什么意思?我已经在我的帖子中添加了一个截图,显示了我收到的错误。我的意思是,有一段代码可以很容易地复制粘贴,并给出完全相同的错误,这是很好的。此外,了解您所处的环境(库版本等)也很好。请提供一个失败的示例。最近,由于过时的BLAS程序,人们开始出现scipy问题。然而,它与OpenBLAS有关,而不是MKL。我很抱歉,但你所说的“示例”具体是什么意思?我已经在我的帖子中添加了一个截图,显示了我收到的错误。我的意思是,有一段代码可以很容易地复制粘贴,并给出完全相同的错误,这是很好的。此外,最好了解您的环境(库版本等)>这是哪个版本的MKL?version=2019.1感谢您的解释,Kaveh,我非常感谢您的帮助!但是,我不确定如何打印这些值,这些值来自Python。我的一个想法是转到scipy.linalg.lapack.py文件(在原始帖子中链接),然后在调用DGESDD的行之后,我认为是:wi=routine(*args,**kwargs),我可以打印*args和**kwargs以获得您请求的值。可能还需要编译该.py源文件。您对这种方法有何看法?上述方法与版本无关。这是一个标准,每个供应商/开源项目都必须以相同的方式实现上述接口。了解该功能的功能是什么将非常有帮助。你有源代码,对吗?用额外的输出重新构建它