一维gmm的em求解代码
时间: 2023-10-03 17:00:29 浏览: 77
EM+GMM算法 MATLAB版本
一维GMM(高斯混合模型)是一种概率分布模型,常用于数据聚类和密度估计。EM(期望最大化)算法是一种迭代算法,用于估计GMM的参数。
以下是一维GMM的EM求解代码示例:
# 导入必要的库
import numpy as np
def EM_GMM(data, k, max_iter):
# 数据初始化
n = len(data)
means = np.random.choice(data, size=k)
covariances = np.random.random(size=k)
weights = np.ones(k) / k
for _ in range(max_iter):
# Expectation步骤计算后验概率
probs = np.zeros((n, k))
for j in range(k):
probs[:, j] = weights[j] * stats.norm.pdf(data, means[j], np.sqrt(covariances[j]))
probs /= np.sum(probs, axis=1, keepdims=True)
# Maximization步骤更新参数
Nk = np.sum(probs, axis=0)
weights = Nk / n
means = np.sum(probs * data[:, np.newaxis], axis=0) / Nk
covariances = np.sum(probs * (data[:, np.newaxis] - means) ** 2, axis=0) / Nk
return means, covariances, weights
# 示例数据
data = np.random.normal(loc=5, scale=1, size=1000)
# 调用EM算法
k = 2 # 高斯分量的个数
max_iter = 100 # 最大迭代次数
means, covariances, weights = EM_GMM(data, k, max_iter)
print("估计的均值:", means)
print("估计的方差:", covariances)
print("估计的权重:", weights)
在这段示例代码中,我们首先导入必要的库,然后定义了一个EM_GMM函数,用于执行一维GMM的EM算法。该函数的输入参数为数据集data,高斯分量的个数k,最大迭代次数max_iter。在函数内部,我们使用numpy库来进行矩阵计算,stats.norm.pdf函数用于计算高斯概率密度函数。
在函数主体部分,我们首先进行参数的初始化,然后通过迭代的方式执行EM算法的E步骤和M步骤,直到达到最大迭代次数。在E步骤中,我们计算每个样本属于每个高斯分量的后验概率;在M步骤中,我们更新高斯分量的权重、均值和方差。最后,返回估计的均值、方差和权重,并打印输出。
在示例代码中,我们使用了一个正态分布的随机数作为示例数据,并通过调用EM_GMM函数来获得估计的参数。
阅读全文