使用numpy.random.multinomial时如何避免值错误?

cap*_*let 5 python random numpy numerical-stability

当我使用这个随机发生器时numpy.random.multinomial,我不断得到:

ValueError: sum(pvals[:-1]) > 1.0
Run Code Online (Sandbox Code Playgroud)

我总是传递这个softmax函数的输出:

def softmax(w, t = 1.0):
    e = numpy.exp(numpy.array(w) / t)
    dist = e / np.sum(e)
    return dist
Run Code Online (Sandbox Code Playgroud)

除了我现在收到这个错误,我还为参数(pvals)添加了这个:

while numpy.sum(pvals) > 1:
    pvals /= (1+1e-5)
Run Code Online (Sandbox Code Playgroud)

但这并没有解决它.确保我避免此错误的正确方法是什么?

编辑:这是包含此代码的函数

def get_MDN_prediction(vec):
    coeffs = vec[::3]
    means = vec[1::3]
    stds = np.log(1+np.exp(vec[2::3]))
    stds = np.maximum(stds, min_std)
    coe = softmax(coeffs)
    while np.sum(coe) > 1-1e-9:
        coe /= (1+1e-5)
    coeff = unhot(np.random.multinomial(1, coe))
    return np.random.normal(means[coeff], stds[coeff])
Run Code Online (Sandbox Code Playgroud)

Jed*_*edi 7

我在语言建模工作中也遇到过这个问题。

这个问题的根源来自 numpy 的隐式数据转换:我的 sorfmax() 的输出是float32类型,但是,numpy.random.multinomial()pval转换为float64类型 IMPLICITLY。pval.sum()由于数字四舍五入,这种数据类型转换有时会导致超过 1.0。

此问题已被识别并发布在此处


Meh*_*ran 5

我知道这个问题很旧,但由于我刚才遇到了同样的问题,在我看来它仍然有效。这是我找到的解决方案:

a = np.asarray(a).astype('float64')
a = a / np.sum(a)
b = np.random.multinomial(1, a, 1)

我把重要的部分加粗了。如果你忽略了这一部分,你提到的问题就会时不时地发生。但如果你把数组的类型改为float64,就永远不会发生这种情况。