Source code for
vl_demo_kmeans_ann_speed.m
This file is located in the toolbox/demo folder in VLFeat package.
% VL_DEMO_KMEANS_ANN_SPEED Compares Lloyd's, Elkan, and ANN k-means
numCenters = 200 ;
numTrials = 3 ;
maxNumIterations = 10 ;
initialization = 'randsel' ;
%initialization = 'plusplus';
distance = 'l2' ;
%% Create an example dataset
dimension = 32 ;
numData = 50000 ;
X = randn(dimension,numData);
%% Run various k-means algorithms on the data
algorithms = {'Lloyd','Elkan','ANN 1/4','ANN 1/10','ANN 1/50' } ;
options = {{'Algorithm', 'Lloyd'}, ...
{'Algorithm', 'Elkan'}, ...
{'Algorithm', 'ANN', 'MaxNumComparisons', ceil(numCenters / 4)}, ...
{'Algorithm', 'ANN', 'MaxNumComparisons', ceil(numCenters / 10)}, ...
{'Algorithm', 'ANN', 'MaxNumComparisons', ceil(numCenters / 50)}} ;
numCpus = [1 0] ;
clear time energy ;
for n = 1:2
for a = 1:numel(algorithms)
for t = 1:numTrials
vl_threads(numCpus(n)) ;
start = tic ;
[C, A, E] = vl_kmeans(X, ...
numCenters, 'Verbose', ...
'Distance', distance, ...
'MaxNumIterations', maxNumIterations, ...
options{a}{:}) ;
if vl_isoctave()
time(t,a,n) = (tic() - start) / 1e6 ;
else
time(t,a,n) = toc(start) ;
end
energy(t,a,n) = E ;
end
end
end
% average over tirals
time = squeeze(mean(time,1)) ;
energy = squeeze(mean(energy,1)) ;
figure(1) ; clf ;
for n=1:2
if n == 1
str = 'Serial' ;
else
str = 'Parallel' ;
end
subplot(3,2,(n-1)+1) ;
bar(time(:,n)) ;
set(gca,'XTickLabel',algorithms);
set(gca,'FontSize',8),
xlabel('Algorithm');
ylabel('Time [s]');
title(str) ;
subplot(3,2,(n-1)+3) ;
bar(energy(:,n));
set(gca,'XTickLabel',algorithms);
set(gca,'FontSize',8),
xlabel('Algorithm');
ylabel('Energy');
title(str) ;
subplot(3,2,(n-1)+5) ;
bar(time(1,1)./time(:,n)) ;
set(gca,'XTickLabel',algorithms);
set(gca,'FontSize',8),
xlabel('Algorithm');
ylabel('Speedup');
title(str) ;
end
vl_demo_print('kmeans_speed',1);