np.random.choice错误:概率不总和为1,但打印却显示是?

0 投票
1 回答
2351 浏览
提问于 2025-04-18 06:03

我在使用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,告诉我们它的真实值,然后再问我们接下来该怎么做 ;-)

撰写回答