initcmplg.m0000644001162100017530000000110010743356766013033 0ustar fschwenkni-wir%%%%%%%%%%%%%%%%%%%%% Initialisieren function AntwortMatrix = initcmplg(k, Daten) [m,d] = size(Daten); a = min(Daten); b = max(Daten); delta = b-a; % a = a - 0.5*delta; % b = b + 0.5*delta; % delta = 2*delta; ks = floor(k/4); kr = ks + (k-4*ks); for i=1 : ks AntwortMatrix(i,:) = [a(1) (a(2)+i*delta(2)/ks)]; end for i=1 : ks AntwortMatrix(i+ks,:) = [(a(1) + i*delta(1)/ks) b(2)]; end for i=1 : ks AntwortMatrix(i+2*ks,:) = [b(1) (b(2)-i*delta(2)/ks)]; end for i=1 : kr AntwortMatrix(i+3*ks,:) = [ (b(1)-i*delta(1)/kr) a(2)]; end kohonen.m0000644001162100017530000000064011133136223012470 0ustar fschwenkni-wirclear all; close all; data = rand(500,2); anzZentren = 100; Lernrate = 0.01; center = initcmplg(anzZentren, data); plotten(data,center,0); % drawnow; pause i = 1; maxiteration = 50; sigma = 3.0; for i=1:maxiteration sigma = sigma*(1.1 - i/maxiteration); center= somstep(data, center, Lernrate, sigma); f(i) = fehler(data, center); plotten(data,center,i); drawnow; end print -deps koh.eps fehler.m0000644001162100017530000000050011133136303012266 0ustar fschwenkni-wir function error = fehler(Daten,Zentren) [m,d] = size(Daten); [k,dummy] = size(Zentren); error = 0.0; % ueber alle Datenpunkte for i= 1:m dist = (sum(((Zentren - repmat(Daten(i,:),k,1) ).^2)'))'; [di,update] = min(dist); error = error + di; end % for i error = error/m; plotten.m0000644001162100017530000000042610743355646012540 0ustar fschwenkni-wir%%%%%%%%%%%%%%%%% Plotten von daten und Zentren function plotten(punkte, zentren, i) hold off; plot(punkte(:,1), punkte(:,2),'.'); hold on; plot(zentren(:,1),zentren(:,2),'r*'); hold on; plot(zentren(:,1),zentren(:,2),'r-'); title([int2str(i) ' Lernepochen']); hold off;somstep.m0000644001162100017530000000125210743355707012541 0ustar fschwenkni-wir%%%%%%%%%%%%%%%%%%% Eine Lernepoche trainieren function AntwortZentren = somstep(Daten,Zentren,l, sigma) [m,d] = size(Daten); [k,dummy] = size(Zentren); % ueber alle Datenpunkte for i= 1:m dist = (sum(((Zentren - repmat(Daten(i,:),k,1) ).^2)'))'; [dummy,winner] = min(dist); for update = 1:k distanz = min( abs(winner-update), min(update,winner)+k-max(update,winner) ); if (distanz <= 5) s = exp(- distanz*distanz/( 2 * sigma * sigma)); Zentren(update,:) = Zentren(update,:) + ((Daten(i,:) - Zentren(update,:)) .* (l*s)); end end; end % for i AntwortZentren = Zentren;