擅长:python、mysql、java
<p>我使用的<code>softmax</code>实现对于我使用它的值来说不够稳定。因此,有时输出的和大于<code>1</code>(例如<code>1.0000024...</code>)。在</p>
<p>这种情况应该由while循环处理。但有时输出包含nan,在这种情况下,循环永远不会触发,错误仍然存在。在</p>
<p>另外,<code>numpy.random.multinomial</code>如果看到NaN,则不会引发错误。在</p>
<p>我现在使用的是:</p>
<pre><code>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...
</code></pre>