贝叶斯高斯混合模型分析

在本研究中,通过一个由三个高斯分布混合而成的玩具数据集,探讨了贝叶斯高斯混合模型(BayesianGaussianMixture)在不同权重浓度先验类型下的拟合效果。模型使用了Dirichlet分布先验(weight_concentration_prior_type='dirichlet_distribution')和Dirichlet过程先验(weight_concentration_prior_type='dirichlet_process')两种类型。在每张图中,展示了三种不同权重浓度先验值的拟合结果。

贝叶斯高斯混合模型能够自动适应混合成分的数量。参数weight_concentration_prior与具有非零权重的成分数量有直接联系。设定较低的浓度先验值会使模型将大部分权重集中在少数几个成分上,而将其余成分的权重设置得非常接近零。相反,较高的浓度先验值将允许更多的成分在混合中活跃。

Dirichlet过程先验允许定义无限数量的成分,并自动选择正确的成分数量:只有当必要的时候才会激活一个成分。与此相反,传统的有限混合模型使用Dirichlet分布先验,倾向于更均匀地加权成分,因此倾向于将自然聚类划分为不必要的子成分。

代码实现

以下是使用Python和matplotlib库实现上述分析的代码。首先,定义了一个函数plot_ellipses来绘制高斯分布的椭圆,并定义了plot_results函数来展示模型的拟合结果和每个成分的权重。

import matplotlib as mpl import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt import numpy as np from sklearn.mixture import BayesianGaussianMixture def plot_ellipses(ax, weights, means, covars): for n in range(means.shape[0]): eig_vals, eig_vecs = np.linalg.eigh(covars[n]) unit_eig_vec = eig_vecs[0] / np.linalg.norm(eig_vecs[0]) angle = np.arctan2(unit_eig_vec[1], unit_eig_vec[0]) # Ellipse needs degrees angle = 180 * angle / np.pi # eigenvector normalization eig_vals = 2 * np.sqrt(2) * np.sqrt(eig_vals) ell = mpl.patches.Ellipse(means[n], eig_vals[0], eig_vals[1], angle=180+angle, edgecolor="black") ell.set_clip_box(ax.bbox) ell.set_alpha(weights[n]) ell.set_facecolor("#56B4E9") ax.add_artist(ell) def plot_results(ax1, ax2, estimator, X, y, title, plot_title=False): ax1.set_title(title) ax1.scatter(X[:,0], X[:,1], s=5, marker="o", color=colors[y], alpha=0.8) ax1.set_xlim(-2.0, 2.0) ax1.set_ylim(-3.0, 3.0) ax1.set_xticks(()) ax1.set_yticks(()) plot_ellipses(ax1, estimator.weights_, estimator.means_, estimator.covariances_) ax2.get_xaxis().set_tick_params(direction="out") ax2.yaxis.grid(True, alpha=0.7) for k, w in enumerate(estimator.weights_): ax2.bar(k, w, width=0.9, color="#56B4E9", zorder=3, align="center", edgecolor="black",) ax2.text(k, w+0.007, "%.1f%%" % (w*100.0), horizontalalignment="center") ax2.set_xlim(-0.6, 2*n_components-0.4) ax2.set_ylim(0.0, 1.1) ax2.tick_params(axis="y", which="both", left=False, right=False, labelleft=False) ax2.tick_params(axis="x", which="both", top=False) if plot_title: ax1.set_ylabel("Estimated Mixtures") ax2.set_ylabel("Weight of each component")

接下来,定义了数据集的参数,包括随机状态、成分数量、特征数量以及颜色数组。然后,创建了一个贝叶斯高斯混合模型的实例,并设置了权重浓度先验类型和相关参数。最后,生成了数据并绘制了结果。

通过这个分析,可以清楚地看到不同权重浓度先验类型对模型拟合效果的影响。Dirichlet分布先验倾向于产生更均匀的成分权重,而Dirichlet过程先验则能够自动选择最合适的成分数量,从而更好地捕捉数据的自然聚类结构。

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