【发布时间】:2014-05-09 22:31:47
【问题描述】:
我在使用 numpy 的 random.choice 函数时遇到了一个小问题。 我给它一个列表(a),以及与这个列表相关的概率(p)(我试图生成随机文本,实现一个二元马尔可夫模型,概率在训练语料库上计算)。 问题是,它在程序中崩溃,告诉我概率总和不等于 1。 更大的问题是,sum(p) 总和为 1。
这是一个错误吗? random.choice 和常规 sum 函数的总和是否不同?我错过了什么吗?
代码如下:
def randomBigram(self):
doc = open(self.path+"/randomGenBi.txt", "wb")
lettre = str(np.random.choice(self.letters.index))
a = [elem for elem in self.probaBigram.index if elem[1] == lettre]
p = [self.probaBigram[elem] for elem in self.probaBigram.index if elem[1] == lettre]
random = np.random.choice(a, p=p)
i = 0
while i < 5000:
lettre = str(np.random.choice(self.letters.index))
print "lettre", lettre
a = [elem for elem in self.probaBigram.index if elem[1] == lettre]
p = [self.probaBigram[elem] for elem in self.probaBigram.index if elem[1] == lettre]
if sum(p) != 1.0: #debug
print "somme sur p:", sum(p)
print "not equal"
else:
print "equals one"
random = np.random.choice(a, p=p)
doc.write(random)
i += 1
这是我的 shell 输出示例:
字母a p 的总和:1.0 不相等
我真的不明白...
欢迎任何帮助:)
谢谢!
杰西卡
【问题讨论】:
-
什么是完整的回溯?
-
这只是舍入错误吗?浮点数学很少“相等”——更常见的是“非常接近”。项越多,可能的错误就越大。是在 1e-16 之内还是距离很远(换句话说,如果您测试
abs(sum-1)<1e-16会怎样) -
你能试着把它简化为一个完整而简短的例子吗?你现在所拥有的不仅仅是在不完整的情况下重现你的问题。
-
完整回溯:回溯(最近一次调用最后):文件“NGrammes.py”,第 283 行,在
ng.randomBigram() 文件“NGrammes.py”,第 234 行,在 randomBigram random = np.random.choice(a, p=p) File "mtrand.pyx", line 1026, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:7322) ValueError: probabilities do not sum to 1 但是蒂姆是对的,使用 repr 确实表明它并没有真正总结为 1,它只是非常接近。它应该是一个,这很奇怪......你可能是对的 Floris,它可能只是一个舍入错误,因为我确实有很多值。