理解高斯混合模型的概念

时间:2014-09-24 14:33:08

标签: matlab machine-learning classification cluster-analysis mixture-model

我试图通过阅读在线提供的资料来了解GMM。我已经使用K-Means实现了聚类,并且看到GMM将如何与K-means进行比较。

以下是我的理解,如果我的观念错误,请告诉我:

GMM就像KNN一样,在这两种情况下都实现了聚类。但在GMM中,每个群集都有自己独立的均值和协方差。此外,k-means执行数据点到集群的硬分配,而在GMM中,我们得到一组独立的高斯分布,并且对于每个数据点,我们有一个它属于其中一个分布的概率。

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

%images is a 459 x 1 cell array where each cell contains the training image
[locations, all_feats] = vl_dsift(single(images{1}), 'fast', 'step', 50); %all_feats will be 128 x no. of keypoints detected
for i=2:(size(images,1))
    [locations, feats] = vl_dsift(single(images{i}), 'fast', 'step', 50);
    all_feats = cat(2, all_feats, feats); %cat column wise all features
end

numClusters = 50; %Just a random selection.
% Run KMeans to pre-cluster the data
[initMeans, assignments] = vl_kmeans(single(all_feats), numClusters, ...
    'Algorithm','Lloyd', ...
    'MaxNumIterations',5);

initMeans = double(initMeans); %GMM needs it to be double

% Find the initial means, covariances and priors
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')))));
    end
end

