forked from PRML/PRMLT
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathknKmeans.m
executable file
·39 lines (39 loc) · 1.03 KB
/
knKmeans.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function [label, energy, model] = knKmeans(X, init, kn)
% Perform kernel k-means clustering.
% Input:
% K: n x n kernel matrix
% init: either number of clusters (k) or initial label (1xn)
% Output:
% label: 1 x n clustering result label
% energy: optimization target value
% model: trained model structure
% Reference: Kernel Methods for Pattern Analysis
% by John Shawe-Taylor, Nello Cristianini
% Written by Mo Chen ([email protected]).
n = size(X,2);
if numel(init)==1
k = init;
label = ceil(k*rand(1,n));
elseif numel(init)==n
label = init;
end
if nargin < 3
kn = @knGauss;
end
K = kn(X,X);
last = 0;
while any(label ~= last)
[u,~,label(:)] = unique(label); % remove empty clusters
k = numel(u);
E = sparse(label,1:n,1,k,n,n);
E = spdiags(1./sum(E,2),0,k,k)*E;
T = E*K;
last = label;
[val, label] = max(bsxfun(@minus,T,diag(T*E')/2),[],1);
end
energy = trace(K)-2*sum(val);
if nargout == 3
model.X = X;
model.label = label;
model.kn = kn;
end