2016-09-21 7 views
1

しかし、このENT1がNaNを返しますどのようにしてエントロピーを生み出すことができますか?私は、アレイからのエントロピーを計算しようとしています

mu1, sigma1 = 0, 1 
s1 = np.random.normal(mu1, sigma1, 100000) 
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True) 
data1 = hist1[0] 
ent1 = -(data1*np.log(np.abs(data1))).sum() 

によってnp.histogramから生じました。ここでの問題は何ですか?

+0

'data1'はその内部にゼロ値を持ち、Log(0)は定義されていないため、nanを返します。 –

答えて

2

問題は、ヒストグラムにゼロの確率があり、シャノンのエントロピー公式を適用するときに数値が意味をなさないことです。解決策は、ゼロ確率を無視することである。

mu1, sigma1 = 0, 1 
s1 = np.random.normal(mu1, sigma1, 100000) 
hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True) 
data1 = hist1[0] 
non_zero_data = data1[data1 != 0] 
ent1 = -(non_zero_data*np.log(np.abs(non_zero_data))).sum() 
+0

ありがとう!ようやくそれを行った。 :)私もspicy.stats.entropyを使ってみましたが、値は異なっていますね。同じ式にもかかわらず? – Vinci

+0

心配はいりません。 'spicy.stats.entropy'を使用するときは、値を正規化するので注意してください。エレメントワイズのエントロピーでは' scipy.special.entr'を@ watten-weckesserと説明しています。 –

+0

@MateusZitelli実際にゼロ確率はシャノンのエントロピーには意味がありますが、 '0 * log(0)'はゼロと解釈する必要があります。 'p * log(p)'の 'p * 'がゼロになるので、これは意味をなさない。これは' 0 * log(0) 'を解釈する唯一の賢明な方法である。 – drevicko

3

エントロピーを計算するには、scipy.special.entrを使用できます。例えば、

In [147]: from scipy.special import entr 

In [148]: x = np.array([3, 2, 1, 0, 0.5, 2.5, 5]) 

In [149]: entr(x).sum() 
Out[149]: -14.673474028700136 

その結果を確認するために、我々はまた、scipy.special.xlogyを使用してエントロピーを計算することができます。

In [152]: xnz = x[x != 0] 

In [153]: -(xnz*np.log(xnz)).sum() 
Out[153]: -14.673474028700136 

In [150]: from scipy.special import xlogy 

In [151]: -xlogy(x, x).sum() 
Out[151]: -14.673474028700136 

最後に、私たちは、それはあなたが期待するのと同じ結果であることを確認することができます

関連する問題