理解高斯混合模型的概念
classification
cluster-analysis
machine-learning
matlab
4
0

我正在尝试通过阅读在线资源来了解GMM。我已经使用K-Means实现了聚类,并且正在观察GMM与K-means的比较。

这是我所了解的,如果我的概念有误,请告诉我:

在两种情况下都可以实现聚类的意义上,GMM就像KNN。但是在GMM中,每个聚类都有自己独立的均值和协方差。此外,k均值对群集进行数据点的硬分配,而在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均值中,我使用了MatLab命令knnsearch(X,Y) ,它基本上为X中的每个Y点找到X中最接近的邻居。

因此,如何在GMM中实现这一目标,我知道它是一个概率集合,当然,与该概率最接近的匹配项将是我们的获胜集群。这就是我感到困惑的地方。在线上的所有教程都教导了如何实现meanscovariances差值,但是在聚类方面并没有过多地说明如何实际使用它们。

谢谢

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

我认为,如果您先看看GMM模型代表什么,那将会有所帮助。我将使用“ 统计信息工具箱”中的 函数 ,但您应该能够使用VLFeat进行相同的操作。

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

例如,让我们混合两个具有相同权重的正态分布( p = [0.5; 0.5] ),第一个以0为中心,第二个以5为中心( mu = [0; 5] ),并且方差分别等于1和2第一和第二个分布( sigma = cat(3, 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

EM集群的思想是每个分布都代表一个集群。因此,在上面的具有一维数据的示例中,如果给定实例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

相同的概念扩展到具有多元正态分布的更高维度。在一个以上的维度中, 协方差矩阵方差的一般化,目的是考虑要素之间的相互依赖性。

这又是一个二维混合两个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]));

2D高斯混合2

协方差矩阵如何影响关节密度函数的形状背后有一些直觉。例如在2D模式下,如果矩阵是对角线,则表示二维维不可变。在那种情况下,PDF看起来像是一个轴向对齐的椭圆,根据其尺寸具有较大的差异而水平或垂直延伸。如果它们相等,则形状是一个完美的圆(分布在两个维度上的分布速率相等)。最后,如果协方差矩阵是任意的(按定义非对角但仍然对称),则它看起来可能像是一个以一定角度旋转的拉伸椭圆。

因此,在上图中,您应该能够区分两个“凸点”以及每个代表的个体分布。当您使用3D及更高尺寸时,可将其视为代表N维的(超) 椭圆体

2d协方差矩阵


现在,当您使用GMM执行聚类时 ,目标是找到模型参数(每个分布的均值和协方差以及先验值),以使生成的模型最适合数据。在GMM模型(意味着您选择使Pr(data|model)最大化的Pr(data|model)的情况下,最佳拟合估计转化为最大化数据的可能性

正如其他人解释的那样,这是使用EM算法迭代解决的; EM从对混合物模型参数的初始估计或猜测开始。根据参数产生的混合密度,迭代地对数据实例重新评分。然后将重新计分的实例用于更新参数估计。重复此过程,直到算法收敛为止。

不幸的是,EM算法对模型的初始化非常敏感,因此,如果设置的初始值很低,甚至陷入局部最优状态,收敛可能会花费很长时间。初始化GMM参数的一种更好的方法是使用K-means作为第一步(如您的代码所示),并使用这些聚类的均值/均值来初始化EM。

与其他聚类分析技术一样,我们首先需要确定要使用的聚类数量交叉验证是一种可靠的方法,可以很好地估计群集数量。

EM群集受以下事实困扰:要适应许多参数,通常需要大量数据和多次迭代才能获得良好的结果。具有M混合物和D维数据的无约束模型涉及拟合D*D*M + D*M + M参数(M个协方差矩阵,每个大小为DxD,加上M个平均长度为D的向量,以及一个长度为先验的向量M)。对于具有大量维的数据集而言,这可能是个问题。因此,通常施加限制和假设以简化问题(一种避免过度拟合问题的正则化 )。例如,你可以修复的协方差矩阵是唯一的对角,甚至有协方差矩阵共享所有高斯。

最后,一旦拟合了混合模型,就可以通过使用每个混合分量计算数据实例的后验概率来探索聚类(就像我在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集群

收藏
评论

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

但是,GMM也遭受K均值的弱点,即必须选择参数K(即簇数)。这需要对数据的多模式性有一个很好的了解。

收藏
评论

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号