Я пытаюсь понять GMM, читая источники, доступные в Интернете. Я достиг кластеризации с использованием K-Means и видел, как GMM будет сравнивать с K-средствами.
Вот что я понял, пожалуйста, дайте мне знать, если моя концепция неверна:
GMM подобен KNN, в том смысле, что кластеризация достигается в обоих случаях. Но в GMM каждый кластер имеет собственное независимое среднее и ковариацию. Кроме того, k-средство выполняет жесткие присвоения точек данных кластерам, тогда как в GMM мы получаем коллекцию независимых гауссовских распределений, и для каждой точки данных мы имеем вероятность того, что она принадлежит к одному из распределений.
Чтобы лучше понять, я использовал MatLab для кодирования и достижения желаемой кластеризации. Я использовал функции SIFT для извлечения функции. И для инициализации значений использовалась кластеризация k-mean. (Это из документа 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-значении я использовал команду MatLab knnsearch(X,Y)
, которая в основном находит ближайшего соседа в X для каждой точки в Y.
Итак, как добиться этого в GMM, я знаю его совокупность вероятностей, и, конечно, ближайший матч от этой вероятности будет нашим выигрывающим кластером. И здесь я смущен.
Все обучающие программы в Интернете научили, как достичь значений means
, covariances
, но не много говорят о том, как их использовать в терминах кластеризации.
Спасибо