표본에서 원 확률 분포의 평균 정보량(엔트로피)을 계산하는 방법
11525 단어 엔트로피저는 초보자입니다.Python
문외한의 낙서다.오류, 부적절한 용어, 증명이 없는 경우가 많다.
양해 부탁드립니다.
본문의 목적
연속 확률 분포로 생성된 표본에 따라 원시 확률 분포의 평균 정보량을 구한다.
이론
확률 밀도 함수 $\,\\,f\, $의 연속 확률 분포를 가진 평균 정보량 $\,h(X)\, $는 표현식 1로 표시되며, 표본 수 $\\\\\\\\\\\, $가 충분하면 식2와 같이 각 표본은$i\의 정보량에 따라 요구해야 합니다.\begin{align}
&h(X) = \int_{\chi}^{}f(x)\,log\,f(x)\,dx\qquad\qquad・・・式1\\
&h(X) \approx \frac{1}{N}\sum_{i=1}^{N}\,-logP(\,X = x_i\,)\,\qquad・・・式2
\end{align}
식 2에서 $\, h(X)$를 얻으려면 각 표본 $\,\, x에서 선택하십시오i\, $\\, P(\, X=x i\,)\에 대해 $이(가) 필요합니다.
다음은 $P(\,X=x i\,)\,$\\,h(X)\,$$의 계산 방법에 대한 설명입니다.
우선 몇 개의 양을 정의한다.
• 각 표본 사이의 거리는 $\, d(xi,\, xj)\, $^*$입니다.
• 각 표본 $\,\,xi\, $정보$\\와 $\\,\,\\,$\,r\떨어진 $$\\n 미만의 표본 총수는 $\\n자신을 포함하다.
・ $,\,\,\,\,d,$이하 영역의 볼륨$\,V(r)\,$원거리.
이 정의에 따라 $\, r\, $\\, P(\, X=x i\,)\를 적절한 $\, r\, $\, P(\, X=x i\,)로 결정하여 근사하게 달러를 구합니다.P(\,X=x_i\,)\, \approx \frac{n_i}{NV(r)}\qquad・・・式3
장식 3 대입식 2를 통해 얻을 수 있는 식 4.\begin{align}
h(X,r) &\approx \frac{1}{N}\sum_{i=1}^{N}\,-log\frac{n_i}{NV(r)}\\
&= \,logV(r) + logN - \frac{1}{N}\sum_{i=1}^{N}\,log\,n_i\qquad・・・式4
\end{align}
방정식 3의 근사성을 달성하기 위해서는 $r\, $의 작은 값을 사용하는 것이 좋습니다.그러나 표본 수가 유한한 이상 $r\, $가 매우 작으면 대부분의 법칙을 만족시키지 못하고 식3의 근사한 결함이 나타난다.따라서 적당한 결정 방법은 실제 데이터를 보면서 고려해야 한다.
$^*\lim_{d(x_i,\,x_j)\to 0}P(\,X=x_i\,)=lim_{d(xi,\,xj)\to0} P(\,X=xj\,)\,\,\, 달러를 만족시키면 뭐든지 됩니다.
응용 프로그램
적절한 2차원 고스 분포에서 표본을 생성하여 $h(X)\,$를 얻습니다.import numpy as np
from matplotlib import pyplot as plt
def calc_d(x):
N = len(x)
x_tiled = np.tile(x, (N, 1, 1))
d = np.linalg.norm(x_tiled - x_tiled.transpose((1, 0, 2)), axis=2)
return d
# 次元数が 2 であるため円の面積の公式を適用
def calc_v(r):
v = np.pi * np.power(r, 2)
return v
def calc_h(d, v, N, r):
n = np.sum(d <= r, axis=0)
h = np.log(v) + np.log(N) - np.sum(np.log(n)) / N
return h
# 適当な 2 次元ガウス分布からデータを生成する
data = np.random.normal(0, 1, (1000, 2))
# r を変化させながら h(X) を計算する
r_list = [(i + 1) * 0.01 for i in range(10000)] # r の範囲は適当に決めた
d = calc_d(data)
N = len(data)
h_list = [calc_h(d, calc_v(r), N, r) for r in r_list]
# グラフを描画する
# 計算値を青い実線でプロットする
plt.figure(0)
plt.plot(r_list, h_list, color='blue', linestyle='solid')
# 標本分散から計算した値を青い点線でプロットする
Z = np.cov(data[:, 0], data[:, 1])
h_s = 0.5 * np.log(np.linalg.det(2 * np.pi * np.e * Z))
plt.plot(r_list, [h_s for _ in range(len(r_list))], color='blue', linestyle='dotted')
# 母集団分散から計算した値をオレンジ色の点線でプロットする
h_u = np.log(2 * np.pi * np.e)
plt.plot(r_list, [h_u for _ in range(len(r_list))], color='orange', linestyle='dotted')
plt.xlim([0, 3])
plt.ylim([0, 5])
plt.show()
일단 실행하면 이런 도표를 얻을 수 있다.
가로축은 $\, r\$, 세로축은 $\, h(X, r)\, $를 나타냅니다.
이론적으로 설명한 바와 같이 달러는 작을수록 $\\, h(X,r)\, 달러는 진정한 값에 가깝지만 너무 작으면 이번에는 마이너스의 무한대로 퍼진다.
차트에서 가장 작은 $\r\\만큼 기울기를 선택하는 것이 좋습니다.실제로 공식 3의 근사성립이 이뤄진다면 공식 3의 근사성립 상황을 고려하면 이 결정도 이상할 게 없다고 생각하지만 증명된 것도 없기 때문에 너무 믿어서는 안 된다.
Reference
이 문제에 관하여(표본에서 원 확률 분포의 평균 정보량(엔트로피)을 계산하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ek-xba/items/8402691128e179078a11
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
\begin{align}
&h(X) = \int_{\chi}^{}f(x)\,log\,f(x)\,dx\qquad\qquad・・・式1\\
&h(X) \approx \frac{1}{N}\sum_{i=1}^{N}\,-logP(\,X = x_i\,)\,\qquad・・・式2
\end{align}
P(\,X=x_i\,)\, \approx \frac{n_i}{NV(r)}\qquad・・・式3
\begin{align}
h(X,r) &\approx \frac{1}{N}\sum_{i=1}^{N}\,-log\frac{n_i}{NV(r)}\\
&= \,logV(r) + logN - \frac{1}{N}\sum_{i=1}^{N}\,log\,n_i\qquad・・・式4
\end{align}
import numpy as np
from matplotlib import pyplot as plt
def calc_d(x):
N = len(x)
x_tiled = np.tile(x, (N, 1, 1))
d = np.linalg.norm(x_tiled - x_tiled.transpose((1, 0, 2)), axis=2)
return d
# 次元数が 2 であるため円の面積の公式を適用
def calc_v(r):
v = np.pi * np.power(r, 2)
return v
def calc_h(d, v, N, r):
n = np.sum(d <= r, axis=0)
h = np.log(v) + np.log(N) - np.sum(np.log(n)) / N
return h
# 適当な 2 次元ガウス分布からデータを生成する
data = np.random.normal(0, 1, (1000, 2))
# r を変化させながら h(X) を計算する
r_list = [(i + 1) * 0.01 for i in range(10000)] # r の範囲は適当に決めた
d = calc_d(data)
N = len(data)
h_list = [calc_h(d, calc_v(r), N, r) for r in r_list]
# グラフを描画する
# 計算値を青い実線でプロットする
plt.figure(0)
plt.plot(r_list, h_list, color='blue', linestyle='solid')
# 標本分散から計算した値を青い点線でプロットする
Z = np.cov(data[:, 0], data[:, 1])
h_s = 0.5 * np.log(np.linalg.det(2 * np.pi * np.e * Z))
plt.plot(r_list, [h_s for _ in range(len(r_list))], color='blue', linestyle='dotted')
# 母集団分散から計算した値をオレンジ色の点線でプロットする
h_u = np.log(2 * np.pi * np.e)
plt.plot(r_list, [h_u for _ in range(len(r_list))], color='orange', linestyle='dotted')
plt.xlim([0, 3])
plt.ylim([0, 5])
plt.show()
Reference
이 문제에 관하여(표본에서 원 확률 분포의 평균 정보량(엔트로피)을 계산하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Ek-xba/items/8402691128e179078a11텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)