高斯混合模型(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模型,并使用训练数据对其进行了训练。在训练过程中,初始化了模型的均值参数,使其与训练集中各类别的均值相匹配。之后,在图表上绘制了每个高斯分布的椭圆,并显示了训练数据和测试数据的分布情况。
通过比较不同协方差类型在训练集和测试集上的准确率,可以得出结论:虽然全协方差矩阵在理论上具有最佳性能,但在实际应用中,它容易过拟合,导致在测试集上的表现不佳。因此,在处理小数据集时,选择适当的协方差类型对于提高模型的泛化能力至关重要。