gpt4 book ai didi

python - 概率分布和浮点变量,概率必须加到1

转载 作者:行者123 更新时间:2023-11-28 22:48:05 26 4
gpt4 key购买 nike

我正在编写这样一个脚本:该程序分析一堆特定语言的文本文档,绘制每个 k 的概率分布,其中 k 是出现在每个给定字母后的第一个字符在文本的每个单词中。然后程序使用这些知识尝试使用马尔可夫链写出“真实”的单词。

我已经写了大部分的脚本,它已经在吐出有趣的词了,关键是生成词的函数使用了 try and except 机制来避免卡住。它被卡住是因为一些概率分布不加到 1(我猜是因为 float 类型不是那么精确或类似的东西)并且应该与这些分布一起使用的 numpy 函数会引发 ValueError 因为概率不加起来为 1 .

通过触发某些分布的异常,一些词根本不会生成,最终结果不如它可能的那样有趣。

现在,我的问题是:有没有办法让这些概率分布在生成时加起来为1?我试过 gmpy2,round() 函数,但似乎没有人工作。也许这是一个愚蠢的问题,我只是需要呼吸一下新鲜空气...无论如何,一些帮助会很有用!

这里是生成概率分布的代码

def FreqRel(self,listValues):
absFreq = self.AbsFreq(listValues)
freqRel = []
for i in absFreq:
freqRel.append(i/sum(absFreq))
if sum(freqRel) != 1:
print("Frequencies do not add up to 1")
if sum(freqRel) - 1 < 0:
diff = sum(freqRel) - 1
#This should be an adjustment which should not interfere
#that much on the probability distribution
freqRel[1] = freqRel[1] - diff
print("missing",diff)
elif sum(freqRel) - 1 > 0:
diff = sum(freqRel) - 1
#This should be an adjustment which should not interfere
#that much on the probability distribution
freqRel[1] = freqRel[1] - diff
print("Too much",diff)
return freqRel

这是我在运行此函数时在控制台上打印的内容: enter image description here

enter image description here

这是当总和不为 1 时崩溃的代码。numpy 行是那些崩溃的代码。错误是:ValueError: probabilities do not add up to 1.

def spitText(n):
i = 0
while i < n:
try:
word = ""
#This oldChar setting is arbitrary, later I'm going to fix it
oldChar = "b"
for k in range(np.random.choice(distributions[0],replace=True,p=distributions[1])):
newChar = np.random.choice(alphabet,replace=True,p=distRel[alphabet.index(oldChar)])
word = word + newChar
oldChar = newChar
print(word)
time.sleep(0.2)
i+=1
except:
pass

最佳答案

你有一些看起来像这样的输出:

1.0
1.0
1.0
0
1.0
1.0

来自评论:

that's a simple for loop outside this function that prints out the sum of each distribution stored as a returned value from this function

因此,您的某些频率分布之和为 0。那是你的问题。

大概您构建分布的代码有一些边缘情况,要么返回一个空分布,要么返回一个全为零的分布。无论哪种方式,它显然都行不通。


事实上,许多 1.0 值因累积舍入误差高达 8e-17 而偏离,这是一个转移注意力的问题。您可以看到 numpy 是为处理这些问题而构建的:

>>> np.random.choice(2, 3, p=[0.4, 0.6+3e-17])
array([1, 0, 0])

只有当错误变得足够大时(大多数 numpy 的默认相对 epsilon 是 1e-5)它才会提示:

>>> np.random.choice(2, 3, p=[0.4, 0.6+3e-5])
ValueError: probabilities do not sum to 1

因此,您必须有一些概率分布,其总和与 1 相差超过 1e-5。你当然会;你有一些偏离了整个 1


这意味着您的主要问题:

is there a way to make these probability distributions add up to 1 when they are generated?

…真的是一个XY problem : 这不是您需要在这里解决的问题。

不过我还是会回答的。简短的回答是:不。 float 是具有固定位数精度的二进制分数。如果您尝试将任意实数存储在 float 中,则会出现舍入错误。您可以很容易地看到这一点:

>>> 1.0 + 1e-17
1.0

只是没有足够的位来将 1.01.00000000000000001 存储为不同的二进制小数。

如果您想进一步了解(您应该),请阅读 What every computer scientist should know about floating point ,有关该主题的经典介绍性论文。

关于python - 概率分布和浮点变量,概率必须加到1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25522931/

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