python 3 KL分散の計算(KL Divergence)

1833 ワード

KL Divergence
KL(Kullback–Leibler)Divergenceは中国語でKL分散と訳され、情報論の観点から言えば、この指標は情報利得(Information Gain)または相対エントロピー(Relative Entropy)であり、ある分布の別の分布に対する相違性を測定するために使用され、この指標は距離測定として使用できないことに注意してください.この指標は対称性、すなわち2つの分布PとQを持たないため、DKL(P|Q)とDKL(Q|P)で計算される値は一般的に等しくなく、距離メトリックとして使用される場合は、一般的に式を修正する必要があるが、後述する.KL Divergenceの計算式は離散分布に対して
DKL(P|Q)=∑iP(i)logP(i)Q(i)
連続分布の場合
DKL(P|Q)=∫∞−∞p(x)logp(x)q(x)dx
プログラム
python 3による計算
import numpy as np
import scipy.stats

#            
x = [np.random.randint(1, 11) for i in range(10)]
print(x)
print(np.sum(x))
px = x / np.sum(x)
print(px)
y = [np.random.randint(1, 11) for i in range(10)]
print(y)
print(np.sum(y))
py = y / np.sum(y)
print(py)

#   scipy API    
# scipy              ,      
# scipy.stats.entropy(x, y) scipy.stats.entropy(px, py)  
KL = scipy.stats.entropy(x, y) 
print(KL)

#     
KL = 0.0
for i in range(10):
    KL += px[i] * np.log(px[i] / py[i])
    # print(str(px[i]) + ' ' + str(py[i]) + ' ' + str(px[i] * np.log(px[i] / py[i])))

print(KL)