如果您先看看
GMM型号代表什么,我认为这将有所帮助。我将从
Statistics Toolbox使用
functions,但您应该能够使用VLFeat做同样的事情。
我们从两个一维normal distributions的混合开始。每个高斯由一对mean和variance表示。混合物为每个组件(之前)分配一个权重。
例如,混合两个具有相等权重的正态分布(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));
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
以下是两维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中,如果矩阵是对角线的,则意味着两个维度不会相互变化。在这种情况下,PDF将看起来像一个轴对齐的椭圆从水平或垂直伸展,根据哪个维度有更大的方差。如果它们相等,那么形状就是一个完美的圆(分布在两个维度上以相等的速度展开)。最后,如果协方差矩阵是任意的(非对角线,但是通过定义仍然对称),那么它可能看起来像是以某种角度旋转的拉伸椭圆。
所以在上图中,你应该能够分开两个“颠簸”,分别表示什么。当你去3D和更高的维度,认为它代表(hyper-)ellipsoids在N-dims。
现在,当您使用GMM执行clustering时,目标是找到模型参数(每个分布的平均值和协方差以及先验),以便得到的模型最适合数据。给定GMM模型的最佳拟合估计转化为maximizing the likelihood(意味着您选择最大化Pr(数据|模型)的模型)。
正如其他人所解释的,这是使用EM algorithm迭代地解决的; EM从初始估计或混合模型参数的猜测开始。它反复地根据参数产生的混合密度重新计算数据实例。然后使用重新评分的实例来更新参数估计。直到算法收敛为止。
不幸的是,EM算法对模型的初始化非常敏感,因此如果设置较差的初始值,甚至在local optima中停留可能需要很长时间才能收敛。更好的初始化GMM参数的方法是使用K-means作为第一步(像您在代码中显示的那样),并使用这些集群的平均值/ cov来初始化EM。
EM聚类受到以下事实的困扰:有很多参数要适应,通常需要大量的数据和许多迭代来获得好的结果。具有M混合和D维数据的无约束模型包括拟合D * D * M D * M M参数(每个尺寸为DxD的M个协方差矩阵,加上长度为D的M个平均向量,以及长度为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')