我有很多10乘10(0,1) - 矩阵,我想确定哪个具有正好0的行列式(即哪个是奇异的)。使用scipy.linalg.det
我得到一个浮点数,我必须测试它是否接近于零。是否有可能完全进行计算,以确保我没有发现误报?
另一方面,也许有一些关于最小特征值的保证可以用来确保浮点方法永远不会产生误报?
答案 0 :(得分:3)
只要你使用花车,就不能保证你会得到零。我会用这个:
scipy.allclose(det, 0)
您可以使用kwargs控制容差。
在你的情况下(含有0,1个元素的10x10矩阵)你不必担心误报。
我没有这方面的证据,但它只是几何直觉:具有0/1元素的10矢量组不能“几乎”线性依赖于你获得一个所必需的方式使用花车误报。作为向量,如果元素在0,1中,它们的“方向”†必然是离散的/原子的。
† 想想3D案例并将你的思想概括为10维空间;)
答案 1 :(得分:3)
您可以使用高斯消元法将矩阵转换为三角形。 由于你的元素都是0或1,所以即使使用浮点运算也是精确的(你只是乘以/除/加/减-1,0和1,这是精确的)。
如果对角线的一个元素为零,则行列式为0,否则为非零。
因此,对于这种特定算法(高斯消元法),即使在浮点运算中,行列式的计算也是精确的。
这个算法也应该非常高效。它甚至可以使用整数来实现,这更快并且甚至以更明显的方式显示问题可以完全解决。
编辑:关键是,对0,1矩阵进行操作的算法可以是精确的。这取决于算法。我会检查det()是如何实现的,也许,数值噪声没有问题,事实上,你可以测试det(M)== 0.0并且既不得假阴性也不得误报。
答案 2 :(得分:1)
我认为你应该考虑检查条件数而不是行列式。在python中你想要
numpy.linalg.cond(x, p=None)
参考http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.cond.html。
这是应用数学教授对coursera course on scientific computing的建议。本质上,条件数将为您提供最佳指示,例如反转矩阵等操作的数值不稳定性,这可能是您感兴趣的内容。有关详细信息,请参阅this answer on scicomp stackexchange。
答案 3 :(得分:0)
在使用公差arg时如何测试批次,然后决定最大可接受的公差,冲洗并重复: http://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html
答案 4 :(得分:-1)
由于矩阵中的条目为1或0,因此行列式的最小非零绝对值为1.因此无需担心非常接近0的真正非零值。
或者,显然可以使用sympy来获得确切的答案。