np.random.choice错误:概率不总和为1,但打印却显示是?
我在使用numpy的random.choice函数时遇到了一点小问题。
我给它提供了一个列表(a),还有与这个列表相关的概率(p)(我正在尝试生成随机文本,使用一个基于二元组的马尔可夫模型,概率是从训练语料库中计算出来的)。
问题是,它在程序运行中间崩溃了,告诉我概率的总和不等于1。
更大的问题是,sum(p)确实等于1。
这是个bug吗?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
这是我在命令行输出的一个示例:
lettre a
p的总和:1.0
不相等
我真的搞不懂...
任何帮助都欢迎 :)
谢谢!
杰西卡
1 个回答
2
把:
print "somme sur p:", sum(p)
改成
print "somme sur p:", repr(sum(p))
^^^^^ ^
然后再试一次。print
在打印之前会自动把内容转成字符串,这个过程叫做 str()
。在一些“老版本”的 Python 中,str
会把浮点数(小数)四舍五入到 12 位有效数字。所以有很多不等于 1 的小数在打印时会显示为 1.0
。不过,只有那个精确等于 1.0 的小数,它的显示才会是 1.0
。
一旦你发现结果其实并不等于 1.0,告诉我们它的真实值,然后再问我们接下来该怎么做 ;-)