Python和MATLAB库尔巴克–莱布勒散度信息论统计学生物学和算法模型
🎯要点
- 高斯混合模型聚类和t分布随机邻域嵌入底层分析
- 信息论测量
- 复合彩票统计学计算结果
- 离散分布速率最优估计器
- 样本统计相似性
- 快速闭环散度和交叉熵计算
- 催乳素诱导模型贝叶斯快速推理模型
- 视觉皮层活动神经数据分布
Python散度
在数理统计中,库尔巴克–莱布勒散度(也称为相对熵和 I 散度 ),表示为
D
K
L
(
P
∥
Q
)
D_{ KL }(P \| Q)
DKL(P∥Q),是一种统计距离:衡量一个参考概率分布
P
P
P 与第二个概率分布
Q
Q{ }
Q 之间的差异。从数学上讲,它定义为
D
K
L
(
P
∥
Q
)
=
∑
x
∈
X
P
(
x
)
log
(
P
(
x
)
Q
(
x
)
)
D_{KL}(P \| Q)=\sum_{x \in X } P(x) \log \left(\frac{P(x)}{Q(x)}\right)
DKL(P∥Q)=x∈X∑P(x)log(Q(x)P(x))
让我们从离散情况开始。因此,让
P
P
P 和
Q
Q
Q 成为在同一概率空间
X
\mathcal { X }
X 上定义的两个概率分布。第一次尝试可能是考虑分布之间差异的平均值。确实非常接近,但以下定义略有不同。库尔巴克–莱布勒散度(也称为相对熵)KL
(
P
∥
Q
)
(P \| Q)
(P∥Q) 定义为概率
P
(
x
)
P(x)
P(x) 和
Q
(
x
)
Q(x)
Q(x) 的对数之间差异的平均值:
K
L
(
P
∥
Q
)
=
def
E
[
log
P
(
x
)
−
log
Q
(
x
)
]
KL(P \| Q) \stackrel{\text { def }}{=} E [\log P(x)-\log Q(x)]
KL(P∥Q)= def E[logP(x)−logQ(x)]
期望值使用概率
P
P
P(通常写为
x
∼
P
x \sim P
x∼P )计算。期望值的定义可得出以下表达式
K
L
(
P
∥
Q
)
=
∑
x
∈
X
P
(
x
)
log
(
P
(
x
)
Q
(
x
)
)
KL(P \| Q)=\sum_{x \in X } P(x) \log \left(\frac{P(x)}{Q(x)}\right)
KL(P∥Q)=x∈X∑P(x)log(Q(x)P(x))
对于连续分布,我们写为
K
L
(
P
∥
Q
)
=
∫
−
∞
∞
p
(
x
)
log
(
p
(
x
)
q
(
x
)
)
d
x
KL(P \| Q)=\int_{-\infty}^{\infty} p(x) \log \left(\frac{p(x)}{q(x)}\right) d x
KL(P∥Q)=∫−∞∞p(x)log(q(x)p(x))dx
其中
p
(
x
)
p(x)
p(x) 和
q
(
x
)
q(x)
q(x) 分别是
P
P
P 和
Q
Q
Q 的密度。
如果
{
p
i
}
\left\{p_i\right\}
{pi} 和
{
q
i
}
\left\{q_i\right\}
{qi} 是两个概率质量函数,即两个可数或有限的非负数序列,且和为 1,那么
∑
i
p
i
log
(
p
i
q
i
)
≥
0
\sum_i p_i \log \left(\frac{p_i}{q_i}\right) \geq 0
i∑pilog(qipi)≥0
关于散度实际上表达了两个分布之间的某种距离,表达式
K
L
(
P
∥
Q
)
=
∫
−
∞
p
(
x
)
(
log
p
(
x
)
−
log
q
(
x
)
)
d
x
=
∫
−
∞
∞
p
(
x
)
D
(
x
)
d
x
\begin{aligned} KL(P \| Q) & =\int_{-\infty} p(x)(\log p(x)-\log q(x)) d x \\ & =\int_{-\infty}^{\infty} p(x) D(x) d x \end{aligned}
KL(P∥Q)=∫−∞p(x)(logp(x)−logq(x))dx=∫−∞∞p(x)D(x)dx
令
P
P
P 和
Q
Q
Q 为以下分布(每个可能的结果
x
x
x 都在
X
=
{
0
,
1
,
2
}
X =\{0,1,2\}
X={0,1,2} 中):
0
1
2
分布
P
(
x
)
9
/
25
12
/
25
4
/
25
分布
Q
(
x
)
1
/
3
1
/
3
1
/
3
\begin{array}{|c|c|c|c|} \hline & 0 & 1 & 2 \\ \hline \text { 分布 } P(x) & 9 / 25 & 12 / 25 & 4 / 25 \\ \hline \text { 分布 } Q(x) & 1 / 3 & 1 / 3 & 1 / 3 \\ \hline \end{array}
分布 P(x) 分布 Q(x)09/251/3112/251/324/251/3
我们来计算一下
K
L
(
P
∥
Q
)
KL(P\|Q)
KL(P∥Q)。
K
L
(
P
∥
Q
)
=
∑
x
P
(
x
)
log
(
P
(
x
)
Q
(
x
)
)
=
9
/
25
log
(
9
/
25
1
/
3
)
+
12
/
25
log
(
12
/
25
1
/
3
)
+
4
/
25
log
(
4
/
25
1
/
3
)
≈
0.0853
\begin{aligned} KL(P \| Q) & =\sum_x P(x) \log \left(\frac{P(x)}{Q(x)}\right) \\ & =9 / 25 \log \left(\frac{9 / 25}{1 / 3}\right)+12 / 25 \log \left(\frac{12 / 25}{1 / 3}\right)+4 / 25 \log \left(\frac{4 / 25}{1 / 3}\right) \\ & \approx 0.0853 \end{aligned}
KL(P∥Q)=x∑P(x)log(Q(x)P(x))=9/25log(1/39/25)+12/25log(1/312/25)+4/25log(1/34/25)≈0.0853
使用Python评估
from scipy.stats import entropy
entropy([9/25, 12/25, 4/25], qk=[1/3, 1/3, 1/3])
0.0852996013183706
import matplotlib.pyplot as plt
import numpy as np
p = [9/25, 12/25, 4/25]
q = [1./3,1./3,1./3]
xx = ['0','1','2']
logq = np.log(q)
logp = np.log(p)
plt.bar(xx, q, color='beige')
plt.bar(xx, p, alpha=.6, color='orange')
plt.show()
plt.bar(xx, logq, color='beige')
plt.bar(xx, logp, alpha=.6, color='orange')
plt.show()
from scipy.stats import norm, skewnorm
x = np.arange(-3,2.5,.001)
plt.plot(x, 10*skewnorm.pdf(x,-1.2), color='black')
plt.plot(x, 10*norm.pdf(x, scale=1.1), color='orange')
log1 = np.log(skewnorm.pdf(x,-1.2))
log2 = np.log(norm.pdf(x, scale=1.1))
plt.plot(x, log1, color='black')
plt.plot(x, log2, color='orange')
plt.fill_between(x, log1, log2,
where=log1>=log2, facecolor='grey',
interpolate=True)
plt.fill_between(x, log1, log2,
where=log1<log2, facecolor='orange',
interpolate=True)
plt.show()