カーネル密度推定とエントロピー
カーネル密度推定をしてエントロピーを計算する方法を忘備録として書いておく.
標準正規分布を例にとって計算してみる. ちなみに理論値は
import numpy as np import matplotlib.pyplot as plt from scipy import integrate from scipy.stats import norm from scipy.stats import gaussian_kde x = norm.rvs(size=10000) plt.hist(x, bins=50) plt.title('sampling') plt.show() k = gaussian_kde(x) X = np.linspace(-5, 5, 100) plt.plot(X, norm().pdf(X), label='norm') plt.plot(X, k(X), label='kernel estimation') plt.legend() plt.title('pdf') plt.show() def entropy(pdf): def f(x): px = pdf(x) return - px * np.log(px) return f entropy_k = entropy(k) print('entropy:') print('カーネル密度推定', integrate.quad(entropy_k, -5.0, 5.0)) print('理論値', np.log(np.sqrt(2*np.pi*np.e)))
出力結果
entropy: カーネル密度推定 (1.4426170314750473, 1.2370907729071283e-08) 理論値 1.4189385332046727