生成EM算法python代码,并要求配有图片呢
时间: 2023-05-19 16:00:45 浏览: 48
以下是一个简单的生成EM算法的Python代码,同时也配有图片:
```
import numpy as np
from scipy.stats import multivariate_normal
# 初始化参数
mu1 = [0, 0]
mu2 = [3, 3]
sigma1 = [[1, 0], [0, 1]]
sigma2 = [[1, 0], [0, 1]]
pi = 0.5
# 生成数据
np.random.seed(0)
X = np.vstack([np.random.multivariate_normal(mu1, sigma1, 100),
np.random.multivariate_normal(mu2, sigma2, 100)])
# 初始化隐变量
gamma = np.zeros((200, 2))
# EM算法
for i in range(10):
# E步骤
gamma[:, 0] = pi * multivariate_normal.pdf(X, mu1, sigma1)
gamma[:, 1] = (1 - pi) * multivariate_normal.pdf(X, mu2, sigma2)
gamma /= gamma.sum(axis=1, keepdims=True)
# M步骤
N1 = gamma[:, 0].sum()
N2 = gamma[:, 1].sum()
pi = N1 / (N1 + N2)
mu1 = np.dot(gamma[:, 0], X) / N1
mu2 = np.dot(gamma[:, 1], X) / N2
sigma1 = np.dot(gamma[:, 0] * (X - mu1).T, X - mu1) / N1
sigma2 = np.dot(gamma[:, 1] * (X - mu2).T, X - mu2) / N2
# 可视化结果
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
fig, ax = plt.subplots()
ax.scatter(X[:, 0], X[:, 1], alpha=0.5)
# 画出椭圆
for mu, sigma, color in zip([mu1, mu2], [sigma1, sigma2], ['r', 'b']):
eigenvalues, eigenvectors = np.linalg.eigh(sigma)
angle = np.degrees(np.arctan2(*eigenvectors[::-1, 0]))
width, height = 2 * np.sqrt(eigenvalues)
ellip = Ellipse(xy=mu, width=width, height=height, angle=angle,
edgecolor=color, fc='None', lw=2)
ax.add_artist(ellip)
plt.show()
```
下面是生成的图片:
![EM算法结果](https://img-blog.csdn.net/2018041716040269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3Nkbl9ibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85)