高斯混合模型初始化方法比较

高斯混合模型(GMM)是一种常用的聚类算法,它假设数据是由多个高斯分布混合而成的。在实际应用中,选择合适的初始化方法对于模型的性能至关重要。本文将介绍四种不同的GMM初始化方法,并展示它们在样本数据上的表现。

首先,生成了一些具有四个明显聚类的数据样本。这些数据将用于展示不同的初始化参数init_param的效果。四种初始化方法分别是:默认的k-means方法、完全随机方法、从数据中随机选择方法以及k-means++方法。在下面的图表中,橙色菱形代表由init_param生成的GMM初始化中心,其余数据以叉号表示,颜色表示GMM完成后的最终分类。

每个子图右上角的数字表示GaussianMixture收敛所需的迭代次数以及算法初始化部分的相对运行时间。初始化时间较短的方法往往需要更多的迭代次数来收敛。初始化时间是该方法所需时间与默认k-means方法所需时间的比率。从结果可以看出,与k-means方法相比,其他三种替代方法的初始化时间都更短。

在本例中,当使用random_from_datarandom方法初始化时,模型需要更多的迭代次数来收敛。而k-means++方法在初始化时间和GaussianMixture迭代次数上都表现良好。

以下是实现这一过程的Python代码示例:

from timeit import default_timer as timer import matplotlib.pyplot as plt import numpy as np from sklearn.datasets._samples_generator import make_blobs from sklearn.mixture import GaussianMixture from sklearn.utils.extmath import row_norms print(__doc__) # 生成数据 X, y_true = make_blobs(n_samples=4000, centers=4, cluster_std=0.60, random_state=0) X = X[:, ::-1] n_samples = 4000 n_components = 4 x_squared_norms = row_norms(X, squared=True) def get_initial_means(X, init_params, r): # 使用max_iter=0的GaussianMixture输出初始化均值 gmm = GaussianMixture(n_components=4, init_params=init_params, tol=1e-9, max_iter=0, random_state=r) gmm.fit(X) return gmm.means_ methods = ["kmeans", "random_from_data", "k-means++", "random"] colors = ["navy", "turquoise", "cornflowerblue", "darkorange"] times_init = {} relative_times = {} plt.figure(figsize=(4*len(methods)//2, 6)) plt.subplots_adjust(bottom=0.1, top=0.9, hspace=0.15, wspace=0.05, left=0.05, right=0.95) for n, method in enumerate(methods): r = np.random.RandomState(seed=1234) plt.subplot(2, len(methods)//2, n+1) start = timer() ini = get_initial_means(X, method, r) end = timer() init_time = end - start gmm = GaussianMixture(n_components=4, means_init=ini, tol=1e-9, max_iter=2000, random_state=r) gmm.fit(X) times_init[method] = init_time for i, color in enumerate(colors): data = X[gmm.predict(X) == i] plt.scatter(data[:,0], data[:,1], color=color, marker="x") plt.scatter(ini[:,0], ini[:,1], s=75, marker="D", c="orange", lw=1.5, edgecolors="black") relative_times[method] = times_init[method] / times_init[methods[0]] plt.xticks(()) plt.yticks(()) plt.title(method, loc="left", fontsize=12) plt.title("Iter %i | Init Time %.2f x" % (gmm.n_iter_, relative_times[method]), loc="right", fontsize=10,) plt.suptitle("GMM iterations and relative time taken to initialize") plt.show()

运行上述脚本的总时间是:(0分钟0.644秒)。

可以通过以下链接下载Jupyter notebook和Python源代码,或者下载压缩包:

  • - Jupyter notebook文件
  • - Python源代码文件
  • - 压缩包

相关示例还包括:

  • GMM协方差
  • k-Means++初始化示例
  • 手写数字数据上的k-Means聚类演示
  • 高斯混合模型椭球
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485