Python实现EM算法实例代码

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算法有一个更深入的理解。

后端开发标签