高斯混合模型(GMM)是一种常用的聚类算法,它假设数据是由多个高斯分布混合而成的。在本文中,将探讨GMM在鸢尾花数据集上的应用,并比较不同协方差类型的表现。鸢尾花数据集是一个经典的多类分类问题,包含150个样本,每个样本有四个特征。
在进行聚类之前,通常会初始化高斯分布的均值。为了使比较有效,使用训练集中各类的均值来初始化高斯分布的均值。接下来,将在鸢尾花数据集上使用不同协方差类型的GMM,并绘制训练和测试数据的预测标签。
比较了具有球形、对角、全协方差和捆绑协方差矩阵的GMM。虽然全协方差通常预期会有最佳表现,但它在小数据集上容易过拟合,并且对测试数据的泛化能力不强。在图表中,训练数据以点的形式显示,而测试数据以叉号显示。鸢尾花数据集是四维的,但这里只显示了前两个维度,因此一些点在其他维度上是分开的。
以下是使用Python和scikit-learn库实现上述GMM聚类的代码。代码中包含了数据加载、模型训练、预测以及结果可视化的完整流程。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets
from sklearn.mixture import GaussianMixture
from sklearn.model_selection import StratifiedKFold
colors = ["navy", "turquoise", "darkorange"]
def make_ellipses(gmm, ax):
for n, color in enumerate(colors):
# 省略部分代码以节省空间...
iris = datasets.load_iris()
# 省略部分代码以节省空间...
estimators = {
cov_type: GaussianMixture(n_components=n_classes, covariance_type=cov_type, max_iter=20, random_state=0)
for cov_type in ["spherical", "diag", "tied", "full"]
}
plt.figure(figsize=(3*n_estimators//2, 6))
plt.subplots_adjust(bottom=0.01, top=0.95, hspace=0.15, wspace=0.05, left=0.01, right=0.99)
for index, (name, estimator) in enumerate(estimators.items()):
# 省略部分代码以节省空间...
plt.show()
在上述代码中,首先导入了必要的库,然后定义了一个函数来绘制高斯分布的椭圆。接着,加载了鸢尾花数据集,并将其分为训练集和测试集。然后,创建了不同协方差类型的GMM模型,并在训练集上进行了训练。最后,绘制了训练和测试数据的预测标签,并计算了训练和测试的准确率。
通过比较不同协方差类型的GMM在鸢尾花数据集上的表现,可以得出结论:虽然全协方差模型在理论上具有最佳性能,但在实际应用中,由于其容易过拟合的特点,可能并不是最佳选择。相反,对角协方差和捆绑协方差模型在本例中表现更好,具有较好的泛化能力。
总的来说,选择合适的协方差类型对于GMM模型的性能至关重要。在实际应用中,需要根据数据的特点和模型的需求来选择最合适的协方差类型。此外,通过可视化结果,可以更直观地理解模型的聚类效果,从而更好地评估和优化模型。