使用时如何避免值错误数字随机多项式?

2024-04-29 11:11:05 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用这个随机生成器:^{}时,我一直得到:

ValueError: sum(pvals[:-1]) > 1.0

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

^{pr2}$

除了现在我得到了这个错误,我还为参数(pvals)添加了以下内容:

while numpy.sum(pvals) > 1:
    pvals /= (1+1e-5)

但这并没有解决问题。什么是确保我避免这个错误的正确方法?在

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

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])

Tags: 函数错误nprandommeanssumvalueerrorcoe
3条回答

我使用的softmax实现对于我使用它的值来说不够稳定。因此,有时输出的和大于1(例如1.0000024...)。在

这种情况应该由while循环处理。但有时输出包含nan,在这种情况下,循环永远不会触发,错误仍然存在。在

另外,numpy.random.multinomial如果看到NaN,则不会引发错误。在

我现在使用的是:

def softmax(vec):
    vec -= min(A(vec))
    if max(vec) > 700:
        a = np.argsort(vec)
        aa = np.argsort(a)
        vec = vec[a]
        i = 0
        while max(vec) > 700:
            i += 1
            vec -= vec[i]
        vec = vec[aa]
    e = np.exp(vec)
    return e/np.sum(e)

def sample_multinomial(w):
    """
       Sample multinomial distribution with parameters given by softmax of w
       Returns an int    
    """
    p = softmax(w)
    x = np.random.uniform(0,1)
    for i,v in enumerate(np.cumsum(p)):
        if x < v: return i
    return len(p)-1 # shouldn't happen...

很少有人注意到:通过从值中删除logsumexp,可以轻松获得softmax的健壮版本:

from scipy.misc import logsumexp

def log_softmax(vec):
    return vec - logsumexp(vec)

def softmax(vec):
    return np.exp(log_softmax(vec))

检查一下:

^{pr2}$

很简单,不是吗?在

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

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

已识别并发布此问题here

相关问题 更多 >