EM算法解决含隐变量的掷硬币问题
数据挖掘十大经典算法–EM算法(详解+代码)
适用场景:用于含有隐变量的概率模型参数的极大似然估计,或者极大后验概率估计
先对隐变量和极大似然估计做出解释
考虑这样两个问题:
1、抛一枚硬币,假设正面向上的概率是 θ \theta θ,先对其进行了10次试验,结果为8次正面,2次反面。
2、有三枚硬币A,B,C,其正面向上的概率分别为 π \pi π, p p p, q q q,现进行10次实验,先掷硬币A,若A为正面,则掷出B,否者掷出C,记录最终的掷硬币结果,现已知实验的观测结果为6次正面,4次反面。
背景知识
隐变量
可以看出,问题2比问题1多出一个中间过程,以投掷A硬币的结果取确定投掷B,C,并对最终结果产生影响。但是在实验过程中只知道最终结果,不知道这一中间结果。隐变量就是这一会对最终结果产生影响的中间结果。
极大似然估计
利用已知样本的结果信息,反推最具有可能导致这些样本结果出现的模型的参数值。步骤为:
- 写出似然函数
- 对似然函数取对数并整理
- 求导数,并令其等于0
- 解似然方程
极大似然估计的使用在总体为离散型和连续性时有一定的差别
1、离散型
若总体
x
x
x为离散型,其概率分布列为
P
{
X
=
x
}
=
p
(
x
i
,
θ
)
P\begin{Bmatrix}X=x\end{Bmatrix}=p(x_i,\theta)
P{X=x}=p(xi,θ)
其中
θ
\theta
θ为未知参数,设
(
X
1
,
X
2
⋯
,
X
n
)
(X_1,X_2\cdots,X_n)
(X1,X2⋯,Xn)为取自总体的样本容量为
n
n
n的一个样本,则
(
X
1
,
X
2
⋯
,
X
n
)
(X_1,X_2\cdots,X_n)
(X1,X2⋯,Xn)的联合分布律为
∏
i
=
1
n
p
(
x
i
,
θ
)
\prod_{i=1}^{n}p(x_i,\theta)
∏i=1np(xi,θ)。
联合分布律:多维随机变量的分布律
例: F ( x , y ) = P { ( X ≤ x ) ⋂ ( Y ≤ y ) } F(x,y)=P\begin{Bmatrix}(X\le x)\bigcap(Y\le y)\end{Bmatrix} F(x,y)=P{(X≤x)⋂(Y≤y)} 分布律的表达形式为 p ( X ≤ x , Y ≤ y ) p(X\le x,Y\le y) p(X≤x,Y≤y)
设
(
X
1
,
X
2
⋯
,
X
n
)
(X_1,X_2\cdots,X_n)
(X1,X2⋯,Xn)的一组观测值为
(
x
1
,
x
2
⋯
,
x
n
)
(x_1,x_2\cdots,x_n)
(x1,x2⋯,xn),则样本
(
X
1
,
X
2
⋯
,
X
n
)
(X_1,X_2\cdots,X_n)
(X1,X2⋯,Xn)取观测值
(
x
1
,
x
2
⋯
,
x
n
)
(x_1,x_2\cdots,x_n)
(x1,x2⋯,xn)的概率为:
L
(
θ
)
=
L
(
x
1
,
x
2
⋯
x
n
;
θ
)
=
∏
i
=
1
n
p
(
x
i
,
θ
)
L(\theta)=L(x_1,x_2\cdots x_n;\theta)=\prod_{i=1}^{n}p(x_i,\theta)
L(θ)=L(x1,x2⋯xn;θ)=i=1∏np(xi,θ)
这一概率随
θ
\theta
θ的取值未改变,它是
θ
\theta
θ的函数,称
L
(
θ
)
L(\theta)
L(θ)为样本的似然函数
2、连续性
若总体X为连续型,其概率密度函数为 f ( x ; θ ) f(x;\theta) f(x;θ),其中 θ \theta θ为未知参数。,设 ( X 1 , X 2 ⋯ , X n ) (X_1,X_2\cdots,X_n) (X1,X2⋯,Xn)为取自总体的样本容量为 n n n的一个样本,则 ( X 1 , X 2 ⋯ , X n ) (X_1,X_2\cdots,X_n) (X1,X2⋯,Xn)的联合联合概率密度为 ∏ i = 1 n f ( x i , θ ) \prod_{i=1}^{n}f(x_i,\theta) ∏i=1nf(xi,θ)。
联合概率密度:对于二元随机变量 ( X , Y ) (X,Y) (X,Y)的分布函数 F ( x , y ) F(x,y) F(x,y),如果存在非负函数 f ( x , y ) f(x,y) f(x,y),使得对于任意 x x x, y y y,都有
F ( x , y ) = ∫ − ∞ x ∫ − ∞ y f ( u , v ) d u d v F(x,y)=\int_{-\infty}^{x}\int_{-\infty}^{y}f(u,v)dudv F(x,y)=∫−∞x∫−∞yf(u,v)dudv
称 ( X , Y ) (X,Y) (X,Y)为二元连续型随机变量, f ( x , y ) f(x,y) f(x,y)为二元随机变量 ( X , Y ) (X,Y) (X,Y)的联合概率密度函数
设
(
X
1
,
X
2
⋯
,
X
n
)
(X_1,X_2\cdots,X_n)
(X1,X2⋯,Xn)的一组观测值为
(
x
1
,
x
2
⋯
,
x
n
)
(x_1,x_2\cdots,x_n)
(x1,x2⋯,xn),则随机点
(
X
1
,
X
2
⋯
,
X
n
)
(X_1,X_2\cdots,X_n)
(X1,X2⋯,Xn)落在点
(
x
1
,
x
2
⋯
,
x
n
)
(x_1,x_2\cdots,x_n)
(x1,x2⋯,xn)的邻边内的概率近似地为
∏
i
=
1
n
f
(
x
i
,
θ
)
d
x
i
\prod_{i=1}^{n}f(x_i,\theta)dx_i
∏i=1nf(xi,θ)dxi
L
(
θ
)
=
L
(
x
1
,
x
2
⋯
x
n
;
θ
)
=
∏
i
=
1
n
f
(
x
i
,
θ
)
L(\theta)=L(x_1,x_2\cdots x_n;\theta)=\prod_{i=1}^{n}f(x_i,\theta)
L(θ)=L(x1,x2⋯xn;θ)=i=1∏nf(xi,θ)
L
(
θ
)
L(\theta)
L(θ)为样本的似然函数
极大似然估计就是,固定样本观测值
(
x
1
,
x
2
⋯
,
x
n
)
(x_1,x_2\cdots,x_n)
(x1,x2⋯,xn),挑选
θ
\theta
θ使得:
L
(
x
1
,
x
2
⋯
x
n
;
θ
)
=
max
L
(
x
1
,
x
2
⋯
x
n
;
θ
)
L(x_1,x_2\cdots x_n;\theta)=\max L(x_1,x_2\cdots x_n;\theta)
L(x1,x2⋯xn;θ)=maxL(x1,x2⋯xn;θ)
这样的
θ
^
\hat \theta
θ^与样本值有关,
θ
^
(
x
1
,
x
2
⋯
,
x
n
)
\hat \theta(x_1,x_2\cdots,x_n)
θ^(x1,x2⋯,xn)称为参数
θ
\theta
θ的极大似然估计,其对应的统计量
θ
^
(
X
1
,
X
2
⋯
,
X
n
)
\hat \theta(X_1,X_2\cdots,X_n)
θ^(X1,X2⋯,Xn)称为
θ
\theta
θ的极大似然估计量。
求解
θ
^
\hat \theta
θ^:利用
ln
L
(
θ
)
\ln L(\theta)
lnL(θ)是
L
(
θ
)
L(\theta)
L(θ)的增函数,故
ln
L
(
θ
)
\ln L(\theta)
lnL(θ)和
L
(
θ
)
L(\theta)
L(θ)在同一点处达到最大值,于是对于似然函数
L
(
θ
)
L(\theta)
L(θ)取对数,利用微分学知识转换为求解对数似然方程
∂
ln
L
(
θ
)
∂
θ
j
=
0
,
j
=
1
,
2
⋯
k
\frac{\partial{\ln L(\theta)}}{\partial{\theta _j}}=0,j=1,2\cdots k
∂θj∂lnL(θ)=0,j=1,2⋯k
求解
θ
\theta
θ的值
极大似然估计求解问题1
例:抛一枚硬币,假设正面向上的概率是 θ \theta θ,先对其进行了10次试验,结果为8次正面,2次反面。求 θ \theta θ的极大似然估计。
解:先写出似然函数:
L
(
θ
)
=
θ
8
(
1
−
θ
)
2
L(\theta)=\theta^8(1-\theta)^2
L(θ)=θ8(1−θ)2
似然函数对
θ
\theta
θ求导数,并令其等于0:
∂
ln
L
(
θ
)
∂
θ
=
θ
7
(
1
−
θ
)
(
8
−
10
θ
)
=
0
\frac{\partial{\ln L(\theta)}}{\partial{\theta }}=\theta^7(1-\theta)(8-10\theta)=0
∂θ∂lnL(θ)=θ7(1−θ)(8−10θ)=0
解得:
θ
^
=
0.8
\hat\theta=0.8
θ^=0.8
在该问题中,解
θ
^
\hat\theta
θ^的过程可以简化为如下:
θ
^
=
arg
max
θ
L
(
θ
)
\hat\theta=\arg \max_\theta L(\theta)
θ^=argθmaxL(θ)
argmax:设 y = f ( t ) y=f(t) y=f(t)在对应一个 t t t值时会唯一确定一个 y y y值
则:
y = max f ( t ) y=\max f(t) y=maxf(t),此时 y y y的取值为 f ( t ) f(t) f(t)的最大的output
y = arg max f ( t ) y=\arg\max f(t) y=argmaxf(t),此时 y y y的取值为 f ( t ) f(t) f(t)的最大的input
例:
设函数 f ( t ) , t ∈ ( 0 , 1 , 2 ) f(t),t\in(0,1,2) f(t),t∈(0,1,2),此时 f ( t = 0 ) = 10 f(t=0)=10 f(t=0)=10, f ( t = 1 ) = 20 f(t=1)=20 f(t=1)=20, f ( t = 2 ) = 7 f(t=2)=7 f(t=2)=7
则 y = max f ( t ) = 20 y=\max f(t)=20 y=maxf(t)=20, y = arg max f ( t ) = 1 y=\arg\max f(t)=1 y=argmaxf(t)=1
凹函数与凸函数
中国大陆数学界某些机构关于函数凹凸性定义和国外的定义是相反的。这里使用向下方向为凸,来定义凸函数。
凸函数的主要性质有:
1.若 f f f为定义在凸集 S S S上的凸函数,则对任意实数 β ≥ 0 \beta\ge0 β≥0,函数 β f βf βf也是定义在 S S S上的凸函数;
2.若 f 1 f_1 f1和 f 2 f_2 f2为定义在凸集 S S S上的两个凸函数,则其和 f = f 1 + f 2 f=f_1+f_2 f=f1+f2仍为定义在 S S S上的凸函数;
3.若 f i ( i = 1 , 2 ⋯ m ) f_i(i=1,2\cdots m) fi(i=1,2⋯m)为定义在凸集 S S S上的凸函数,则对任意实数 β i ≥ 0 \beta_i\ge0 βi≥0,函数 β i f i β_if_i βifi也是定义在 S S S上的凸函数;
4.若 f f f为定义在凸集 S S S上的凸函数,则对每一实数 c c c,水平集 S c = { x ∣ x ∈ S , f ( x ) ≤ c } Sc=\{x|x\in S,f(x)\le c\} Sc={x∣x∈S,f(x)≤c}是凸集.
5.对于凸函数来说,局部最小值就是全局最小值。
对数似然函数
因为似然函数 L ( θ ) L(\theta) L(θ)不是凹函数,求解其极大值时较为困难,所以一般使用与其具有相同单调性的log-likelihood
即原似然方程:
θ
^
=
arg
max
θ
L
(
θ
)
\hat\theta=\arg \max_\theta L(\theta)
θ^=argθmaxL(θ)
转换为对数似然方程:
θ
^
=
arg
max
θ
log
L
(
θ
)
\hat\theta=\arg \max_\theta \log L(\theta)
θ^=argθmaxlogL(θ)
EM算法
EM算法(Expectation-Maximum)分为两步,即
- 期望(E)
- 最大化(M)
输入:观测变量数据 Y Y Y,隐变量数据 Z Z Z,联合分布 P ( Y , Z ∣ θ ) P(Y,Z|\theta) P(Y,Z∣θ),条件分布 P ( Z ∣ Y , θ ) P(Z|Y,\theta) P(Z∣Y,θ)
输出:模型参数 θ \theta θ
-
选择参数处置 θ ( 0 ) \theta^{(0)} θ(0)开始迭代
-
E步骤:记 θ ( i ) \theta^{(i)} θ(i)为第 i i i次迭代参数 θ \theta θ的估计值,在第 i + 1 i+1 i+1次迭代的E步,计算:
Q ( θ , θ ( i ) ) = E z [ log P ( Y , Z ∣ θ ) ∣ Y , θ ( i ) ] = ∑ z log P ( Y , Z ∣ θ ) P ( z ∣ Y , θ ( i ) ) Q(\theta,\theta^{(i)})=E_z[\log P(Y,Z|\theta)|Y,\theta^{(i)}]\\ =\sum_z{\log P(Y,Z|\theta)P(z|Y,\theta^{(i)})} Q(θ,θ(i))=Ez[logP(Y,Z∣θ)∣Y,θ(i)]=z∑logP(Y,Z∣θ)P(z∣Y,θ(i))
这里 P ( z ∣ Y , θ ( i ) ) P(z|Y,\theta^{(i)}) P(z∣Y,θ(i))是在给定观测数据 Y Y Y和当前的参数估计 θ ( i ) \theta^{(i)} θ(i)下隐变量数据 z z z的条件概率分布。
-
M步骤:求使得 Q ( θ , θ ( i ) ) Q(\theta,\theta^{(i)}) Q(θ,θ(i))极大化的 θ \theta θ,确定第 i + 1 i+1 i+1次迭代的参数的估计值 θ ( i + 1 ) \theta^{(i+1)} θ(i+1)
θ ( i + 1 ) = arg max θ Q ( θ , θ ( i ) ) \theta^{(i+1)}=\arg \max_\theta Q(\theta,\theta^{(i)}) θ(i+1)=argθmaxQ(θ,θ(i)) -
重复上两步直至收敛
其中 Q Q Q函数为EM算法的核心
Q
Q
Q函数:完全数据的对数似然函数
log
P
(
Y
,
Z
∣
θ
)
\log P(Y,Z|\theta)
logP(Y,Z∣θ)关于在给定观测数据
Y
Y
Y和当前参数
θ
(
i
)
\theta^{(i)}
θ(i)下对未观测数据
Z
Z
Z的条件概率分布
P
(
Y
,
Z
∣
θ
(
i
)
)
P(Y,Z|\theta ^{(i)})
P(Y,Z∣θ(i))的期望称为
Q
Q
Q函数,即:
Q
(
θ
,
θ
(
i
)
)
=
E
z
[
log
P
(
Y
,
Z
∣
θ
)
∣
Y
,
θ
(
i
)
]
Q(\theta,\theta^{(i)})=E_z[\log P(Y,Z|\theta)|Y,\theta^{(i)}]
Q(θ,θ(i))=Ez[logP(Y,Z∣θ)∣Y,θ(i)]
EM算法的几点说明:
-
参数初值可以任意选择,但需注意EM算法对初值是敏感的。
-
E步骤求 Q ( θ , θ ( i ) ) Q(\theta,\theta^{(i)}) Q(θ,θ(i)), Q Q Q函数式中 Z Z Z是未观测数据, Y Y Y是观测数据。注意, Q ( θ , θ ( i ) ) Q(\theta,\theta^{(i)}) Q(θ,θ(i))的第一个变元表示要极大化的参数,第二个变元表示参数的当前估计值。每次迭代实际上在求Q函数及其极大。
-
M步骤求 Q ( θ , θ ( i ) ) Q(\theta,\theta^{(i)}) Q(θ,θ(i))的极大化,得到 θ ( i + 1 ) \theta^{(i+1)} θ(i+1),完成一次 θ ( i ) → θ ( i + 1 ) \theta^{(i)}\rightarrow\theta^{(i+1)} θ(i)→θ(i+1)。
-
各处停止迭代的条件,一般是对较小的正数 ξ 1 \xi_1 ξ1, ξ 2 \xi_2 ξ2,若满足
∣ ∣ θ ( i + 1 ) − θ ( i ) ∣ ∣ < ξ 1 或 ∣ ∣ Q ( θ ( i + 1 ) , θ ( i ) ) − Q ( θ ( i ) , θ ( i ) ) ∣ ∣ < ξ 2 ||\theta^{(i+1)} - \theta^{(i)}||\lt\xi_1 \ 或 \ ||Q(\theta^{(i+1)},\theta^{(i)})-Q(\theta^{(i)},\theta^{(i)})||\lt\xi_2 ∣∣θ(i+1)−θ(i)∣∣<ξ1 或 ∣∣Q(θ(i+1),θ(i))−Q(θ(i),θ(i))∣∣<ξ2
则停止迭代
例:有三枚硬币A,B,C,其正面向上的概率分别为
π
\pi
π,
p
p
p,
q
q
q,现进行10次实验,先掷硬币A,若A为正面,则掷出B,否者掷出C,记录最终的掷硬币结果,现已知实验的观测结果为1,1,0,1,0,0,1,0,1,1
。估算三枚硬币正面出现的概率。
解:设
y
y
y未观测变量(结果),
z
z
z未隐变量(A的正反面),
θ
\theta
θ为模型参数
(
π
,
p
,
q
)
(\pi,p,q)
(π,p,q)
L
(
θ
)
=
∑
z
P
(
y
,
z
∣
θ
)
=
∑
z
P
(
z
∣
θ
)
P
(
y
∣
z
,
θ
)
=
π
p
y
(
1
−
p
)
(
1
−
y
)
+
(
1
−
π
)
q
y
(
1
−
q
)
(
1
−
y
)
L(\theta)=\sum_z{P(y,z|\theta)}=\sum_zP(z|\theta)P(y|z,\theta)\\ =\pi p^y(1-p)^{(1-y)}+(1-\pi)q^y(1-q)^{(1-y)}
L(θ)=z∑P(y,z∣θ)=z∑P(z∣θ)P(y∣z,θ)=πpy(1−p)(1−y)+(1−π)qy(1−q)(1−y)
将观测数据表示为
Y
=
(
Y
1
,
Y
2
⋯
Y
n
)
T
Y=(Y_1,Y_2\cdots Y_n)^T
Y=(Y1,Y2⋯Yn)T,为观测到的数据表示为
Z
=
(
Z
1
,
Z
2
⋯
Z
n
)
T
Z=(Z_1,Z_2\cdots Z_n)^T
Z=(Z1,Z2⋯Zn)T,则观测数据的似然函数为:
L
(
θ
)
=
P
(
Y
,
θ
)
=
∑
z
P
(
z
∣
θ
)
P
(
Y
∣
Z
,
θ
)
L(\theta)=P(Y,\theta)=\sum_zP(z|\theta)P(Y|Z,\theta)
L(θ)=P(Y,θ)=z∑P(z∣θ)P(Y∣Z,θ)
即:
P
(
Y
,
θ
)
=
∏
j
=
1
n
[
π
p
y
i
(
1
−
p
)
1
−
y
i
+
(
1
−
π
)
q
y
i
(
1
−
q
)
1
−
y
i
]
P(Y,\theta)=\prod_{j=1}^{n}[\pi p^{y_i}(1-p)^{1-y_i}+(1-\pi)q^{y_i}(1-q)^{1-y_i}]
P(Y,θ)=j=1∏n[πpyi(1−p)1−yi+(1−π)qyi(1−q)1−yi]
求模型参数
θ
=
(
π
,
p
,
q
)
\theta=(\pi,p,q)
θ=(π,p,q)的极大似然估计即:
θ
^
=
arg
max
θ
log
P
(
Y
∣
θ
)
\hat\theta=\arg\max_\theta\log P(Y|\theta)
θ^=argθmaxlogP(Y∣θ)
迭代求解上述过程:
选取模型参数初值 θ ( 0 ) = ( π ( 0 ) , p ( 0 ) , q ( 0 ) ) \theta^{(0)}=(\pi^{(0)},p^{(0)},q^{(0)}) θ(0)=(π(0),p(0),q(0)),第 i i i次迭代时参数为 θ ( i ) = ( π ( i ) , p ( i ) , q ( i ) ) \theta^{(i)}=(\pi^{(i)},p^{(i)},q^{(i)}) θ(i)=(π(i),p(i),q(i)),则第 i + 1 i+1 i+1次迭代:
E步骤:计算在模型参数 π ( i ) , p ( i ) , q ( i ) \pi^{(i)},p^{(i)},q^{(i)} π(i),p(i),q(i)下观测数据 y j y_j yj来自掷硬币B的概率
设:
A
=
π
(
i
)
(
p
(
i
)
)
j
y
(
1
−
p
(
i
)
)
(
1
−
y
j
)
B
=
(
1
−
π
(
i
)
)
(
q
(
i
)
)
j
y
(
1
−
q
(
i
)
)
(
1
−
y
j
)
A=\pi^{(i)} (p^{(i)})^y_j(1-p^{(i)})^{(1-y_j)}\\ B=(1-\pi^{(i)})(q^{(i)})^y_j(1-q^{(i)})^{(1-y_j)}\\
A=π(i)(p(i))jy(1−p(i))(1−yj)B=(1−π(i))(q(i))jy(1−q(i))(1−yj)
则E步骤:
μ
j
(
i
+
1
)
=
A
A
+
B
\mu_j^{(i+1)}=\frac {A}{A+B}
μj(i+1)=A+BA
M步骤:计算模型参数的新估计值:
π
(
i
+
1
)
=
1
n
∑
j
=
1
n
μ
j
(
i
+
1
)
\pi^{(i+1)}=\frac{1}{n}\sum_{j=1}^n\mu_j^{(i+1)}
π(i+1)=n1j=1∑nμj(i+1)
p ( i + 1 ) = ∑ j = 1 n μ j ( i + 1 ) y j ∑ j = 1 n μ j ( i + 1 ) p^{(i+1)}=\frac{\sum_{j=1}^{n}\mu_j^{(i+1)}y_j}{\sum_{j=1}^{n}\mu_j^{(i+1)}} p(i+1)=∑j=1nμj(i+1)∑j=1nμj(i+1)yj
q ( i + 1 ) = ∑ j = 1 n ( 1 − μ j ( i + 1 ) ) y j ∑ j = 1 n ( 1 − μ j ( i + 1 ) ) q^{(i+1)}=\frac{\sum_{j=1}^{n}(1-\mu_j^{(i+1)})y_j}{\sum_{j=1}^{n}(1-\mu_j^{(i+1)})} q(i+1)=∑j=1n(1−μj(i+1))∑j=1n(1−μj(i+1))yj
迭代到满足设置条件
代码
EM算法的思路即为上面的内容,现使用python实现问题二的求解:
"""
@File:EM.py
@Date:2021/5/9 16:39
@Author:博0_oer~
"""
def EM(observation, theta):
new_theta = [] # 模型参数结果
theta_pi = theta[0] # A的几率
theta_p = theta[1] # B的几率
theta_q = theta[2] # C的几率
for obs in observation:
mu_j_list = []
for y in obs:
A = theta_pi * theta_p ** y * (1 - theta_p) ** (1 - y)
B = (1 - theta_pi) * theta_q ** y * (1 - theta_q) ** (1 - y)
L_theta = A + B
mu_j = A / L_theta
mu_j_list.append(mu_j)
theta_pi = 1 / len(obs) * sum(mu_j_list)
p_mol = 0
q_mol = 0
p_den = 0
q_den = 0
for i in range(len(obs)):
p_mol += int(obs[i]) * mu_j_list[i]
p_den += mu_j_list[i]
q_mol += int(obs[i]) * (1 - mu_j_list[i])
q_den += (1 - mu_j_list[i])
theta_p = p_mol / p_den
theta_q = q_mol / q_den
new_theta.append(round(theta_pi, 4))
new_theta.append(round(theta_p, 4))
new_theta.append(round(theta_q, 4))
return new_theta
def iteration(observation, theta, iter_time):
theta_new = theta
for i in range(iter_time):
theta_new = EM(observation, theta_new)
print("The result of the {}-th iteration is: pi={}, p={}, q={}"
.format(i + 1, theta_new[0], theta_new[1], theta_new[2]))
return theta_new
if __name__ == '__main__':
observations = [[1, 1, 0, 1, 0, 0, 1, 0, 1, 1]]
thetas = [0.4, 0.6, 0.7]
iter_times = 5
print(iteration(observations, thetas, iter_times))