Contents
kernelkmeans.m
From A First Course in Machine Learning, Chapter 6. Simon Rogers, 01/11/11 [simon.rogers@glasgow.ac.uk] Kernel K-means
clear all;close all;
Load the data
load ../data/kmeansnonlindata
Plot the data
figure(1);hold off plot(X(:,1),X(:,2),'ko');

Compute the kernel
N = size(X,1); Ke = zeros(N); gam = 1; for n = 1:N for n2 = 1:N Ke(n,n2) = exp(-gam*sum((X(n,:)-X(n2,:)).^2)); end end
Run Kernel K-means
converged = 0; % Assign all objects into one cluster except one % Kernel K-means is *very* sensitive to initial conditions. Try altering % this initialisation to see the effect. K = 2; Z = repmat([1 0],N,1); s = sum(X.^2,2); pos = find(s==min(s)); Z(pos,:) = [0 1]; di = zeros(N,K); cols = {'r','b'};
Plot the assignments
figure(1);hold off for k = 1:K pos = find(Z(:,k)); plot(X(pos,1),X(pos,2),'ko','markerfacecolor',cols{k}); hold on end

while ~converged
Nk = sum(Z,1); for k = 1:K % Compute kernelised distance di(:,k) = diag(Ke) - (2/(Nk(k)))*sum(repmat(Z(:,k)',N,1).*Ke,2) + ... Nk(k)^(-2)*sum(sum((Z(:,k)*Z(:,k)').*Ke)); end oldZ = Z; Z = (di == repmat(min(di,[],2),1,K)); Z = 1.0*Z; if sum(sum(oldZ~=Z))==0 converged = 1; end
Plot the assignments
figure(1);hold off for k = 1:K pos = find(Z(:,k)); plot(X(pos,1),X(pos,2),'ko','markerfacecolor',cols{k}); hold on end




end