Numpy/Scipy pinv和pinv2的行为不同

Numpy/Scipy pinv和pinv2的行为不同,numpy,scipy,numerical-methods,matrix-inverse,Numpy,Scipy,Numerical Methods,Matrix Inverse,我正在Numpy上为极限学习机器使用二维数组。我的一个数组H是随机的,我想计算它的伪逆。 如果我使用scipy.linalg.pinv2,一切都会顺利运行。但是,如果我使用scipy.linalg.pinv,有时(30-40%的情况下)会出现问题 我之所以使用pinv2,是因为我读到(这里:)pinv2在“高”和“宽”阵列上性能更好 问题是,如果H的列j全部为1,那么pinv(H)在第j行具有巨大的系数。 这又是一个问题,因为在这种情况下,np.dot(pinv(H),Y)包含一些nan值(Y是

我正在Numpy上为极限学习机器使用二维数组。我的一个数组H是随机的,我想计算它的伪逆。 如果我使用scipy.linalg.pinv2,一切都会顺利运行。但是,如果我使用scipy.linalg.pinv,有时(30-40%的情况下)会出现问题

我之所以使用pinv2,是因为我读到(这里:)pinv2在“高”和“宽”阵列上性能更好

问题是,如果H的列j全部为1,那么pinv(H)在第j行具有巨大的系数。 这又是一个问题,因为在这种情况下,np.dot(pinv(H),Y)包含一些nan值(Y是一个小整数数组)

现在,我对线性代数和数值计算的研究还不够深入,无法理解这是一个bug还是两个函数的某些精度相关属性。我希望你回答这个问题,这样,如果是这样的话,我可以提交一份bug报告(老实说,现在我甚至不知道该写什么)

我用np.savetxt(fn,a,'.2e',';')保存了数组:请查看以查找它们

感谢您的帮助。在提供的文件中,您可以在pinv(H).csv中看到第14、33、55、56和99行具有较大的值,而在pinv2(H)中,相同的行具有更合适的值


非常感谢您的帮助。

简而言之,这两个函数实现了两种不同的方法来计算伪逆矩阵:

  • scipy.linalg.pinv使用最小二乘法,这可能需要大量计算,并且占用大量内存。

  • scipy.linalg.pinv2使用SVD(奇异值分解),在大多数情况下,它应该以较小的内存占用运行。 numpy.linalg.pinv也实现了这个方法

  • 由于这是两种不同的评估方法,因此得出的矩阵将不相同。每种方法都有各自的优缺点,如果不深入了解数据和伪逆的用途,就很难确定应该使用哪种方法。我只是建议一些尝试和错误,并使用一个给你最好的结果为您的分类器


    请注意,在某些情况下,这些函数无法收敛到解决方案,然后将引发scipy.stats.linalgeror。在这种情况下,您可以尝试使用第二个pinv实现,这将大大减少您收到的错误量。

    切换到浮点而不是整数?您能解释一下为什么这会改变结果吗?我没有查看yr数据,但如果您的值>32位整数,您可能正在将数据强制输入NaN-land。pinv和pinv2的不同行为发生在NaN出现之前。它们出现在连续的点积中。您是对的,在这一点上,一些大整数和float16之间的点可能会导致NaN,因为结果数组仍然是float16,因此无法存储大值。然而,这并不能解释为什么pinv和pinv2的结果如此不同。