【发布时间】:2014-11-19 02:31:26
【问题描述】:
我正在尝试通过阅读在线资源来了解 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);
基于上述我有means、covariances 和priors。我的主要问题是,现在怎么办?我现在有点迷路了。
此外,means、covariances 向量的大小分别为 128 x 50。我期待它们是1 x 50,因为每一列都是一个集群,每个集群不会只有一个均值和协方差吗? (我知道 128 是 SIFT 特征,但我期待的是均值和协方差)。
在 k-means 中,我使用了 MatLab 命令knnsearch(X,Y),它基本上为 Y 中的每个点找到 X 中最近的邻居。
那么如何在 GMM 中实现这一点,我知道它是概率的集合,当然,与该概率最近的匹配将是我们的获胜集群。这就是我感到困惑的地方。
网上所有的教程都讲了如何实现means、covariances的值,但是在聚类方面如何实际使用它们就不多说了。
谢谢
【问题讨论】:
标签: matlab machine-learning classification cluster-analysis mixture-model