【问题标题】:np.random.choice error : probabilities doesn't sum to 1, but print says it does ?np.random.choice 错误:概率之和不等于 1,但 print 说是吗?
【发布时间】: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)&lt;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,它可能只是一个舍入错误,因为我确实有很多值。

标签: python random sum


【解决方案1】:

变化:

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,请向我们展示它是什么,并提出一个新问题,了解下一步该做什么;-)

【讨论】:

  • 感谢您的提示!好吧,使用 repr 确实表明总和不完全是一,而是更多的 1.0000000002 或 0.99999987……嗯。所以它确实不是一个,但它应该是......它可能是一个浮点舍入问题吗?无论如何,正如你所说,我想是时候提出一个新问题了:)我会先仔细检查我的概率,以确保我没有在其他地方搞砸...... :)
猜你喜欢
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2017-11-18
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
相关资源
最近更新 更多