在机器学习领域,高斯混合模型(Gaussian Mixture Model, GMM)是一种用于表示具有多个子群体的数据的概率模型。每个子群体可以用一个高斯分布来描述。本文将通过Python编程语言和scikit-learn库来演示如何生成并可视化两个具有不同中心和协方差矩阵的高斯分布混合的密度估计图。
首先,需要导入必要的库。matplotlib.pyplot用于数据可视化,numpy用于数据处理,matplotlib.colors中的LogNorm用于对数归一化颜色映射,以及scikit-learn中的mixture模块用于高斯混合模型的实现。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LogNorm
from sklearn import mixture
接下来,生成两个高斯分布的数据样本。第一个样本是中心在(20, 20)的球形数据,第二个样本是中心在原点的拉伸高斯数据。将这两个数据集合并作为训练集。
n_samples = 300
np.random.seed(0)
# 生成中心在(20, 20)的球形数据
shifted_gaussian = np.random.randn(n_samples, 2) + np.array([20, 20])
# 生成中心在原点的拉伸高斯数据
C = np.array([[0.0, -0.7], [3.5, 0.7]])
stretched_gaussian = np.dot(np.random.randn(n_samples, 2), C)
# 合并两个数据集
X_train = np.vstack([shifted_gaussian, stretched_gaussian])
然后,使用scikit-learn库中的GaussianMixture类来拟合这个训练集。指定模型包含两个组件,并且协方差类型为"full",意味着每个组件可以有不同的协方差矩阵。
clf = mixture.GaussianMixture(n_components=2, covariance_type="full")
clf.fit(X_train)
最后,使用模型预测的分数来绘制等高线图。首先定义x和y的取值范围,然后使用meshgrid函数生成网格点。接着,将这些网格点输入模型中,获取每个点的分数,并将这些分数重新塑形为网格的形状。使用contour函数来绘制等高线图,并添加颜色条以表示分数的大小。
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()
通过上述代码,成功地生成并可视化了两个高斯分布混合的密度估计图。图中的等高线表示了模型预测的负对数似然分数,颜色越深表示分数越低,即模型对这些区域的数据点的拟合度越高。散点图表示了原始的训练数据,可以看到数据点主要分布在两个不同的区域,这与生成数据时的设定相符。
这个示例展示了如何使用高斯混合模型来对具有多个子群体的数据进行建模和可视化。这种方法在许多领域都有应用,比如图像处理、语音识别、异常检测等。通过调整模型的参数,可以更好地拟合数据,提高模型的预测性能。