• 频率学派概率 (Frequentist Probability):认为概率和事件发⽣的频率相关。
• 贝叶斯学派概率 (Bayesian Probability):认为概率是对某件事发生的确定程度,置信度。
概率质量函数 (Probability Mass Function,PMF):
对于离散型变量,我们先定义⼀个随机变量,然后⽤ ∼ \sim ∼ 符号来说明它遵循的分布: x ∼ P ( x ) x\sim P (x) x∼P(x),函数 P P P 是随机变量 x x x 的 PMF。 例如, 考虑⼀个离散型 x x x 有 k 个不同的值,我们可以假设 x x x 是均匀分布的 (也就是将它的每个值视为等可能的),通过将它的 PMF 设为:
P ( x = x i ) = 1 k P (x = x_i) = \frac{1}{k} P(x=xi)=k1
对于所有的 i 都成⽴。
概率密度函数(Probability Density Function,PDF)
对于连续型变量,我们可以引⼊同样的概念。如果⼀个函数 p p p是概率密度函数 :
• 分布满足非负性条件: ∀ x ∈ x , p ( x ) ≥ 0 \forall x \in x, p (x) \geq 0 ∀x∈x,p(x)≥0
• 分布满⾜归⼀化条件: ∫ − ∞ ∞ p ( x ) d x = 1 \int_{-\infty}^{\infty} p (x) dx = 1 ∫−∞∞p(x)dx=1
例如在 ( a , b ) (a, b) (a,b) 上的均匀分布:
U ( x ; a , b ) = 1 a b ( x ) b − a U(x; a, b) = \frac{{\bf{1}}_{ab}(x)} {b−a} U(x;a,b)=b−a1ab(x)
这⾥ 1 a b ( x ) {{\bf{1}}_{ab}(x)} 1ab(x)表示在 ( a , b ) (a, b) (a,b) 内为 1,否则为 0。
概率密度函数是一个描述这个随机变量的输出值,在某个确定的取值点附近的可能性的函数。而随机变量的取值落在某个区域之内的概率则为概率密度函数在这个区域上的积分。
累积分布函数 (Cummulative Distribution Function,CDF)
表示对小于 x x x 的概率的积分(当概率密度函数存在的时候,累积分布函数是概率密度函数的积分):
C D F ( x ) = ∫ − ∞ x p ( t ) d t \rm{CDF} (x) = \int^x_{−\infty}\it{p(t)dt} CDF(x)=∫−∞xp(t)dt
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import uniform
%matplotlib inline
# 生成样本
fig, ax = plt.subplots(1, 1)
r = uniform.rvs(loc=0, scale=1, size=1000)
ax.hist(r, density=True, histtype='stepfilled', alpha=0.5)
# 均匀分布 pdf
x = np.linspace(uniform.ppf(0.01), uniform.ppf(0.99), 100)
ax.plot(x, uniform.pdf(x), 'r-', lw=5, alpha=0.8, label='uniform pdf')
rvs:产生服从指定分布的随机数
pdf:概率密度函数
cdf:累计分布函数
sf:残存函数(1-CDF)
ppf:分位点函数(CDF的逆)
isf:逆残存函数(sf的逆)
fit:对一组随机取样进行拟合,最大似然估计方法找出最适合取样数据的概率密度函数系数。
*离散分布的简单方法大多数与连续分布很类似,但是pdf被更换为密度函数pmf。
边缘概率 (Marginal Probability):知道⼀组变量的联合概率分布,想要了解其中⼀个子集的概率分布。这种定义在子集上的概率分布被称为边缘概率分布。(下面贝叶斯图的独立性有用到)
∀ x ∈ x , P ( x = x ) = ∑ y P ( x = x , y = y ) \forall x \in {\rm{x}}, P ({\rm{x}} = x) = \sum_y P ({\rm{x}} = x, {\rm{y}} = y) ∀x∈x,P(x=x)=y∑P(x=x,y=y)
条件概率 (Conditional Probability):某个事件,在给定其他事件发⽣时出现的概率。 将给定 x = x {\rm{x}} = x x=x时, y = y {\rm{y}}=y y=y发⽣的条件概率记为 P ( y = y ∣ x = x ) P({\rm{y}}= y | {\rm{x}} = x) P(y=y∣x=x)。可以通过公式计算:
P ( y = y ∣ x = x ) = P ( y = y , x = x ) P ( x = x ) P ({\rm{y}} = y | {\rm{x}} = x) = \frac{P ({\rm{y}} = y, {\rm{x}} = x)}{ P ({\rm{x}} = x)} P(y=y∣x=x)=P(x=x)P(y=y,x=x)
条件概率的链式法则 (Chain Rule of Conditional Probability):任何多维随机变量的联合概率分布,都可以分解成只有⼀个变量的条件概率相乘的形式:
P ( x 1 , … , x n ) = P ( x 1 ) ∏ i = 2 n P ( x i ∣ x 1 , … , x i 1 ) P (x_1, \ldots, x_n) = P(x_1) \prod^n_{i=2} P(x_i | x_1, \ldots, x_{i1}) P(x1,…,xn)=P(x1)i=2∏nP(xi∣x1,…,xi1)
独立性 (Independence):随机变量 x x x 和 y y y,如果它们的概率分布可以表⽰成两个因子的乘积形式,并且⼀个因⼦只包含 x x x 另⼀个因子只包含 y y y,我们就称这两个随机变量是相互独立的:
∀ x ∈ x , y ∈ y , p ( x = x , y = y ) = p ( x = x ) p ( y = y ) \forall {\rm{x}} \in x, {\rm{y}} \in y, p({\rm{x}} = x, {\rm{y}} = y) = p({\rm{x}} = x)p({\rm{y}} = y) ∀x∈x,y∈y,p(x=x,y=y)=p(x=x)p(y=y)
条件独立性 (Conditional Independence):如果关于 x x x 和 y y y 的条件概率分布对于 z z z 的每⼀个值都可以写成乘积的形式,那么这两个随机变量 x x x 和 y y y 在给定随机变量 z z z 时是条件独⽴的。
∀ x ∈ x , y ∈ y , z ∈ z , p ( x = x , y = y ∣ z = z ) = p ( x = x ∣ z = z ) p ( y = y ∣ z = z ) \forall {\rm{x}} \in x, {\rm{y}} \in y, {\rm{z}} \in z, p( {\rm{x}} = x, {\rm{y}} = y | {\rm{z}} = z) = p( {\rm{x}} = x | {\rm{z}} = z)p( {\rm{y}} = y | {\rm{z}} = z) ∀x∈x,y∈y,z∈z,p(x=x,y=y∣z=z)=p(x=x∣z=z)p(y=y∣z=z)
期望 (Expectation):函数 f f f 关于概率分布 P ( x ) P(x) P(x) 或$ p(x)$ 的期望表示为由概率分布产⽣ x x x,再计算 f f f 作⽤到 x x x 上后 f ( x ) f(x) f(x) 的平均值。对于离散型随机变量通过求和得到: (概率 × \times ×数值)
E x ∼ P [ f ( x ) ] = ∑ x P ( x ) f ( x ) \mathbb{E}_{x\sim P} [f(x)] = \sum_x P(x)f(x) Ex∼P[f(x)]=x∑P(x)f(x)
对于连续型随机变量通过求积分得到:
E x ∼ p [ f ( x ) ] = ∫ P ( x ) f ( x ) d x \mathbb{E}_{x\sim p}[f(x)] = \int P(x)f(x)dx Ex∼p[f(x)]=∫P(x)f(x)dx
另外,期望是线性的:(两个函数的期望=分别求期望再相加)
E x [ α f ( x ) + β g ( x ) ] = α E x [ f ( x ) ] + β E x [ f ( x ) ] \mathbb{E}_x[\alpha f(x) + \beta g(x)] = \alpha \mathbb{E}_x[f(x)] + \beta \mathbb{E}_x[f(x)] Ex[αf(x)+βg(x)]=αEx[f(x)]+βEx[f(x)]
方差 (Variance):衡量的是当我们对 x x x依据它的概率分布进行采样时,随机变量 x x x的函数值会呈现多⼤的差异,描述采样得到的函数值在期望上下的波动程度,常用来表示数据包含信息的多少:
V a r ( f ( x ) ) = E [ ( f ( x ) − E [ f ( x ) ] ) 2 ] {\rm{Var}}(f(x)) = \mathbb{E}[(f(x) − \mathbb{E}[f(x)])^2 ] Var(f(x))=E[(f(x)−E[f(x)])2]
将方差开平方即为标准差 (Standard Deviation)。
协方差 (Covariance):⽤于衡量两组值之间的线性相关程度:(f(x)的标准差 × \times ×g(x)的标准差)
C o v ( f ( x ) , g ( y ) ) = E [ ( f ( x ) − E [ f ( x ) ] ) ( g ( y ) − E [ g ( y ) ] ) ] {\rm{Cov}}(f(x), g(y)) = \mathbb{E}[(f(x) − \mathbb{E}[f(x)])(g(y) − \mathbb{E}[g(y)])] Cov(f(x),g(y))=E[(f(x)−E[f(x)])(g(y)−E[g(y)])]
注意,独⽴比零协⽅差(排除了线性的相关)要求更强,因为独立还排除了非线性的相关。
x = np.array([1,2,3,4,5,6,7,8,9])
y = np.array([9,8,7,6,5,4,3,2,1])
Mean = np.mean(x)
Var = np.var(x) # 默认总体方差
Var_unbias = np.var(x, ddof=1) # 样本方差(无偏方差)
Cov = np.cov(x,y)
Mean, Var, Var_unbias, Cov
概率分布函数:概率论的基本概念之一。在实际问题中,常常要研究一个随机变量 ξ \xi ξ取值小于某一数值 x x x的概率,该概率是 x x x的函数,称这种函数为随机变量 ξ \xi ξ的分布函数,记作F(x),即 F ( x ) = P ( ξ < x ) ( − ∞ < x < + ∞ ) F(x)=P(\xi
F(x)=P(ξ<x)(−∞<x<+∞) ,由它并可以决定随机变量落入任何范围内的概率。例如在桥梁和水坝的设计中,每年河流的最高水位 ξ \xi ξ小于 x x x米的概率是 x x x的函数,这个函数就是最高水位 ξ \xi ξ的分布函数。
是描述随机变量取值分布规律的数学表示。
伯努利分布 (Bernoulli Distribution)
(两点分布)是单个二值随机变量的分布,随机变量只有两种可能。
它由⼀个参数$ \phi \in[0, 1]$ 控制, ϕ \phi ϕ 给出了随机变量等于1的概率:
P ( x = x ) = ϕ x ( 1 − ϕ ) 1 − x P ({\rm{x}} = x) = \phi ^x(1 − \phi) ^{1−x} P(x=x)=ϕx(1−ϕ)1−x
表示⼀次试验的结果要么成功要么失败。
logistic sigmoid 函数常用来产生伯努利分布中的参数 ϕ \phi ϕ,取值范围是 (0, 1)。sigmoid 函数在变量取绝对值非常大的正值或负值时会出现饱和 (Saturate) 现象,意味着函数会变得很平,并且对输⼊的微小改变会变得不敏感。
范畴分布 (分类分布)
范畴分布 (Multinoulli Distribution) ,是指在具有 k 个不同值的单个离散型随机变量上的分布:
p ( x = x ) = ∏ i φ i x i ( 2.14 ) p({\rm{x}} = x) = \prod _i \varphi^{ xi}_ i (2.14) p(x=x)=i∏φixi(2.14)
例如每次试验的结果就可以记为⼀个 k 维的向量,只有此次试验的结果对应的维度记为 1,其他记为 0。
高斯分布 (Gaussian Distribution)
或正态分布 (Normal Distribution), 形式如下:
N ( x ; μ , σ 2 ) = 1 2 π σ 2 exp ( − 1 2 σ 2 ( x − μ ) 2 ) N(x; \mu, \sigma^2 ) = \sqrt{\frac{1}{2\pi\sigma^2}}\exp \left( −\frac{1} {2\sigma^2} (x − \mu) ^2\right) N(x;μ,σ2)=2πσ21exp(−2σ21(x−μ)2)
有时也会⽤ β = 1 σ 2 \beta = \frac{1} {\sigma^2} β=σ21 表⽰分布的精度 (precision)。中心极限定理 (Central Limit Theorem) 认为,⼤量的独立随机变量的和近似于⼀个正态分布, 因此可以认为噪声是属于正态分布的。
(特点: 离中心越近,数值越大/趋势越强,均值为0,方差为1,概率密度和为1)
from scipy.stats import norm
mu, sigma = 0, 1
X = norm(mu, sigma) # 标准正态分布
softplus 函数
ζ ( x ) = log ( 1 + exp ( x ) ) \zeta(x) = \log(1 + \exp(x)) ζ(x)=log(1+exp(x))
softplus 函数可以⽤来产⽣正态分布的 b e t a beta beta 和 σ \sigma σ 参数,因为它的范围是 ( 0 , ∞ ) (0,\infty ) (0,∞)。当处理包含 sigmoid 函数的表达式时它也经常出现。softplus函数名来源于它是另外⼀个函数的平滑 (或 “软化”) 形式,这个函数是:
x + = max ( 0 , x ) x ^+ = \max(0, x) x+=max(0,x)
x = np.linspace(-10, 10, 100)
sigmoid = 1/(1 + np.exp(-x))
softplus = np.log(1 + np.exp(x))
多元高斯分布 (多元正态分布) (Multivariate Normal Distribution) 形式如下:
N ( x ; μ , Σ ) = 1 ( 2 π ) n det ( Σ ) exp ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) N(x; \mu, \Sigma) = \sqrt \frac{1} {(2\pi) ^n \det(\Sigma)} \exp \left( −\frac{1}{ 2} (x − \mu) ^T\Sigma ^{−1} (x − \mu) \right) N(x;μ,Σ)=(2π)ndet(Σ)1exp(−21(x−μ)TΣ−1(x−μ))
from scipy.stats import multivariate_normal
import matplotlib.pyplot as plt
mu = [0.5, -0.2] # 均值
sigma = [[2.0, 0.3], [0.3, 0.5]] # 协方差矩阵
X = multivariate_normal(mu, sigma)
指数分布 (Exponential Distribution) 形式如下:
p ( x ; λ ) = λ 1 x ≥ 0 exp ( − λ x ) p(x;\lambda) = \lambda1_{x\geq0} \exp(−\lambda x) p(x;λ)=λ1x≥0exp(−λx)
是⽤于在** x = 0 x=0 x=0 处获得最高的概率**的分布,其中 λ > 0 \lambda > 0 λ>0 是分布的⼀个参数,常被称为率参数 (Rate Parameter)。
from scipy.stats import expon
# 定义 scale = 1 /lambda
X = expon(scale=1)
拉普拉斯分布(Laplace Distribution)形式如下:
L a p l a c e ( x ; μ , γ ) = 1 2 γ exp ( − ∣ x − μ ∣ γ ) {\rm{Laplace}}(x; \mu,\gamma) = \frac{1} {2\gamma} \exp ( −\frac{|x − \mu|}{ \gamma }) Laplace(x;μ,γ)=2γ1exp(−γ∣x−μ∣)
这也是可以在⼀个点获得比较高的概率的分布。
from scipy.stats import laplace
mu, gamma = 0, 1
X = laplace(loc=mu, scale=gamma)
Dirac 分布
Dirac delta 函数定义为$ p(x) = \delta(x − \mu)$,是泛函数。常被用于组成经验分布 (Empirical Distribution):
p ^ ( x ) = 1 m ∑ i = 1 m δ ( x − x ( i ) ) \hat{p}(x) = \frac{1} {m} \sum ^m_ {i=1}\delta(x − x ^{(i)} ) p^(x)=m1i=1∑mδ(x−x(i))
一件不太可能的事件比一件比较可能的事件更有信息量。
独立发生的事件之间的信息量应该是可以叠加的。例如,投掷的硬币两次正⾯朝上传递的信息量,应该是投掷⼀次硬币正面朝上的信息量的两倍。
I ( x ) = − log P ( x ) I(x) = − \log P(x) I(x)=−logP(x)
E x ∼ P [ I ( x ) ] = − E x ∼ P [ log P ( x ) ] \mathbb{E}_{x∼P} [{\rm{I}}(x)] = −\mathbb{E}_{x∼P}[\log P (x)] Ex∼P[I(x)]=−Ex∼P[logP(x)]
也可以表示成 H§。香农熵是编码原理中最优编码长度。
多个随机变量:
联合熵 (Joint Entropy):表示同时考虑多个事件的条件下(即考虑联合分布概率)的熵。
H ( X , Y ) = − ∑ x , y P ( x , y ) log ( P ( x , y ) ) H(X, Y ) = − \sum_{x,y} P(x, y)\log (P(x, y)) H(X,Y)=−x,y∑P(x,y)log(P(x,y))
条件熵 (Conditional Entropy):表示某件事情已经发⽣的情况下,另外⼀件事情的熵。
H ( X ∣ Y ) = − ∑ y P ( y ) ∑ x P ( x ∣ y ) log ( P ( x ∣ y ) ) H(X|Y ) = − \sum _y P(y) \sum _x P(x|y)\log (P(x|y)) H(X∣Y)=−y∑P(y)x∑P(x∣y)log(P(x∣y))
互信息 (Mutual Information):表⽰两个事件的信息相交的部分。
I ( X , Y ) = H ( X ) + H ( Y ) − H ( X , Y ) I(X, Y ) = H(X) + H(Y )−H(X, Y ) I(X,Y)=H(X)+H(Y)−H(X,Y)
信息变差 (Variation of Information):表⽰两个事件的信息不相交的部分。
V ( X , Y ) = H ( X , Y ) − I ( X , Y ) V (X, Y ) = H(X, Y )−I(X, Y ) V(X,Y)=H(X,Y)−I(X,Y)
p = np.linspace(1e-6,1-1e-6,100)
entropy = (p-1)*np.log(1-p)-p*np.log(p)
plt.figure(figsize=(4,4))
plt.plot(p,entropy)
plt.xlabel('p')
plt.ylabel('Shannon entropy in nats')
plt.show()
def H(sentence):
"""
最优编码长度
"""
entropy = 0
# 这里有 256 个可能的 ASCII 符号
for character_i in range(256):
Px = sentence.count(chr(character_i))/len(sentence)
if Px > 0:
entropy += -Px * math.log(Px,2) # 注:log 以 2 为底
return entropy
import random
import math
# 只用 64 个字符
simple_message = "".join([chr(random.randint(0,64)) for i in range(500)])
print(simple_message)
H(simple_message)
KL 散度 (Kullback-Leibler Divergence)
⽤于衡量 P ( x ) P(x) P(x) 和 Q ( x ) Q(x) Q(x) 两个分布间的差距:
D K L ( P ∣ ∣ Q ) = E x ∼ P [ log P ( x ) Q ( x ) ] = E x ∼ P [ log P ( x ) − l o g Q ( x ) ] D_{KL}(P||Q) = \mathbb{E}_{x∼P} [\log \frac{P(x)}{ Q(x) }] = \mathbb{E}_{x∼P} [\log P(x) − log Q(x)] DKL(P∣∣Q)=Ex∼P[logQ(x)P(x)]=Ex∼P[logP(x)−logQ(x)]
注意 D K L ( P ∣ ∣ Q ) ≠ D K L ( Q ∣ ∣ P ) D_{KL}(P||Q) \neq D_{KL}(Q||P) DKL(P∣∣Q)=DKL(Q∣∣P),
交叉熵 (Cross Entropy):
H ( P , Q ) = H ( P ) + D K L ( P ∣ ∣ Q ) = − E x ∼ P [ log Q ( x ) ] H(P, Q) = H(P) + D_{KL}(P||Q) = −\mathbb{E}_{x∼P} [\log Q(x)] H(P,Q)=H(P)+DKL(P∣∣Q)=−Ex∼P[logQ(x)]
假设有一个样本集中两个概率分布 ,$P 是 真 实 分 布 , 是真实分布, 是真实分布,Q$ 是模型分布,交叉熵就是用非真实分布 Q Q Q 来表示来自真实分布$P $的平均编码长度。
最小化交叉熵$H(P,Q) $可以让模型分布逼近真实分布。
# KL 定义
from scipy.stats import entropy # 内置 kl
def kl(p, q):
"""
D(P || Q)
"""
p = np.asarray(p, dtype=np.float)
q = np.asarray(q, dtype=np.float)
return np.sum(np.where(p != 0, p * np.log(p / q), 0))
# 测试
p = [0.1, 0.9]
q = [0.1, 0.9]
print(entropy(p, q) == kl(p, q))
# D(P||Q) 与 D(Q||P) 比较
x = np.linspace(1, 8, 500)
y1 = norm.pdf(x, 3, 0.5)
y2 = norm.pdf(x, 6, 0.5)
p = y1 + y2 # 构造 p(x)
KL_pq, KL_qp = [], []
q_list = []
for mu in np.linspace(0, 10, 50):
for sigma in np.linspace(0.1, 5, 50): # 寻找最优 q(x)
q = norm.pdf(x, mu, sigma)
q_list.append(q)
KL_pq.append(entropy(p, q))
KL_qp.append(entropy(q, p))
KL_pq_min = np.argmin(KL_pq)
KL_qp_min = np.argmin(KL_qp)
fig, axes = plt.subplots(1, 2, figsize=(10, 3))
axes[0].set_ylim(0, 0.8)
axes[0].plot(x, p/2, 'b', label='$p(x)$')
axes[0].plot(x, q_list[KL_pq_min], 'g--', label='$q^*(x)$')
axes[0].set_xlabel('$x$')
axes[0].set_ylabel('$p(x)$')
axes[0].set_title('$q^*= {arg\min}_ q D_{KL}(p||q)$')
axes[1].set_ylim(0, 0.8)
axes[1].plot(x, p/2, 'b', label='$p(x)$')
axes[1].plot(x, q_list[KL_qp_min], 'g--', label='$q^*(x)$')
axes[1].set_xlabel('$x$')
axes[1].set_ylabel('$p(x)$')
axes[1].set_title('$q^*= {arg\min}_ q D_{KL}(q||p)$')
for ax in axes:
ax.legend(loc='upper right')
机器学习算法会涉及到⾮常多的随机变量上的概率分布。利⽤分解可以减少表⽰联合分布的成本,于是⽤图来表⽰概率分布的分解,这称为结构化概率模型 (Structured Probabilistic Model) 或者图模型 (Graphical Model)。
有向图模型 (Directed Model) 的概率可以因子分解$ P(x) = P(x_1, \ldots,x_i , \ldots) = \prod_i P(x_i | PA(x_i))$,其中 P A ( x i ) PA(x_i) PA(xi) 是 x i x_i xi 的父节点,单个因⼦ P ( x i ∣ P A ( x i ) ) P(x_i|PA(x_i)) P(xi∣PA(xi)) 称为条件概率分布 (CPD)。示例如下图所示,有:
P ( a , b , c , d , e ) = P ( a ) P ( b ∣ a ) P ( c ∣ a , b ) P ( d ∣ b ) P ( e ∣ c ) P(a, b, c, d, e) = P(a)P(b | a)P(c | a, b)P(d | b)P(e | c) P(a,b,c,d,e)=P(a)P(b∣a)P(c∣a,b)P(d∣b)P(e∣c)
有向图的代表是贝叶斯网。贝叶斯⽹与朴素贝叶斯模型建⽴在相同的直观假设上:通过利用分布的条件独立性来获得紧凑而自然的表示。贝叶斯⽹核⼼是⼀个有向无环图(DAG),其节点为论域中的随机变量,节点间的有向箭头表⽰这两个节点的依赖关系。
贝叶斯网可以看作是各特征节点间的依赖关系图 (有向无环图表示) 和各特征节点相对其依赖节点的条件概率表。 根据节点依赖关系构成有向⽆环图,进⽽引申出每个节点的条件概率分布来表征其对⽗节点的依赖。
有向无环图三种基本结构:同父(tail-to-tail)、V型(head-to-head)、顺序(head-to-tail)。
贝叶斯网的独立性
**局部独立性:**给定父节点条件下,每个节点都独⽴于它的非后代节点。例如,给定⽗节点 c c c 时, e e e 与⽹中其他节点条件独⽴$\Longrightarrow (e \perp a, b, d | c) $,只跟父有关系
全局独立性 (d - 分离):d - 分离是⽤来判断变量是否条件独⽴的图形化⽅法。它常见于以下三种条件独⽴的情况:(这里用到了边缘概率)
考虑复杂有向无环图 (DAG)时, A,B,C 是三个节点集合(可以是单个节点) 。
判断 A 和 B 是否是 C 条件独立的,考虑图中所有 A 和 B 之间的路径。
对⼀条路径,如果它满足以下两个条件中的任意⼀条,则称这条路径是阻塞 (block) 的:
路径中存在某个节点 X 是 head-to-tail 或 tail-to-tail 节点,并且 X 是包含在 C 中的(即X做观察点);
(因为head-to-tail、tail-to-tail ,是在中间节点作为观察点时,满足两端节点是中间节点条件独立的。)
同父(tail-to-tail):
⟹ \Longrightarrow ⟹ 若 c c c作为观察点,可得 P ( a , b ∣ c ) = P ( a , b , c ) P ( c ) = P ( a ∣ c ) P ( b ∣ c ) P(a,b|c) = \frac{P(a,b,c)} {P(c)} = P(a| c)P(b | c) P(a,b∣c)=P(c)P(a,b,c)=P(a∣c)P(b∣c),于是 a 和 b 是 c 条件下独立的。
⟹ \Longrightarrow ⟹若 c c c 作为观察点,可得$ P(a, b | c) = \frac{P(a,b,c)}
{P©} =\frac{P(a)P(c|a)P(b|c)}{P©} = P(a | c)P(b | c)$,于是 a 和 b 是 c 条件下独立的。
路径中存在某个节点 X 是 head-to-head 节点,并且 X 或 X 的儿子是不包含在 C 中的。
(因为 head-to-head,是在中间节点不作观察点时,满足两端节点是中间节点条件独立的。)
如果 A,B 间所有的路径都是阻塞的,那么 A,B 就是关于 C 条件独⽴的;否则 A,B 不是关于 C 条件独⽴的。
import networkx as nx
from pgmpy.models import BayesianModel
from pgmpy.factors.discrete import TabularCPD
import matplotlib.pyplot as plt
%matplotlib inline
# 建立一个简单贝叶斯模型框架
model = BayesianModel([('a', 'b'), ('a', 'c'), ('b', 'c'), ('b', 'd'), ('c', 'e')])
# 最顶层的父节点的概率分布表
cpd_a = TabularCPD(variable='a', variable_card=2, values=[[0.6, 0.4]]) # a: (0,1)
# 其它各节点的条件概率分布表(行对应当前节点索引,列对应父节点索引)
cpd_b = TabularCPD(variable='b', variable_card=2, # b: (0,1)
values=[[0.75, 0.1],
[0.25, 0.9]],
evidence=['a'],
evidence_card=[2])
cpd_c = TabularCPD(variable='c', variable_card=3, # c: (0,1,2)
values=[[0.3, 0.05, 0.9, 0.5],
[0.4, 0.25, 0.08, 0.3],
[0.3, 0.7, 0.02, 0.2]],
evidence=['a', 'b'],
evidence_card=[2, 2])
cpd_d = TabularCPD(variable='d', variable_card=2, # d: (0,1)
values=[[0.95, 0.2],
[0.05, 0.8]],
evidence=['b'],
evidence_card=[2])
cpd_e = TabularCPD(variable='e', variable_card=2, # e: (0,1)
values=[[0.1, 0.4, 0.99],
[0.9, 0.6, 0.01]],
evidence=['c'],
evidence_card=[3])
# 将各节点的概率分布表加入网络
model.add_cpds(cpd_a, cpd_b, cpd_c, cpd_d, cpd_e)
# 验证模型数据的正确性
print(u"验证模型数据的正确性:",model.check_model())
# 绘制贝叶斯图 (节点 + 依赖关系)
nx.draw(model, with_labels=True, node_size=1000, font_weight='bold', node_color='y', \
pos={"e":[4,3],"c":[4,5],"d":[8,5],"a":[2,7],"b":[6,7]})
plt.text(2,7,model.get_cpds("a"), fontsize=10, color='b')
plt.text(5,6,model.get_cpds("b"), fontsize=10, color='b')
plt.text(1,4,model.get_cpds("c"), fontsize=10, color='b')
plt.text(4.2,2,model.get_cpds("e"), fontsize=10, color='b')
plt.text(7,3.4,model.get_cpds("d"), fontsize=10, color='b')
plt.show()
⽆向图模型 (Undirected Model) 的概率可以记作 P ( x ) = 1 Z ∏ C ∈ Q ϕ C x C P(x) = \frac{1}{Z}\prod_{C\in Q}\phi_Cx_C P(x)=Z1∏C∈QϕCxC。其中,我们将所有节点都彼此联通的集合称作团 ,$ \phi$ 称作 因子,每个因子和⼀个团 C C C 相对应,$Z $是归⼀化常数。⽰例如下图所⽰,有 P ( a , b , c , d , e ) = 1 Z ϕ ( 1 ) ( a , b , c ) ϕ ( 2 ) ( b , d ) ϕ ( 3 ) ( c , e ) P(a, b, c, d, e) = \frac{1}{Z}\phi^{(1)}(a, b, c)\phi^{(2)}(b, d)\phi^{(3)}(c, e) P(a,b,c,d,e)=Z1ϕ(1)(a,b,c)ϕ(2)(b,d)ϕ(3)(c,e)。
无向图的代表是马尔可夫网,节点间的依赖关系是无向的(相互平等的关系),无法用条件概率分布来表示,为此为引⼊极大团概念,进而为每个极大团引⼊⼀个势函数作为因子,然后将联合概率分布表示成这些因子的乘积再归⼀化,归⼀化常数被称作配分函数。
团: 假设⼀个特征集的任何两个特征都相互关联,那么这个特征集的联合概率分布是⽆法简化的,我们称这样的特征集为团。
极大团: 如果⼀个团不能被其他团包含,那么我们称这个团为极⼤团。
对于具有$ n $个特征变量 x = ( x 1 , … , x n ) x = (x_1,\ldots, x_n) x=(x1,…,xn) 的马尔可夫⽹的所有极⼤团构成的集合 Q Q Q,与极⼤团 C ∈ Q C \in Q C∈Q 对应的属性变量集合记作 x C x_C xC,那么马尔可夫网 P ( x ) P(x) P(x) 可以写成因⼦分解的形式:
P ( x ) = 1 Z ∏ C ∈ Q ϕ C ( x C ) Z = ∑ x ∏ C ∈ Q ϕ C ( x C ) P(x) =\frac{1}{Z}\prod C\in Q \phi _C(x_C) \\ Z = \sum_x \prod_{C\in Q} \phi_C(x_C) P(x)=Z1∏C∈QϕC(xC)Z=x∑C∈Q∏ϕC(xC)
其中 ϕ C \phi_C ϕC 就是极大团$ C 对 应 的 势 函 数 ( 因 子 ) , ⽤ 于 对 极 ⼤ 团 对应的势函数 (因子),⽤于对极⼤团 对应的势函数(因子),⽤于对极⼤团C$ 内的特征变量关系进⾏建模,必须为正。Z 为归⼀化因⼦ (配分函数),就是对势函数乘积的所有属性变量求和求积分,使 P 成为概率。此时势函数可以写作$ \phi(x_C) = \exp(−E(x_C)) , 其 中 ,其中 ,其中E$ 为能量函数,我们也称 P ( x ) P(x) P(x) 是由因⼦ 集$ {\phi_C | C \in Q}$ 参数化的吉布斯分布 (Gibbs Distribution) 或玻尔兹曼分布 (Boltzmann Distribution)。于是,示例的马尔可夫网的联合概率分布可写成:
P ( a , b , c , d , e ) = 1 Z ϕ a , b , c ( a , b , c ) ϕ b , d ( b , d ) ϕ c , e ( c , e ) P(a, b, c, d, e) = \frac{1} {Z} \phi_{a,b,c}(a, b, c)\phi_{b,d}(b, d)\phi_{c,e}(c, e) P(a,b,c,d,e)=Z1ϕa,b,c(a,b,c)ϕb,d(b,d)ϕc,e(c,e)
马尔可夫网的条件独立性
马尔可夫⽹的有向分离,能引出条件独⽴性 (相对分离集),这就是全局马尔可夫性。
由全局马尔可夫性可以容易推导出两个推论:
局部马尔可夫性:将节点 v ∈ V v \in V v∈V 的所有邻接节点集作为分离集 N ( v ) ⊂ V N(v) \subset V N(v)⊂V,于是该节点 $v 与 被 邻 接 变 量 集 分 离 的 剩 余 变 量 集 ( ∗ ∗ 节 点 与被邻接变量集分离的剩余变量集(**节点 与被邻接变量集分离的剩余变量集(∗∗节点v$的非邻接变量集**)是条件独立的(相对 N ( v ) N(v) N(v) ⽽⾔)。
x v ⊥ x V ∖ N ∗ ( v ) ∣ x N ( v ) , N ∗ ( v ) = N ( v ) ∪ { v } x_v \bot x_{V\setminus N^∗(v)}| x_{N(v)}, N^∗(v) = N(v)\cup \{v\} xv⊥xV∖N∗(v)∣xN(v),N∗(v)=N(v)∪{v}
成对马尔可夫性:两个非邻接节点 u , v ∈ V u, v \in V u,v∈V,必然可以被其他所有节点构成的集 x V ∖ { u , v } x_{V\setminus\{u,v\}} xV∖{u,v} 分离,进而 u , v u, v u,v 也具有条件独立性 (相对前面指定的节点集)。
x u ⊥ x v ∣ x V ∖ { u , v } , u , v ∉ E , E 是 边 集 x_u \bot x_v | x_{V\setminus\{u,v\}}, {u, v} \notin E, E是边集 xu⊥xv∣xV∖{u,v},u,v∈/E,E是边集
import networkx as nx
from pgmpy.models import MarkovModel
from pgmpy.factors.discrete import DiscreteFactor
import matplotlib.pyplot as plt
%matplotlib inline
# 建立一个简单马尔科夫网
model = MarkovModel([('a', 'b'), ('a', 'c'), ('b', 'c'),('b', 'd'), ('c', 'e')])
# 各团因子 (参数随机选择)
factor_abc = DiscreteFactor(['a', 'b', 'c'], cardinality=[2,2,2], values=np.random.rand(8))
factor_bd = DiscreteFactor(['b', 'd'], cardinality=[2,2], values=np.random.rand(4))
factor_ce = DiscreteFactor(['c', 'e'], cardinality=[2,2], values=np.random.rand(4))
# 将各团因子加入网络
model.add_factors(factor_abc,factor_bd,factor_ce)
# 验证模型数据的正确性
print(u"验证模型数据的正确性:",model.check_model())
# # 绘制贝叶斯图 (节点 + 依赖关系)
nx.draw(model, with_labels=True, node_size=1000, font_weight='bold', node_color='y', \
pos={"e":[4,3],"c":[4,5],"d":[8,5],"a":[2,7],"b":[6,7]})
plt.text(2,7,model.get_factors()[0], fontsize=10, color='b')
plt.text(7,3.4,model.get_factors()[1], fontsize=10, color='b')
plt.text(4.2,2,model.get_factors()[2], fontsize=10, color='b')
plt.show()
import numpy, scipy, matplotlib, networkx, pgmpy
print("numpy:", numpy.__version__)
print("scipy:", scipy.__version__)
print("matplotlib:", matplotlib.__version__)
print("networkx:", networkx.__version__)
print("pgmpy:", pgmpy.__version__)
ze=1000, font_weight=‘bold’, node_color=‘y’,
pos={“e”:[4,3],“c”:[4,5],“d”:[8,5],“a”:[2,7],“b”:[6,7]})
plt.text(2,7,model.get_factors()[0], fontsize=10, color=‘b’)
plt.text(7,3.4,model.get_factors()[1], fontsize=10, color=‘b’)
plt.text(4.2,2,model.get_factors()[2], fontsize=10, color=‘b’)
plt.show()
```python
import numpy, scipy, matplotlib, networkx, pgmpy
print("numpy:", numpy.__version__)
print("scipy:", scipy.__version__)
print("matplotlib:", matplotlib.__version__)
print("networkx:", networkx.__version__)
print("pgmpy:", pgmpy.__version__)