diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_order_cplanes.m @ 0:e9a9cd732c1e tip

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