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