使用numpy的random.choice功能时,我遇到了一个小问题。 我给它一个列表(a),以及与该列表相关的概率(p)(我试图生成随机文本,实现具有在训练语料库上计算的概率的二元组马尔可夫模型)。 问题是,它在程序中间崩溃,告诉我概率不等于1。 更大的问题是,sum(p)总和为1.
这是一个错误吗? random.choice的总和是否与常规求和函数不同?我错过了什么吗?
以下是代码:
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输出示例:
让我们来吧 总和为p:1.0 不等于我真的不明白......
欢迎任何帮助:)
谢谢!
杰西卡
答案 0 :(得分:2)
变化:
print "somme sur p:", sum(p)
到
print "somme sur p:", repr(sum(p))
^^^^^ ^
然后再试一次。 print
在打印它们之前隐式地将str()
应用于项目,并且在“{足够多”的Python版本中str
轮次浮动到12位有效数字。有许多不等于1的浮点数将打印为1.0
。但是repr显示为1.0
的唯一浮点数恰好是1.0。
一旦你发现总和真的不是1.0,告诉我们它是什么,然后问一个关于下一步该做什么的新问题; - )