%2.9 highamkmeanscode.m % KMEANS_EX.M % Illustrate k means in a case where % objects fall into two well defined groups. % % This code can be contrasted with % the spectral clustering code clus_ex.m % % Objects are placed in 2D % % Two centers A and B are chosen by the user, and % an object goes into group A if it is closest to A, and % into group B if it is closest to B. % % The center of mass for points in group A becomes the % new center A, and the center of mass for points in % group B becomes the new center B. We then proceed iteratively. % % DJH -> GS. This version: June 2007 % clf randn('state',100); % generate points in two groups N = 20; for i = 1:N/2, x(i) = 1 + 0.2*randn; % near x=1 y(i) = 1 + 0.2*randn; % near y=1 end for i = N/2+1:N, x(i) = 2 + 0.2*randn; % near x = 2 y(i) = 2 + 0.2*randn; % near y =2 end plot(x,y,'*','MarkerSize',10) display(' Type in coordinates for two centers') xa = input(' x coord for center A = ') ya = input(' y coord for center A = ') xb = input(' x coord for center B = ') yb = input(' y coord for center B = ') carry_on = 1; while carry_on == 1 pa = [xa;ya]; pb = [xb;yb]; A = []; % B = []; % Groups A and B start off empty for i = 1:N p = [x(i);y(i)]; dista = norm(p - pa); distb = norm(p - pb); if dista < distb A = [A,p]; % add to group A else B = [B,p]; % add to group B end end if isempty(A)|isempty(B) %% problem: one is empty disp('Terminate! One group is empty') carry_on = 0; else clf plot(A(1,:),A(2,:),'r*','MarkerSize',10) hold on plot(xa,ya,'ro','MarkerSize',10) plot(B(1,:),B(2,:),'g*','MarkerSize',10) plot(xb,yb,'go','MarkerSize',10) xa = mean(A(1,:)); ya = mean(A(2,:)); xb = mean(B(1,:)); yb = mean(B(2,:)); carry_on = input('Type 1 to continue ') end end