gpt4 book ai didi

python - numpy 中的精度 : issues while comparing numbers

转载 作者:太空宇宙 更新时间:2023-11-03 12:41:50 24 4
gpt4 key购买 nike

先介绍一下背景。我正在寻找一个实数对称矩阵的特征值和特征向量,其中行总和为 0。更具体地说,一旦我找到一个特征向量,我就使用 $argsort$ 找到对特征值之一进行排序的排列并将排列应用于原始矩阵。

现在,我使用 numpy 包在 python 中实现了代码。代码本身是递归的,如果它在特征向量中找到一组相等的值,它会提取与我们具有相等值的索引对应的对称子矩阵,并在此矩阵上再次应用该算法。

虽然这一切都很好,而且大部分都是繁重的工作,但当一堆应该对应于特征向量中相等条目的索引没有被识别为具有相等值时,我感到很惊讶。问题是这些值是通过某种算法(可能是 Lanczos,但我对 numpy 并不完全熟悉)计算到机器精度的。这是一个示例输出,我在其中明确检查了特征向量中两个条目之间的差异:

    >>> T=spectral.seriation(A,index)

columns [ 0 1 2 3 4 5 6 7 8 9 10 11]

[ 3.30289130e-01 -2.75240941e-01 -2.75240941e-01 3.30289130e-01
-2.75240941e-01 3.30289130e-01 -2.75240941e-01 3.30289130e-01
3.30289130e-01 -2.75240941e-01 -1.69794463e-16 -2.75240941e-01]

[ 4 6 9 1 2 11 10 0 5 7 8 3]

difference -5.55111512313e-17

例程 seriation() 是一个递归函数。 float 组是正在考虑的特征向量,下面的数组给出了列的排序顺序。请注意,列 [4,6,9,1,2,11] 具有相同的值。但是,特征向量和特征值计算始终是近似值,事实上,当我输出第 9 列和第 2 列中的条目之间的差异时,它是非零的。在算法应该分组 [4,6,9,1,2,11] 的地方,它只分组 [4,6,9],并将其余部分放在另一个组中,这给工作带来了麻烦。

那么问题来了:在numpy中有没有实现任意精度计算的方法?如果做不到这一点,这个问题的“好”解决方法是什么?

另外,我应该提一下,可以从数学上证明这些条目必须相等。这是矩阵的一个属性,但希望与问题无关。

最佳答案

double 不完全是实数 [甚至不是有理数]。每个范围内都有无限数量的有理数 [确切地说,每个范围至少有两个元素],但只有有限数量的位来表示它们。
因此,您应该预料到“精确”计算会出现一些舍入误差。

有关更多信息,您可能需要阅读 what every computer scientist should know about floating-point arithmetic

关于python - numpy 中的精度 : issues while comparing numbers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8792430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com