function [X,I]=KM(soubor,nsh,s,IT,typ) % implementace algoritmu k-means za pouziti jadrovych funkci % % vstupni parametry: % % soubor - nazev souboru s daty (format *.mat) % nsh - pocet shluku % s - parametr pro polynomialni funkci - rad polynomu nebo pro RBF parametr sigma % (vyber podle parametru typ) % IT - pocet prubehu algoritmu % typ - retezec - 'lin' - linearni funkce % 'poly' - polynomialni funkce % 'rbf' - RBF funkce if nargin<1 'Potrebuji vstupni data' return; end if nargin<2 nsh=2; end load(soubor) %T=zeros(2,nsh); %T(i) - teziste shluku i n=size(X,2); I_OLD=-ones(1,n); I_opt=-ones(1,n); vzd_min=inf; for iterace=1:IT vzd=0; ok=0; %počáteční podmínky I=ones(1,n); rnd=randperm(n); for i=1:nsh I(rnd(i))=i; end %vlastní shlukování while (not(ok)) ok=1; D=zeros(n,nsh); %D(i) - vzdalenost testovaneho bodu od shluku i XT=zeros(n,nsh); TT=zeros(1,nsh); XX=zeros(1,n); for sh=1:nsh Pa=(I==sh); pocet(sh)=Pa*Pa'; %pocet(i) - pocet bodu ve shluku i for p=1:n if I(p)==sh for q=1:n if I(q)==sh TT(sh)=TT(sh)+k(X(:,p),X(:,q),s,typ); end end end end TT(sh)=TT(sh)/pocet(sh)^2; end for i=1:n XX(i)=XX(i)+k(X(:,i),X(:,i),s,typ); end for i=1:n for sh=1:nsh for p=1:n if I(p)==sh XT(i,sh)=XT(i,sh)+k(X(:,i),X(:,p),s,typ); end end D(i,sh)=XX(i)-2*XT(i,sh)/pocet(sh)+TT(sh); end end for i=1:n for sh=1:nsh if D(i,sh)==min(D(i,:)) I(i)=sh; vzd=vzd+D(i,sh); end; end; end; ok=isequal(I_OLD,I); I_OLD=I; end if vzd_min>vzd vzd_min=vzd; I_opt=I; end [vzd_min vzd] end H=figure(9); ppatterns(X,I_opt); hold on; cont(X,I_opt,s,nsh,typ);