import numpy as np
from scipy.stats import norm
def gmm_em(X ,K=2, max_iter=100, epsilon=1e-4, T = 5):
N = len(X)
print('-----EM optimization for GMM-----')
# EM算法只能保证收敛到稳定点,不能保证收敛至极大值点
# 常用的办法是进行几次迭代,对结果做比较,并选择最好
Mu = []
Sigma = []
for t in range(T):
# 初始化
alpha = np.ones([K, 1]) /K # 权重
mu = np.ones([K, 1]) # 均值
sigma = np.ones([K, 1]) # 标准差
for k in range(K):
n = np.random.randint(K*3, K*30)
x = np.random.choice(X, n)
mu[k][0] = np.mean(x)
sigma[k][0] = np.std(x, ddof = 1)
alpha_, mu_, sigma_ = alpha, mu, sigma
for _iter in range(max_iter):
# expectation 隐变量估计
gamma = np.zeros([K, N])
for k in range(K):
gamma[k] = alpha[k] * norm.pdf(X, loc=mu[k][0], scale=sigma[k][0])
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交