高斯混合模型与贝叶斯方法的应用比较

在数据分析中,经常遇到需要对数据集进行建模的情况。本文将探讨在一组非高斯随机变量混合的数据集上,如何使用高斯混合模型(GMM)和贝叶斯高斯混合模型(BGMM)进行建模,并比较这两种方法的效果。数据集由100个点组成,这些点大致遵循一个带有噪声的正弦曲线。由于数据并非来自高斯分布的混合,因此没有关于高斯分量数量的真实值。

模型介绍

使用了三种不同的模型来拟合数据:

  1. 第一种模型是经典的高斯混合模型,包含10个分量,使用期望最大化(EM)算法进行拟合。
  2. 第二种模型是贝叶斯高斯混合模型,具有狄利克雷过程(DP)先验,使用变分推断进行拟合。该模型的浓度先验值较低,使得模型倾向于使用较少的活跃分量,专注于数据集结构的大局观,即通过非对角协方差矩阵建模具有交替方向的点组。这些交替方向大致捕捉了原始正弦信号的交替特性。
  3. 第三种模型也是具有狄利克雷过程先验的贝叶斯高斯混合模型,但这次浓度先验的值较高,给予模型更多的自由度来建模数据的细粒度结构。结果是,模型具有更多的活跃分量,类似于随意决定固定分量数量为10的第一个模型。

哪种模型是最好的,这是一个主观判断的问题:想要只捕捉大局观以总结和解释数据的大部分结构,同时忽略细节的模型,还是更喜欢紧密跟随信号高密度区域的模型?

模型比较

最后两个面板展示了如何从最后两个模型中进行采样。得到的样本分布与原始数据分布不完全相同。这种差异主要源于使用了一个假设数据是由有限数量的高斯分量生成的模型,而不是连续的带噪声的正弦曲线。

代码实现

import itertools import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np from scipy import linalg from sklearn import mixture color_iter = itertools.cycle([ "navy", "c", "cornflowerblue", "gold", "darkorange" ]) def plot_results(X, Y, means, covariances, index, title): splot = plt.subplot(5, 1, 1 + index) for i, (mean, covar, color) in enumerate(zip(means, covariances, color_iter)): v, w = linalg.eigh(covar) v = 2.0 * np.sqrt(2.0) * np.sqrt(v) u = w[0] / linalg.norm(w[0]) if not np.any(Y == i): continue plt.scatter(X[Y == i, 0], X[Y == i, 1], 0.8, color=color) angle = np.arctan(u[1] / u[0]) angle = 180.0 * angle / np.pi ell = mpl.patches.Ellipse(mean, v[0], v[1], angle=180.0 + angle, color=color) ell.set_clip_box(splot.bbox) ell.set_alpha(0.5) splot.add_artist(ell) plt.xlim(-6.0, 4.0 * np.pi - 6.0) plt.ylim(-5.0, 5.0) plt.title(title) plt.xticks(()) plt.yticks(()) # 更多代码实现...
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485