Python浮点决定论
下面的代码(用于计算余弦相似性)在我的计算机上重复运行时,将输出1.0、0.9999999999998或1.0000000000000002。当我取出normalize函数时,它只返回1.0。我认为浮点运算应该是确定性的。如果每次都对同一台计算机上的相同数据应用相同的操作,那么在我的程序中会出现这种情况的原因是什么?这可能与调用normalize函数的堆栈位置有关吗?我怎样才能防止这种情况Python浮点决定论,python,floating-point,deterministic,non-deterministic,Python,Floating Point,Deterministic,Non Deterministic,下面的代码(用于计算余弦相似性)在我的计算机上重复运行时,将输出1.0、0.9999999999998或1.0000000000000002。当我取出normalize函数时,它只返回1.0。我认为浮点运算应该是确定性的。如果每次都对同一台计算机上的相同数据应用相同的操作,那么在我的程序中会出现这种情况的原因是什么?这可能与调用normalize函数的堆栈位置有关吗?我怎样才能防止这种情况 #! /usr/bin/env python3 import math def normalize(v
#! /usr/bin/env python3
import math
def normalize(vector):
sum = 0
for key in vector.keys():
sum += vector[key]**2
sum = math.sqrt(sum)
for key in vector.keys():
vector[key] = vector[key]/sum
return vector
dict1 = normalize({"a":3, "b":4, "c":42})
dict2 = dict1
n_grams = list(list(dict1.keys()) + list(dict2.keys()))
numerator = 0
denom1 = 0
denom2 = 0
for n_gram in n_grams:
numerator += dict1[n_gram] * dict2[n_gram]
denom1 += dict1[n_gram]**2
denom2 += dict2[n_gram]**2
print(numerator/(math.sqrt(denom1)*math.sqrt(denom2)))
浮点数学可能是确定性的,但字典键的顺序不是 调用
.keys()
时,结果列表的顺序可能是随机的
因此,循环中数学运算的顺序也可能是随机的,因此结果不会是确定性的,因为虽然任何单个浮点运算都可能是确定性的,但一系列运算的结果在很大程度上取决于顺序
您可以通过对键列表进行排序来强制执行一致的顺序。字典的顺序仅在Python 3.x中是不确定的,除非在Python 2.xSo中显式配置,否则您建议强制执行顺序,还是将其保留在“浮点不精确”的类别中我要做的就是盯着这些数据。如果这些数据将被进一步用于计算,你会改变你的答案吗?我通常会把它放在“浮点不精确”的领域。