EM算法最佳实现

参考EM算法
下面给出算法的简化版本。

import numpy as np
import numpy.linalg as LA
 
SIGMA = 6
EPS = 0.0001

#生成方差相同, 均值不同的样本
def generate_data():    
    mu1 = 20
    mu2 = 40
    N = 1000
    X = np.zeros(N)
    for i in range(N):
        temp = np.random.uniform(0, 1) # Z ~ U[0,1]
        if temp > 0.5:
            X[i] = temp*SIGMA + mu1  # X1 = Z * 6 + 20
        else:
            X[i] = temp*SIGMA + mu2  # X2 = Z * 6 + 40
    return X
 

def my_EM(X):
    N = X.shape[0]
    k = 2
    mu = np.random.rand(k)
    Posterior = np.zeros((N, 2))
    #先求后验概率
    for _ in range(1000):
        for i in range(N):
            p = np.exp(-1/(2*SIGMA**2) * (X[i] - mu)**2)
            Posterior[i,:] = p/np.sum(p)
        oldmu = mu.copy()
        #最大化    
        numerator = np.dot(X, Posterior)
        dominator = Posterior.sum(axis=0)
        mu = numerator/dominator
        if LA.norm(mu - oldmu) < EPS:
            return mu
 
if __name__ == '__main__':
    X = generate_data()
    print(my_EM(X)) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值