% Run EM starting from the given parameters
[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中每个点的最近邻居。

那么如何在GMM中实现这一目标,我知道它的概率集合,并且从该概率中最接近的匹配将是我们的获胜集群。而这就是我感到困惑的地方。 所有在线教程都教授了如何实现meanscovariances值,但在如何在聚类方面实际使用它们方面并没有太多说明。

谢谢

3 个答案:

答案 0 :(得分:62)

我认为如果你首先看一下GMM模型所代表的内容会有所帮助。我将使用functions中的Statistics Toolbox,但您应该可以使用VLFeat执行相同操作。

让我们从两个1维normal distributions的混合情况开始。每个高斯由一对meanvariance表示。混合物为每个组分分配权重(先前)。

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

如下所示,均值有效地改变了分布,而方差则决定了它的宽/窄和平/尖。先前设定混合比例以获得最终的组合模型。

% create GMM
mu = [0; 5];
sigma = cat(3, 1, 2);
p = [0.5; 0.5];
gmm = gmdistribution(mu, sigma, p);

% view PDF
ezplot(@(x) pdf(gmm,x));

2-mixtures of 1D gaussians

EM clustering的想法是每个分布代表一个集群。因此,在上面的一维数据示例中,如果您获得了一个实例x = 0.5,我们会将其指定为属于第一个群集/模式,概率为99.5%

>> x = 0.5;
>> posterior(gmm, x)
ans =
    0.9950    0.0050    % probability x came from each component

你可以看到实例在第一个钟形曲线下的表现如何。然而,如果你在中间采取一个观点,那么答案将更加模糊(指向class = 2,但确定性更低):

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

相同的概念使用multivariate normal distributions扩展到更高的维度。在多个维度中,covariance matrix是方差的推广,以便考虑要素之间的相互依赖性。

以下是两个维度中两个MVN分布混合的示例:

% first distribution is centered at (0,0), second at (-1,3)
mu = [0 0; 3 3];

% covariance of first is identity matrix, second diagonal
sigma = cat(3, eye(2), [5 0; 0 1]);

% again I'm using equal priors
p = [0.5; 0.5];

% build GMM
gmm = gmdistribution(mu, sigma, p);

% 2D projection
ezcontourf(@(x,y) pdf(gmm,[x y]));

% view PDF surface
ezsurfc(@(x,y) pdf(gmm,[x y]));

2-mixtures of 2D gaussians

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

所以在上图中,你应该能够告诉两个"颠簸"除了每个代表的个人分配。当您进入3D和更高维度时,请将其视为N-dims中的(超 - )ellipsoids

2d covariance matrix


现在,当您使用GMM执行clustering时,目标是找到模型参数(每个分布的均值和协方差以及先验),以便最终的模型最适合数据。给定GMM模型的最佳拟合估计转换为maximizing the likelihood数据(意味着您选择最大化Pr(data|model)的模型)。

正如其他人所解释的那样,这是使用EM algorithm迭代解决的; EM以混合模型的参数的初始估计或猜测开始。它针对参数产生的混合密度迭代地对数据实例进行重新评分。然后使用重新评分的实例来更新参数估计。重复此操作直到算法收敛。

不幸的是,EM算法对模型的初始化非常敏感,因此如果设置较差的初始值,甚至陷入local optima,可能需要很长时间才能收敛。初始化GMM参数的更好方法是使用K-means作为第一步(就像您在代码中显示的那样),并使用这些群集的均值/ cov来初始化EM。

与其他聚类分析技术一样,我们首先需要使用decide on the number of clustersCross-validation是一种可靠的方法,可以很好地估算出群集的数量。

EM集群的缺点是需要适应很多参数,并且通常需要大量数据和多次迭代才能获得良好的结果。具有M-混合和D-维数据的无约束模型涉及拟合D*D*M + D*M + M参数(M个协方差矩阵,每个大小为DxD,加上M个长度为D的向量,加上长度为M的先验矢量)。对于large number of dimensions的数据集,这可能是一个问题。因此,习惯上强加限制和假设来简化问题(一种regularization以避免overfitting问题)。例如,您可以将协方差矩阵固定为仅对角线,或者甚至在所有高斯中都具有协方差矩阵shared

最后,一旦您拟合了混合模型,您就可以通过使用每个混合成分计算数据实例的后验概率来探索聚类(就像我在1D示例中所示)。 GMM根据此"成员资格将每个实例分配给一个集群。可能性。


以下是使用高斯混合模型聚类数据的更完整示例:

% load Fisher Iris dataset
load fisheriris

% project it down to 2 dimensions for the sake of visualization
[~,data] = pca(meas,'NumComponents',2);
mn = min(data); mx = max(data);
D = size(data,2);    % data dimension    

% inital kmeans step used to initialize EM
K = 3;               % number of mixtures/clusters
cInd = kmeans(data, K, 'EmptyAction','singleton');

% fit a GMM model
gmm = fitgmdist(data, K, 'Options',statset('MaxIter',1000), ...
    'CovType','full', 'SharedCov',false, 'Regularize',0.01, 'Start',cInd);

% means, covariances, and mixing-weights
mu = gmm.mu;
sigma = gmm.Sigma;
p = gmm.PComponents;

% cluster and posterior probablity of each instance
% note that: [~,clustIdx] = max(p,[],2)
[clustInd,~,p] = cluster(gmm, data);
tabulate(clustInd)

% plot data, clustering of the entire domain, and the GMM contours
clrLite = [1 0.6 0.6 ; 0.6 1 0.6 ; 0.6 0.6 1];
clrDark = [0.7 0 0 ; 0 0.7 0 ; 0 0 0.7];
[X,Y] = meshgrid(linspace(mn(1),mx(1),50), linspace(mn(2),mx(2),50));
C = cluster(gmm, [X(:) Y(:)]);
image(X(:), Y(:), reshape(C,size(X))), hold on
gscatter(data(:,1), data(:,2), species, clrDark)
h = ezcontour(@(x,y)pdf(gmm,[x y]), [mn(1) mx(1) mn(2) mx(2)]);
set(h, 'LineColor','k', 'LineStyle',':')
hold off, axis xy, colormap(clrLite)
title('2D data and fitted GMM'), xlabel('PC1'), ylabel('PC2')

EM clustering

答案 1 :(得分:3)

你是对的,对K-Means或GMM进行聚类背后有相同的见解。 但正如您提到的高斯混合物考虑数据协方差。 要找到GMM统计模型的最大似然参数(或最大后验MAP),您需要使用称为EM algorithm的迭代过程。每次迭代由E步(期望)和M步(最大化)组成,并重复直到收敛。 收敛后,您可以轻松估计每个群集模型的每个数据向量的成员概率。

答案 2 :(得分:2)

协方差告诉您数据如何在空间中变化,如果分布具有大的协方差,则意味着数据更加分散,反之亦然。当您拥有高斯分布的PDF(均值和协方差参数)时,您可以检查该分布下测试点的成员资格置信度。

然而,GMM也遭受K-Means的弱点,你必须选择参数K,它是簇的数量。这需要很好地理解您的数据的多模态。