python高斯混合模型-EM
时间: 2023-11-21 17:55:56 浏览: 116
混合高斯模型的EM算法
5星 · 资源好评率100%
高斯混合模型(Gaussian Mixture Model,GMM)是一种基于概率密度函数的聚类方法,它假设数据集是由多个高斯分布混合而成的。EM算法是一种迭代算法,用于估计高斯混合模型的参数。下面是使用Python实现高斯混合模型-EM算法的示例代码:
```python
import numpy as np
from scipy.stats import multivariate_normal
class GMM:
def __init__(self, n_components, max_iter=100, tol=1e-4):
self.n_components = n_components
self.max_iter = max_iter
self.tol = tol
def fit(self, X):
n_samples, n_features = X.shape
# 初始化模型参数
self.weights = np.ones(self.n_components) / self.n_components
self.means = X[np.random.choice(n_samples, self.n_components, replace=False)]
self.covs = np.array([np.eye(n_features) for _ in range(self.n_components)])
# EM算法迭代
for i in range(self.max_iter):
# E步:计算每个样本属于每个分布的后验概率
probs = np.array([multivariate_normal.pdf(X, mean=self.means[j], cov=self.covs[j]) for j in range(self.n_components)]).T
probs *= self.weights
probs /= probs.sum(axis=1, keepdims=True)
# M步:更新模型参数
weights = probs.mean(axis=0)
means = np.dot(probs.T, X) / probs.sum(axis=0, keepdims=True).T
covs = np.array([np.dot((X - means[j]).T, (X - means[j]) * probs[:, j][:, np.newaxis]) / probs[:, j].sum() for j in range(self.n_components)])
# 判断收敛
if np.abs(weights - self.weights).max() < self.tol and np.abs(means - self.means).max() < self.tol and np.abs(covs - self.covs).max() < self.tol:
break
self.weights, self.means, self.covs = weights, means, covs
def predict(self, X):
probs = np.array([multivariate_normal.pdf(X, mean=self.means[j], cov=self.covs[j]) for j in range(self.n_components)]).T
return np.argmax(probs, axis=1)
# 示例
X = np.random.randn(100, 2)
gmm = GMM(n_components=2)
gmm.fit(X)
labels = gmm.predict(X)
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.show()
```
该示例代码使用numpy和scipy库实现了高斯混合模型-EM算法,并在二维数据集上进行了聚类。其中,GMM类的fit方法用于训练模型,predict方法用于预测样本所属的簇。在示例中,我们生成了一个二维的随机数据集,然后使用GMM类对其进行聚类,并将聚类结果可视化。
阅读全文