缺失数据em算法python_EM算法求高斯混合模型參数预计——Python实现

这篇博客介绍了如何使用EM算法(Expectation-Maximization)来估计二维空间中的两个高斯分布参数。通过实例演示了数据初始化、E步计算隐藏变量概率、M步更新均值的过程,并提供了代码实现。最后展示了结果可视化。
摘要由CSDN通过智能技术生成

#coding:gbk

import math

import copy

import numpy as np

import matplotlib.pyplot as plt

isdebug = False

# 指定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))

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 u"初始观測数据X:"

print X

# EM算法:步骤1。计算E[zij]

def e_step(Sigma,k,N):

global Expectations

global Mu

global X

for i in xrange(0,N):

Denom = 0

for j in xrange(0,k):

Denom += math.exp((-1/(2*(float(Sigma**2))))*(float(X[0,i]-Mu[j]))**2)

for j in xrange(0,k):

Numer = math.exp((-1/(2*(float(Sigma**2))))*(float(X[0,i]-Mu[j]))**2)

Expectations[i,j] = Numer / Denom

if isdebug:

print "***********"

print u"隐藏变量E(Z):"

print Expectations

# EM算法:步骤2。求最大化E[zij]的參数Mu

def m_step(k,N):

global Expectations

global X

for j in xrange(0,k):

Numer = 0

Denom = 0

for i in xrange(0,N):

Numer += Expectations[i,j]*X[0,i]

Denom +=Expectations[i,j]

Mu[j] = Numer / Denom

# 算法迭代iter_num次,或达到精度Epsilon停止迭代

def run(Sigma,Mu1,Mu2,k,N,iter_num,Epsilon):

ini_data(Sigma,Mu1,Mu2,k,N)

print u"初始:", Mu

for i in range(iter_num):

Old_Mu = copy.deepcopy(Mu)

e_step(Sigma,k,N)

m_step(k,N)

print i,Mu

if sum(abs(Mu-Old_Mu)) < Epsilon:

break

if __name__ == '__main__':

run(6,40,20,2,1000,1000,0.0001)

plt.hist(X[0,:],50)

plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值