Source code for
vl_demo_gmm_convergence.m
This file is located in the toolbox/demo folder in VLFeat package.
dimension = 128;
numData = 10000;
numClusters = 100;
numIterations = 5;
numIterationsKM = 3;
X = rand(dimension,numData);
numTrials = 2;
lls = zeros(numTrials,2);
for trial = 1:numTrials
% kmeans initialization
startKMEANS = tic;
[initMeans, assignments] = vl_kmeans(X, numClusters, ...
'verbose', ...
'multithreading', 'parallel', ...
'algorithm','ann', ...
'MaxNumIterations',numIterationsKM, ...
'distance','l2', ...
'NumTrees',3, ...
'MaxNumComparisons', 5);
elapsedKMEANS = toc(startKMEANS);
fprintf('\n ---------- \n KMeans time - %f \n ---------- \n\n',elapsedKMEANS);
% compute initial gaussian parameters
initWeights = zeros(1,numClusters);
initSigmas = zeros(dimension,numClusters);
for i=1:numClusters
Xk = X(:,assignments==i);
initWeights(i) = size(Xk,2) / numClusters;
if size(Xk,1) == 0 || size(Xk,2) == 0
initSigmas(:,i) = diag(cov(X'));
else
initSigmas(:,i) = diag(cov(Xk'));
end
end
% gmm with kmeans init
[means,sigmas,weights,ll,posteriors] = vl_gmm(X, numClusters, ...
'initialization','custom', ...
'InitMeans',initMeans, ...
'InitSigmas',initSigmas, ...
'InitWeights',initWeights, ...
'verbose', ...
'multithreading', 'parallel', ...
'MaxNumIterations', numIterations);
elapsedGMM = toc(startKMEANS);
fprintf('\n ---------- \n GMM kmeans init time - %f \n ---------- \n\n',elapsedGMM);
lls(trial,1) = ll;
% gmm with random init
elapsedGMM = tic;
[means,sigmas,weights,ll,posteriors] = vl_gmm(X, numClusters, ...
'initialization','rand', ...
'verbose', ...
'multithreading', 'parallel', ...
'MaxNumIterations', numIterations);
elapsedGMM = toc(elapsedGMM);
fprintf('\n ---------- \n GMM random init time - %f \n ---------- \n\n',elapsedGMM);
lls(trial,2) = ll;
end
lls = sum(lls,1)/numTrials;
inits = {'KMeans','Random'};
disp(lls)
figure
bar(lls);
set(gca,'xticklabel',inits);
xlabel('Initialization type');
ylabel('LogLikelyhood');
title('GMM convergence test')