在数据分析中,经常遇到需要对数据集进行建模的情况。本文将探讨在一组非高斯随机变量混合的数据集上,如何使用高斯混合模型(GMM)和贝叶斯高斯混合模型(BGMM)进行建模,并比较这两种方法的效果。数据集由100个点组成,这些点大致遵循一个带有噪声的正弦曲线。由于数据并非来自高斯分布的混合,因此没有关于高斯分量数量的真实值。
使用了三种不同的模型来拟合数据:
哪种模型是最好的,这是一个主观判断的问题:想要只捕捉大局观以总结和解释数据的大部分结构,同时忽略细节的模型,还是更喜欢紧密跟随信号高密度区域的模型?
最后两个面板展示了如何从最后两个模型中进行采样。得到的样本分布与原始数据分布不完全相同。这种差异主要源于使用了一个假设数据是由有限数量的高斯分量生成的模型,而不是连续的带噪声的正弦曲线。
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(())
# 更多代码实现...