高斯混合模型协方差类型比较

高斯混合模型GMM)是一种常用的聚类算法,它通过将数据点分配到多个高斯分布中来进行分类。在本研究中,探讨了不同类型的协方差矩阵对GMM性能的影响。具体来说,比较了球面(spherical)、对角线(diagonal)、全协方差(full)和绑定(tied)协方差矩阵。尽管全协方差矩阵在理论上具有最佳性能,但在小数据集上容易过拟合,且在测试集上的表现并不理想。

为了进行比较,使用了鸢尾花数据集,这是一个四维数据集,但只展示了前两个维度,以便在二维平面上进行可视化。在图表中,训练数据以点的形式表示,而测试数据则以叉号表示。初始化高斯分布的均值,使其与训练集中各类别的均值相匹配,以确保比较的有效性。

在下面的代码示例中,首先导入了必要的库,包括matplotlib用于绘图,numpy用于数学运算,以及scikit-learn中的GaussianMixture类用于创建GMM模型。还定义了一个函数make_ellipses,用于在图表上绘制高斯分布的椭圆。

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): # 省略函数内部实现细节... iris = datasets.load_iris() skf = StratifiedKFold(n_splits=4) train_index, test_index = next(iter(skf.split(iris.data, iris.target))) X_train, y_train = iris.data[train_index], iris.target[train_index] X_test, y_test = iris.data[test_index], iris.target[test_index] n_classes = len(np.unique(y_train)) 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*len(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模型,并使用训练数据对其进行了训练。在训练过程中,初始化了模型的均值参数,使其与训练集中各类别的均值相匹配。之后,在图表上绘制了每个高斯分布的椭圆,并显示了训练数据和测试数据的分布情况。

通过比较不同协方差类型在训练集和测试集上的准确率,可以得出结论:虽然全协方差矩阵在理论上具有最佳性能,但在实际应用中,它容易过拟合,导致在测试集上的表现不佳。因此,在处理小数据集时,选择适当的协方差类型对于提高模型的泛化能力至关重要。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485