我试图通过阅读在线可用的资源来了解 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
值,但在聚类方面如何实际使用它们并没有多说。
谢谢