理解高斯混合模型的概念

我正在通过阅读在线资源来理解GMM。我已经使用K-Means实现了聚类,并且想看看GMM与K-Means相比如何。

以下是我所理解的,请告诉我我的概念是否有误:

GMM类似于KNN,因为两者都实现了聚类。但在GMM中,每个聚类都有自己独立的均值和协方差。此外,k-means对数据点进行硬分配,而在GMM中,我们得到一组独立的高斯分布,对于每个数据点,我们有它属于其中一个分布的概率。

为了更好地理解,我使用MatLab编写了代码并实现了所需的聚类。我使用SIFT特征进行特征提取,并使用k-means聚类来初始化值。(这是来自VLFeat文档的内容)

%images是459 x 1的单元数组,每个单元包含训练图像[locations, all_feats] = vl_dsift(single(images{1}), 'fast', 'step', 50); %all_feats将是128 x 检测到的关键点数量for i=2:(size(images,1))    [locations, feats] = vl_dsift(single(images{i}), 'fast', 'step', 50);    all_feats = cat(2, all_feats, feats); %按列连接所有特征endnumClusters = 50; %只是随机选择。% 运行KMeans对数据进行预聚类[initMeans, assignments] = vl_kmeans(single(all_feats), numClusters, ...    'Algorithm','Lloyd', ...    'MaxNumIterations',5);initMeans = double(initMeans); %GMM需要它是双精度% 找到初始均值、协方差和先验for i=1:numClusters    data_k = all_feats(:,assignments==i);    initPriors(i) = size(data_k,2) / numClusters;    if size(data_k,1) == 0 || size(data_k,2) == 0        initCovariances(:,i) = diag(cov(data'));    else        initCovariances(:,i) = double(diag(cov(double((data_k')))));    endend% 从给定的参数开始运行EM[means,covariances,priors,ll,posteriors] = vl_gmm(double(all_feats), numClusters, ...    'initialization','custom', ...    'InitMeans',initMeans, ...    'InitCovariances',initCovariances, ...    'InitPriors',initPriors);

根据以上内容,我得到了meanscovariancespriors。我的主要问题是,现在该怎么办?我现在有点迷茫了。

此外,meanscovariances向量的大小都是128 x 50。我原本期望它们是1 x 50,因为每一列是一个聚类,每个聚类不是应该只有一个均值和协方差吗?(我知道128是SIFT特征,但我期望的是均值和协方差)。

在k-means中,我使用了MatLab命令knnsearch(X,Y),它基本上是为Y中的每个点找到X中的最近邻居。

那么在GMM中如何实现这一点呢?我知道这是一组概率,当然从该概率中找到最近的匹配将是我们获胜的聚类。这就是我感到困惑的地方。网上的所有教程都教如何获得meanscovariances值,但没有详细说明如何实际使用它们进行聚类。

谢谢


回答:

我认为如果你首先了解GMM模型代表什么,会有所帮助。我将使用函数来自统计工具箱,但你应该能够使用VLFeat做同样的事情。

让我们从混合两个一维正态分布的情况开始。每个高斯分布由一对均值方差表示。混合为每个组件分配一个权重(先验)。

例如,让我们混合两个具有相等权重的正态分布(p = [0.5; 0.5]),第一个中心在0,第二个中心在5(mu = [0; 5]),第一个和第二个分布的方差分别为1和2(sigma = cat(3, 1, 2))。

如你所见,均值有效地移动了分布,而方差决定了分布的宽窄和平坦/尖锐程度。先验设置混合比例以获得最终的组合模型。

% 创建GMMmu = [0; 5];sigma = cat(3, 1, 2);p = [0.5; 0.5];gmm = gmdistribution(mu, sigma, p);% 查看PDFezplot(@(x) pdf(gmm,x));

2-mixtures of 1D gaussians

EM聚类的理念是每个分布代表一个聚类。所以在上面的一维数据示例中,如果你给定一个实例x = 0.5,我们会将其分配给第一个聚类/模式,概率为99.5%

>> x = 0.5;>> posterior(gmm, x)ans =    0.9950    0.0050    % 实例来自每个组件的概率

你可以看到该实例很好地落在第一个钟形曲线下。而如果你取中间的一个点,答案将更加模糊(点被分配到类别=2,但确定性要低得多):

>> x = 2.2>> posterior(gmm, 2.2)ans =    0.4717    0.5283

同样的概念扩展到更高维度的多元正态分布。在多于一个维度的情况下,协方差矩阵是方差的推广,以便考虑特征之间的相互依赖性。

这里再次以二维的两个MVN分布混合为例:

% 第一个分布中心在(0,0),第二个在(-1,3)mu = [0 0; 3 3];% 第一个的协方差是单位矩阵,第二个是对角线sigma = cat(3, eye(2), [5 0; 0 1]);% 再次使用相等的先验p = [0.5; 0.5];% 构建GMMgmm = gmdistribution(mu, sigma, p);% 2D投影ezcontourf(@(x,y) pdf(gmm,[x y]));% 查看PDF表面ezsurfc(@(x,y) pdf(gmm,[x y]));

2-mixtures of 2D gaussians

协方差矩阵如何影响联合密度函数的形状有一些直观的理解。例如,在2D中,如果矩阵是对角线的,这意味着两个维度不共变。在这种情况下,PDF看起来像一个轴对齐的椭圆,根据哪个维度的方差更大而水平或垂直拉伸。如果它们相等,那么形状就是一个完美的圆(分布在两个维度上以相同的速率扩散)。最后,如果协方差矩阵是任意的(非对角线但按定义仍然是对称的),那么它可能会看起来像一个旋转到某个角度的拉伸椭圆。

所以在前面的图中,你应该能够区分两个“凸起”并了解每个代表的个体分布。当你进入3D和更高维度时,可以将其视为在N维中代表(超)椭球

2d covariance matrix

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注