Skip to content

Commit

Permalink
tweak kmeans to the extreme
Browse files Browse the repository at this point in the history
  • Loading branch information
sth4nth committed Mar 12, 2017
1 parent 81c2796 commit e31258d
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 8 deletions.
9 changes: 4 additions & 5 deletions chapter09/kmeans.m
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
function [label, m, energy] = kmeans(X, init)
function [label, mu, energy] = kmeans(X, init)
% Perform kmeans clustering.
% Input:
% X: d x n data matrix
% init: k number of clusters or label (1 x n vector)
% Output:
% label: 1 x n cluster label
% mu: d x k center of clusters
% energy: optimization target value
% model: trained model structure
% Written by Mo Chen ([email protected]).
n = size(X,2);
idx = 1:n;
Expand All @@ -19,8 +19,7 @@
end
while any(label ~= last)
[~,~,last(:)] = unique(label); % remove empty clusters
E = sparse(idx,last,1); % transform label into indicator matrix
m = X*(E./sum(E,1)); % compute centers
[val,label] = min(dot(m,m,1)'/2-m'*X,[],1); % assign labels
mu = X*normalize(sparse(idx,last,1),1); % compute centers
[val,label] = min(dot(mu,mu,1)'/2-mu'*X,[],1); % assign labels
end
energy = dot(X(:),X(:),1)+2*sum(val);
4 changes: 2 additions & 2 deletions chapter09/kmeansPred.m
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
function [label, energy] = kmeansPred(m, X)
function [label, energy] = kmeansPred(mu, X)
% Prediction for kmeans clusterng
% Input:
% model: dx k cluster center matrix
Expand All @@ -7,5 +7,5 @@
% label: 1 x n cluster label
% energy: optimization target value
% Written by Mo Chen ([email protected]).
[val,label] = min(dot(X,X,1)+dot(m,m,1)'-2*m'*X,[],1); % assign labels
[val,label] = min(dot(X,X,1)+dot(mu,mu,1)'-2*mu'*X,[],1); % assign labels
energy = sum(val);
17 changes: 17 additions & 0 deletions chapter09/litekmeans.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
function [label, mu] = litekmeans(X, k)
n = size(X,2);
last = zeros(1,n);
label = ceil(k*rand(1,n));
while any(label ~= last)
[~,~,last(:)] = unique(label); % remove empty clusters
mu = X*normalize(sparse(1:n,last,1),1); % compute cluster centers
[~,label] = min(dot(mu,mu,1)'/2-mu'*X,[],1); % assign sample labels
end
% Perform kmeans clustering.
% Input:
% X: d x n data matrix
% k: number of clusters
% Output:
% label: 1 x n cluster label
% mu: d x k center of clusters
% Written by Mo Chen ([email protected]).
2 changes: 1 addition & 1 deletion common/normalize.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
if isempty(dim), dim = 1; end
end
s = sum(X,dim);
Y = bsxfun(@times,X,1./s);
Y = X./s;

0 comments on commit e31258d

Please sign in to comment.