wolffd@0: function P = som_order_cplanes(sM, varargin) wolffd@0: wolffd@0: %SOM_ORDER_CPLANES Orders and shows the SOM component planes. wolffd@0: % wolffd@0: % P = som_order_cplanes(sM, [[argID,] value, ...]) wolffd@0: % wolffd@0: % som_order_cplanes(sM); wolffd@0: % som_order_cplanes(sM,'comp',1:30,'simil',C,'pca'); wolffd@0: % P = som_order_cplanes(sM); wolffd@0: % wolffd@0: % Input and output arguments ([]'s are optional): wolffd@0: % sM (struct) map or data struct wolffd@0: % (matrix) a data matrix, size * x dim wolffd@0: % [argID, (string) See below. The values which are unambiguous can wolffd@0: % value] (varies) be given without the preceeding argID. wolffd@0: % wolffd@0: % P (matrix) size n x * (typically n x 2), the projection coordinates wolffd@0: % wolffd@0: % Here are the valid argument IDs and corresponding values. The values wolffd@0: % which are unambiguous (marked with '*') can be given without the wolffd@0: % preceeding argID. wolffd@0: % 'comp' (vector) size 1 x n, which components to project, 1:dim by default wolffd@0: % 'simil' *(string) similarity measure to use wolffd@0: % 'corr' linear correlation between component planes wolffd@0: % 'abs(corr)' absolute value of correlation (default) wolffd@0: % 'umat' as 'abs(corr)' but calculated from U-matrices wolffd@0: % 'mutu' mutual information (not implemented yet) wolffd@0: % (matrix) size n x n, a similarity matrix to be used wolffd@0: % 'proj' *(string) projection method to use: 'SOM' (default), wolffd@0: % 'pca', 'sammon', 'cca', 'order', 'ring' wolffd@0: % 'msize' (vector) size of the SOM that is used for projection wolffd@0: % 'show' *(string) how visualization is done: 'planes' (default), wolffd@0: % 'names', or 'none' wolffd@0: % 'mask' (vector) dim x 1, the mask to use, ones(dim,1) by default wolffd@0: % 'comp_names' (cell array) of strings, size dim x 1, the component names wolffd@0: % wolffd@0: % The visualized objects have a callback associated with them: by wolffd@0: % clicking on the object, the index and name of the component are printed wolffd@0: % to the standard output. wolffd@0: % wolffd@0: % See also SOM_SHOW. wolffd@0: wolffd@0: % Copyright (c) 2000 by the SOM toolbox programming team. wolffd@0: % Contributed to SOM Toolbox on June 16th, 2000 by Juha Vesanto wolffd@0: % http://www.cis.hut.fi/projects/somtoolbox/ wolffd@0: wolffd@0: % Version 2.0beta juuso 120600 070601 wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% check arguments wolffd@0: wolffd@0: % sM wolffd@0: if isstruct(sM), wolffd@0: switch sM.type wolffd@0: case 'som_map', wolffd@0: D = sM.codebook; dim = size(D,2); cnames = sM.comp_names; mask = sM.mask; wolffd@0: ismap = 1; wolffd@0: case 'som_data', wolffd@0: D = sM.data; dim = size(D,2); cnames = sM.comp_names; mask = ones(dim,1); wolffd@0: ismap = 0; wolffd@0: otherwise, error('Invalid first argument.'); wolffd@0: end wolffd@0: else wolffd@0: D = sM; wolffd@0: dim = size(D,2); mask = ones(dim,1); wolffd@0: cnames = cell(dim,1); wolffd@0: for i = 1:dim, cnames{i} = sprintf('Variable%d',i); end wolffd@0: ismap = 0; wolffd@0: end wolffd@0: wolffd@0: % defaults wolffd@0: comps = 1:dim; wolffd@0: simil = 'abs(corr)'; wolffd@0: proj = 'SOM'; wolffd@0: show = 'planes'; wolffd@0: mapsize = NaN; wolffd@0: wolffd@0: % varargin wolffd@0: i=1; wolffd@0: while i<=length(varargin), wolffd@0: argok = 1; wolffd@0: if ischar(varargin{i}), wolffd@0: switch varargin{i}, wolffd@0: % argument IDs wolffd@0: case 'mask', i=i+1; mask = varargin{i}; wolffd@0: case 'comp_names', i=i+1; cnames = varargin{i}; wolffd@0: case 'comp', i=i+1; comps = varargin{i}; wolffd@0: case 'proj', i=i+1; proj = varargin{i}; wolffd@0: case 'show', i=i+1; show = varargin{i}; wolffd@0: case 'simil', i=i+1; simil = varargin{i}; wolffd@0: case 'msize', i=i+1; mapsize = varargin{i}; wolffd@0: % unambiguous values wolffd@0: case {'corr','abs(corr)','umat','mutu'}, simil = varargin{i}; wolffd@0: case {'SOM','pca','sammon','cca','order','ring'}, proj = varargin{i}; wolffd@0: case {'planes','names','none'}, show = varargin{i}; wolffd@0: otherwise argok=0; wolffd@0: end wolffd@0: else wolffd@0: argok = 0; wolffd@0: end wolffd@0: if ~argok, wolffd@0: disp(['(som_order_cplanes) Ignoring invalid argument #' num2str(i+1)]); wolffd@0: end wolffd@0: i = i+1; wolffd@0: end wolffd@0: wolffd@0: if strcmp(show,'planes') & ~ismap, wolffd@0: warning('Given data is not a map: using ''names'' visualization.'); wolffd@0: show = 'names'; wolffd@0: end wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% similarity matrix wolffd@0: wolffd@0: fprintf(1,'Calculating similarity matrix\n'); wolffd@0: wolffd@0: % use U-matrix wolffd@0: if strcmp(simil,'umat'), wolffd@0: if ~ismap, error('Given data is not a map: cannot use U-matrix similarity.'); end wolffd@0: U = som_umat(sM); wolffd@0: D = zeros(prod(size(U)),dim); wolffd@0: m = zeros(dim,1); wolffd@0: for i=1:dim, m=m*0; m(i)=1; U = som_umat(sM,'mask',m); D(:,i) = U(:); end wolffd@0: end wolffd@0: wolffd@0: % components wolffd@0: D = D(:,comps); wolffd@0: cnames = cnames(comps); wolffd@0: mask = mask(comps); wolffd@0: dim = length(comps); wolffd@0: wolffd@0: % similarity matrix wolffd@0: if ischar(simil), wolffd@0: switch simil, wolffd@0: case {'corr','abs(corr)','umat'}, wolffd@0: A = zeros(dim); wolffd@0: me = zeros(1,dim); wolffd@0: for i=1:dim, wolffd@0: me(i) = mean(D(isfinite(D(:,i)),i)); D(:,i) = D(:,i) - me(i); wolffd@0: end wolffd@0: for i=1:dim, wolffd@0: for j=i:dim, wolffd@0: c = D(:,i).*D(:,j); c = c(isfinite(c)); wolffd@0: A(i,j) = sum(c)/length(c); A(j,i) = A(i,j); wolffd@0: end wolffd@0: end wolffd@0: s = diag(A); wolffd@0: A = A./sqrt(s*s'); wolffd@0: switch simil, wolffd@0: case {'abs(corr)','umat'}, A = abs(A); wolffd@0: case 'corr', A = A + 1; wolffd@0: end wolffd@0: case 'mutu', wolffd@0: error('Mutual information not implemented yet.'); wolffd@0: end wolffd@0: else wolffd@0: A = simil; wolffd@0: end wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% projection wolffd@0: wolffd@0: fprintf(1,'Projection\n'); wolffd@0: wolffd@0: mu = 2*dim; wolffd@0: wolffd@0: switch proj, wolffd@0: case 'SOM', wolffd@0: wolffd@0: if isnan(mapsize), wolffd@0: sMtmp = som_randinit(A,'munits',mu); wolffd@0: msize = sMtmp.topol.msize; wolffd@0: else wolffd@0: msize = mapsize; wolffd@0: end wolffd@0: wolffd@0: sM2 = som_make(A,'msize',msize,'rect','tracking',0); wolffd@0: bm = assign_unique_bm(sM2,A); wolffd@0: Co = som_unit_coords(sM2); wolffd@0: P = Co(bm,:); wolffd@0: wolffd@0: case 'ring', wolffd@0: wolffd@0: if isnan(mapsize), msize = [1 mu]; else msize = mapsize; end wolffd@0: wolffd@0: sM2 = som_make(A,'msize',msize,'cyl','rect','tracking',0); wolffd@0: bm = assign_unique_bm(sM2,A); wolffd@0: Co = som_unit_coords(sM2); wolffd@0: P = Co(bm,[1 3]); wolffd@0: wolffd@0: case 'order', wolffd@0: wolffd@0: if isnan(mapsize), msize = [1 mu]; else msize = mapsize; end wolffd@0: wolffd@0: sM2 = som_make(A,'msize',msize,'tracking',0); wolffd@0: bm = assign_unique_bm(sM2,A); wolffd@0: [dummy,i] = sort(bm); wolffd@0: [dummy,P] = sort(i); wolffd@0: if size(P,2)>1, P = P'; end wolffd@0: if size(P,2)==1, P(:,2) = zeros(length(P),1); end wolffd@0: wolffd@0: case {'pca','sammon','cca'}, wolffd@0: P = pcaproj(A,2); wolffd@0: if strcmp(proj,'sammon'), P = sammon(A,P,50,'steps'); wolffd@0: elseif strcmp(proj,'cca'), P = cca(A,P,50); wolffd@0: end wolffd@0: wolffd@0: end wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% visualization wolffd@0: wolffd@0: if ~strcmp(show,'none'), wolffd@0: fprintf(1,'Visualization\n'); wolffd@0: cla wolffd@0: hold on wolffd@0: if strcmp(show,'planes') wolffd@0: s = findscaling(sM.topol.msize,P); wolffd@0: for i=1:dim, wolffd@0: C = som_normcolor(D(:,i)); wolffd@0: if strcmp(simil,'umat'), wolffd@0: h=som_cplane([sM.topol.lattice 'U'],sM.topol.msize,C,1,s*P(i,:)); wolffd@0: else wolffd@0: h=som_cplane(sM,C,1,s*P(i,:)); wolffd@0: end wolffd@0: set(h,'edgecolor','none','Userdata',sprintf('[%d] %s',i,cnames{i})); wolffd@0: set(h,'ButtonDownFcn','fprintf(1,''%s\n'',get(gco,''UserData''))'); wolffd@0: end wolffd@0: else wolffd@0: s=1; wolffd@0: a=[min(P(:,1))-1 max(P(:,1))+1 min(P(:,2))-1-3 max(P(:,2))+1-3]; wolffd@0: axis(s*a); wolffd@0: end wolffd@0: h=text(s*P(:,1),s*P(:,2)-3,cnames); wolffd@0: for i=1:length(h), set(h(i),'Userdata',sprintf('[%d] %s',i,cnames{i})); end wolffd@0: set(h,'ButtonDownFcn','fprintf(1,''%s\n'',get(gco,''UserData''))'); wolffd@0: hold off wolffd@0: wolffd@0: axis on; axis equal; axis tight; set(gca,'XTick',[],'YTick',[],'Box','on'); wolffd@0: end wolffd@0: wolffd@0: return; wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 wolffd@0: %% subfunctions wolffd@0: wolffd@0: function bm = assign_unique_bm(sM,D) wolffd@0: wolffd@0: munits = size(sM.codebook,1); wolffd@0: [dlen dim] = size(D); wolffd@0: margin = max(0,dlen-munits); wolffd@0: wolffd@0: [bm,qers] = som_bmus(sM,D); wolffd@0: bmi=ones(dim,1); wolffd@0: hits = som_hits(sM,D); wolffd@0: mult = find(hits>1); wolffd@0: while any(mult) & sum(hits(mult))-length(mult)>margin, wolffd@0: choices = find(bm==mult(1)); wolffd@0: while length(choices)>1, wolffd@0: [dummy,mv] = max(qers(choices)); mv = choices(mv); wolffd@0: [mv_to,q] = som_bmus(sM,D(mv,:),bmi(mv)); wolffd@0: bmi(mv)=bmi(mv)+1; qers(mv) = q; bm(mv) = mv_to; wolffd@0: choices = find(bm==mv_to); wolffd@0: end wolffd@0: for i=1:length(hits), hits(i)=sum(bm==i); end wolffd@0: mult = find(hits>1); wolffd@0: end wolffd@0: return; wolffd@0: wolffd@0: function s = findscaling(msize,P) wolffd@0: wolffd@0: d1 = median(abs(diff(unique(sort(P(:,1)))))); wolffd@0: d2 = median(abs(diff(unique(sort(P(:,2)))))); wolffd@0: if d1>0, s1 = 1.5*msize(2)/d1; else s1 = 0; end wolffd@0: if d2>0, s2 = 1.5*msize(1)/d2; else s2 = 0; end wolffd@0: s = max(s1,s2); wolffd@0: if s==0, s=1; end wolffd@0: return; wolffd@0: wolffd@0: function alternative_SOM_plane_vis(sT,bm,simil,D,cnames) wolffd@0: wolffd@0: clf wolffd@0: for i=1:size(D,2), wolffd@0: subplot(sT.msize(2),sT.msize(1),bm(i)); wolffd@0: if strcmp(simil,'umat'), h=som_cplane([sT.lattice 'U'],sT.msize,D(:,i)); wolffd@0: else h=som_cplane(sT,D(:,i)); wolffd@0: end wolffd@0: set(h,'edgecolor','none'); wolffd@0: title(cnames{i}); wolffd@0: axis off wolffd@0: end wolffd@0: return; wolffd@0: