gpt4 book ai didi

Python浮点确定性

转载 作者:太空狗 更新时间:2023-10-29 22:11:20 25 4
gpt4 key购买 nike

下面的代码(计算余弦相似度)在我的计算机上重复运行时,将输出 1.0、0.9999999999999998 或 1.0000000000000002。当我取出 normalize 函数时,它只会返回 1.0。我认为浮点运算应该是确定性的。如果每次对同一台计算机上的相同数据应用相同的操作,在我的程序中会导致什么?这可能与调用 normalize 函数的堆栈位置有关吗?我怎样才能避免这种情况?

#! /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)))

最佳答案

float 学可能是确定性的,但字典键的顺序不是。

当您调用 .keys() 时,结果列表的顺序可能是随机的。

因此循环内的数学运算顺序也可能是随机的,因此结果不会是确定性的,因为虽然任何单个浮点运算可能是确定性的,但结果一系列操作在很大程度上取决于顺序。

您可以通过对键列表进行排序来强制执行一致的顺序。

关于Python浮点确定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21642779/

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