EM算法及其推广(三)
这一部分我们看一个简单的示例。
数据
在这里我们模拟两个正态分布的均值预测。
产生训练数据的程序如下:
# 指定k个高斯分布參数。这里指定k=2。注意2个高斯分布具有同样均方差Sigma,均值分别为Mu1,Mu2。
def ini_data(Sigma,Mu1,Mu2,k,N):
global X #最终的训练数据集
global Mu #对想要预测的均值进行初始化
global Expectations #期望
X = np.zeros((1,N)) #存储生成的训练数据
Mu = np.random.random(2) #随机生成两个值
Expectations = np.zeros((N,k)) #生成N*k的矩阵
for i in xrange(0,N): #生成训练样本
if np.random.random(1) > 0.5:
X[0,i] = np.random.normal()*Sigma + Mu1
else:
X[0,i] = np.random.normal()*Sigma + Mu2
if isdebug:
print("***********")
print("初始观測数据X:")
print(X)
实现
# EM算法:步骤1,计算E[zij]
def e_step(Sigma,k,N):
global Expectations
global Mu
global X
for i in range(0,N):
Denom = 0
for j in range(0,k):
Denom += math.exp((-1/(2*(float(Sigma**2))))*(float