在机器学习领域,高斯混合模型(Gaussian Mixture Model, GMM)是一种常用的聚类算法。它假设数据是由多个高斯分布混合而成的,每个高斯分布对应一个聚类中心。本文将介绍如何使用Python的matplotlib和sklearn库来生成和可视化两个不同中心和协方差矩阵的高斯分布数据,并拟合高斯混合模型。
首先,需要生成两个不同中心和协方差矩阵的高斯分布数据。这里使用numpy库来生成随机样本,并使用matplotlib库来绘制数据的分布图。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LogNorm
from sklearn import mixture
# 设置随机种子以保证结果的可复现性
np.random.seed(0)
# 生成第一个高斯分布的随机样本,中心在(20, 20)
shifted_gaussian = np.random.randn(300, 2) + np.array([20, 20])
# 生成第二个高斯分布的随机样本,中心在原点,但协方差矩阵被拉伸
C = np.array([[0.0, -0.7], [3.5, 0.7]])
stretched_gaussian = np.dot(np.random.randn(300, 2), C)
# 将两个数据集合并为最终的训练集
X_train = np.vstack([shifted_gaussian, stretched_gaussian])
接下来,使用sklearn库中的GaussianMixture类来拟合高斯混合模型。将模型设置为有两个组件,并且协方差类型为"full",这意味着每个组件都有自己的协方差矩阵。
# 拟合高斯混合模型
clf = mixture.GaussianMixture(n_components=2, covariance_type="full")
clf.fit(X_train)
最后,使用matplotlib库来绘制模型预测的负对数似然值的等高线图。还绘制了原始数据点,以便直观地比较模型的预测结果和实际数据的分布。
# 绘制负对数似然值的等高线图
x = np.linspace(-20.0, 30.0)
y = np.linspace(-20.0, 40.0)
X, Y = np.meshgrid(x, y)
XX = np.array([X.ravel(), Y.ravel()]).T
Z = -clf.score_samples(XX)
Z = Z.reshape(X.shape)
CS = plt.contour(X, Y, Z, norm=LogNorm(vmin=1.0, vmax=1000.0), levels=np.logspace(0, 3, 10))
CB = plt.colorbar(CS, shrink=0.8, extend="both")
plt.scatter(X_train[:, 0], X_train[:, 1], 0.8)
plt.title("Negative log-likelihood predicted by a GMM")
plt.axis("tight")
plt.show()
通过上述代码,成功地生成了两个不同中心和协方差矩阵的高斯分布数据,并使用高斯混合模型进行了拟合。最终,通过等高线图直观地展示了模型预测的负对数似然值,以及原始数据点的分布情况。这种可视化方法有助于更好地理解高斯混合模型的工作原理和性能。
在实际应用中,高斯混合模型可以用于各种聚类任务,例如图像分割、语音识别和异常检测等。通过调整模型的参数,例如组件数量和协方差类型,可以在不同的数据集上获得更好的聚类效果。此外,高斯混合模型还具有很好的灵活性和可扩展性,可以与其他机器学习算法结合使用,以解决更复杂的数据挖掘问题。