7

この乱数発生器を使用すると: numpy.random.multinomial、取得し続けます:

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

私は常にこのソフトマックス関数の出力を渡しています:

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

このエラーが発生したことを除いて、パラメーター ( 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])
4

4 に答える 4

1

softmax私が使用していた実装は、使用していた値に対して十分に安定していません。その結果、出力の合計が より大きい場合があります1(例: 1.0000024...)。

このケースは while ループで処理する必要があります。ただし、出力に NaN が含まれる場合があり、その場合、ループはトリガーされず、エラーが持続します。

また、numpy.random.multinomialNaN を検出してもエラーになりません。

代わりに、私が現在使用しているものは次のとおりです。

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...
于 2014-04-24T17:29:36.173 に答える