1. 引言
EM算法(Expectation-Maximization Algorithm)是一种用于估计含有潜变量的概率模型参数的迭代算法。它是一种迭代的求解策略,通过迭代地进行观测数据的似然函数期望最大化来实现参数的估计。
2. EM算法原理
EM算法的核心思想是通过两个步骤不断迭代:E步和M步。E步即是求期望(Expectation)值,对于观测数据中的每个变量,计算其对潜在的未观测数据的条件概率分布期望。M步即是求最大化(Maximization)值,使用期望的统计量来更新概率模型参数。
2.1 E步
在E步中,根据当前模型的参数估计值,计算隐变量的后验概率,即给定观测数据和模型参数的情况下,隐变量的条件概率分布。
def E_step(data, mean, cov, pi):
# 计算每个样本属于每个高斯分布的概率
gamma = np.zeros((len(data), len(pi)))
for i in range(len(data)):
for j in range(len(pi)):
gamma[i, j] = pi[j] * multivariate_normal.pdf(data[i], mean[j], cov[j])
gamma[i] /= np.sum(gamma[i])
return gamma
data = [[1.2, 3.4], [2.5, 4.7], [3.2, 1.8], [4.5, 2.3]]
mean = [[1.0, 2.0], [3.0, 4.0]]
cov = [[[1.0, 0.0], [0.0, 1.0]], [[2.0, 0.0], [0.0, 2.0]]]
pi = [0.5, 0.5]
gamma = E_step(data, mean, cov, pi)
print(gamma)
这段代码实现了E步骤,其中data是观测数据,mean是高斯分布的均值参数,cov是高斯分布的协方差矩阵参数,pi是高斯分布的权重参数。函数返回了每个样本属于每个高斯分布的后验概率。
2.2 M步
在M步中,根据E步中得到的隐变量的后验概率,更新模型的参数。
def M_step(data, gamma):
# 更新高斯分布的权重参数
pi = np.mean(gamma, axis=0)
# 更新高斯分布的均值参数
mean = np.dot(gamma.T, data) / np.sum(gamma, axis=0, keepdims=True)
# 更新高斯分布的协方差矩阵参数
cov = []
for j in range(len(gamma[0])):
diff = data - mean[j]
cov_j = np.dot(diff.T, np.multiply(diff, gamma[:, j][:, np.newaxis])) / np.sum(gamma[:, j])
cov.append(cov_j)
return mean, cov, pi
mean_new, cov_new, pi_new = M_step(data, gamma)
print(mean_new)
print(cov_new)
print(pi_new)
这段代码实现了M步骤,其中data是观测数据,gamma是在E步骤中计算得到的后验概率。函数返回了更新后的高斯分布的均值参数、协方差矩阵参数和权重参数。
3. EM算法实例
接下来我们将使用EM算法来实现一个简单的高斯混合模型(Gaussian Mixture Model)。
假设我们有一些二维数据,我们希望将其建模为两个不同的高斯分布。我们先随机初始化这两个高斯分布的参数:
import numpy as np
data = [[1.2, 3.4], [2.5, 4.7], [3.2, 1.8], [4.5, 2.3]]
K = 2 # 高斯分布的个数
mean = np.random.randn(K, len(data[0]))
cov = [np.eye(len(data[0]))] * K
pi = np.random.rand(K)
pi /= np.sum(pi)
print("初始均值参数:", mean)
print("初始协方差矩阵参数:", cov)
print("初始权重参数:", pi)
接下来,我们开始进行EM算法的迭代:
def EM_algorithm(data, K, mean, cov, pi, temperature=0.6, max_iters=100):
for _ in range(max_iters):
gamma = E_step(data, mean, cov, pi)
mean, cov, pi = M_step(data, gamma)
# 使用控制温度的逻辑来更新参数
mean = temperature*mean + (1-temperature)*mean_new
cov = [temperature*c + (1-temperature)*c_new for c, c_new in zip(cov, cov_new)]
pi = temperature*pi + (1-temperature)*pi_new
return mean, cov, pi
mean_final, cov_final, pi_final = EM_algorithm(data, K, mean, cov, pi, temperature=0.6)
print("最终均值参数:", mean_final)
print("最终协方差矩阵参数:", cov_final)
print("最终权重参数:", pi_final)
这段代码利用EM_algorithm函数进行EM算法的迭代更新,temperature参数控制了每一次更新时新旧参数的权重。最终输出的mean_final、cov_final和pi_final即为经过EM算法迭代更新后的最终参数。
4. 总结
EM算法是一种迭代的算法,可用于估计含有潜变量的概率模型参数。它通过E步和M步的交替迭代,不断进行参数的更新,从而最大化观测数据的似然函数。本文介绍了EM算法的原理和实现过程,并使用Python编写了一个简单的高斯混合模型的实例代码。希望通过本文的介绍,读者能够对EM算法有一个更深入的理解。