np.random.choice错误:概率并不总和为1,但打印说它确实如此?

时间:2014-05-09 22:31:47

标签: python random sum

使用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 不等于

我真的不明白......

欢迎任何帮助:)

谢谢!

杰西卡

1 个答案:

答案 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,告诉我们它是什么,然后问一个关于下一步该做什么的新问题; - )