diff --git a/chapter06/knKmeans.m b/chapter06/knKmeans.m index 49c6c15..2265e83 100755 --- a/chapter06/knKmeans.m +++ b/chapter06/knKmeans.m @@ -1,7 +1,7 @@ -function [label, model, energy] = knKmeans(X, init, kn) +function [label, model, energy] = knKmeans(K, init) % Perform kernel kmeans clustering. % Input: -% K: n x n kernel matrix +% K: n x n data matrix % init: either number of clusters (k) or initial label (1xn) % Output: % label: 1 x n sample labels @@ -10,17 +10,13 @@ % Reference: Kernel Methods for Pattern Analysis % by John Shawe-Taylor, Nello Cristianini % Written by Mo Chen (sth4nth@gmail.com). -n = size(X,2); +n = size(K,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 = zeros(1,n); while any(label ~= last) [~,~,last(:)] = unique(label); % remove empty clusters diff --git a/demo/ch06/knKmeans_demo.m b/demo/ch06/knKmeans_demo.m new file mode 100644 index 0000000..4d1882a --- /dev/null +++ b/demo/ch06/knKmeans_demo.m @@ -0,0 +1,23 @@ +%% Kernel kmeans with linear kernel is equivalent to kmeans +close all; clear; +d = 2; +k = 3; +n = 200; +[X, y] = kmeansRnd(d,k,n); +init = ceil(k*rand(1,n)); +K = knLin(X,X); +label = knKmeans(K,init); + +label0 = kmeans(X,init); +maxdiff(label,label0) +plotClass(X,label); +%% Kernel kmeans with Gaussian Kernel for nonlinear data +x1 = linspace(0,pi,n/2); +x2 = sin(x1); +X = [x1,x1+pi/2; + x2,-x2]; + +K = knGauss(X,X,0.4); +label = knKmeans(K,2); +figure; +plotClass(X,label); \ No newline at end of file