一维数组gmm模型的em算法代码
时间: 2023-05-14 20:00:29 浏览: 137
GMM(高斯混合模型)是一种常用的聚类算法,在机器学习、数据挖掘等领域得到广泛应用。EM算法是GMM模型参数估计的常用方法之一,通过迭代优化模型参数来实现最大似然估计。
以下是一维数组gmm模型的EM算法代码:
# 定义高斯分布函数
def gaussian(x, mean, var):
return (1 / np.sqrt(2 * np.pi * var)) * np.exp(-(x - mean) ** 2 / (2 * var))
# EM算法主函数
def em_gmm(X, n_cluster):
# 初始化模型参数
n_samples = X.shape[0]
weights = np.ones(n_cluster) / n_cluster # 混合系数
means = np.random.choice(X, n_cluster) # 均值
variances = np.ones(n_cluster) # 方差
log_likelihood = 0
# 迭代更新模型参数
while True:
# E步:计算每个样本属于每个分布的概率
likelihood = np.zeros((n_samples, n_cluster)) # 初始化似然
for k in range(n_cluster):
likelihood[:, k] = gaussian(X, means[k], variances[k]) * weights[k]
likelihood_sum = np.sum(likelihood, axis=1) # 计算每个样本的累加概率
likelihood_sum[likelihood_sum == 0] = 1e-6 # 避免除以0出错
responsibility = likelihood / likelihood_sum[:, np.newaxis] # 计算每个样本对每个分布的贡献
# M步:更新模型参数
Nk = np.sum(responsibility, axis=0) # 各分布的样本数
weights = Nk / n_samples # 更新混合系数
means = np.sum(responsibility * X[:, np.newaxis], axis=0) / Nk # 更新均值
for k in range(n_cluster):
variances[k] = np.sum(responsibility[:, k] * (X - means[k]) ** 2) / Nk[k] # 更新方差
# 计算对数似然,判断是否收敛
log_likelihood_new = np.sum(np.log(np.sum(likelihood, axis=1)))
if abs(log_likelihood_new - log_likelihood) < 1e-6:
break
log_likelihood = log_likelihood_new
return weights, means, variances
其中,X为一维数组,n_cluster为设定的高斯分布个数。该代码实现了高斯混合模型的参数学习,通过EM算法迭代优化模型参数,得到各分布的混合系数、均值和方差。
阅读全文