Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_clstruct.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_clstruct.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,206 @@ +function sC = som_clstruct(Z,varargin) + +%SOM_CLSTRUCT Create a clustering struct or set its field values. +% +% sC = som_clstruct(Z, [argID, value, ...]) +% +% Z = linkage(pdist(sM.codebook)); +% sC = som_clstruct(Z); +% sC = som_clstruct(sC,'coord',som_vis_coords(lattice,msize)); +% sC = som_clstruct(sC,'color',som_colorcode(sM)); +% sC = som_clstruct(sC,'base',sC.base(som_bmus(sM,sD))); +% +% Input and output arguments ([]'s are optional): +% Z (matrix) size clen-1 x 3, where clen is the number of +% base clusters. This is a clustering matrix +% similar to that produced by LINKAGE in +% Statistical Toolbox. See SOM_LINKAGE. +% (struct) clustering struct (as produced by this function) +% [argID, (string) See below. Each pair is the fieldname and +% value] (varies) the value to be given to that field. +% +% sC (struct) clustering struct +% +% The clustering struct is based on the assumption that there +% is a base partitioning of the SOM (or data) which is saved in +% the .base field of the struct. Then a hierarchical clustering +% is applied to this base partitioning. The results are saved to +% .tree field of the struct. Each cluster (base and combined) +% has also three properties: height, coordinate and color, which +% are used in the visualizations. The fields of the struct are: +% .type (string) 'som_clustering' +% .name (string) Identifier for the clustering. +% .tree (matrix) Size clen-1 x 3, as argument Z above. +% .base (vector) Size dlen x 1, the basic groups of data +% forming the base clusters, e.g. as a result +% of partitive clustering. Allowed values are +% 1:clen indicating the base cluster +% to which the data belongs to. +% NaN indicating that the data has +% been ignored in the clustering +% By default [1:clen]. +% .height (vector) Size 2*clen-1 x 1, (clustering) height for each +% cluster. By default 0 for each base cluster and +% .tree(:,3) for the others. +% .coord (matrix) Size 2*clen-1 x *, coordinate for each cluster, +% By default the coordinates are set so that +% the base clusters are ordered on a line, and the +% position of each combined cluster is average of +% the base clusters that constitute it. +% .color (matrix) Size 2*clen-1 x 3, color for each cluster. +% By default the colors are set so that the +% base clusters are ordered on a line, like above, +% and then colors are assigned from the 'hsv' +% colormap to the base clusters. The color +% of each combined cluster is average as above. +% +% Height, coord and color can also be specified in alternate forms: +% 'height' (vector) size 2*clen-1 x 1, if given explicitly +% size clen-1 x 1, specified heights of the +% combined clusters (the base cluster heights +% are all = 0) +% size 0 x 0, default value is used +% 'coord' (matrix) size 2*clen-1 x *, if given explicitly +% size clen x *, to give coordinates for base +% clusters; the coordinate of combined clusters +% are averaged from these +% size dlen x *, to give coordinates of the +% original data: the cluster coordinates are +% averaged from these based on base clusters +% size 0 x 0, default value is used +% 'color' (matrix) as 'coord' +% +% See also SOM_CLPLOT, SOM_CLVALIDITY, SOM_CLGET, SOM_CLLINKAGE. + +% Copyright (c) 2000 by the SOM toolbox programming team. +% Contributed to SOM Toolbox on XXX by Juha Vesanto +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Version 2.0beta juuso 180800 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if isstruct(Z), + base = Z.base; + color = Z.color; + coord = Z.coord; + height = Z.height; + name = Z.name; + Z = Z.tree; +else + base = []; + color = []; + coord = []; + height = []; + name = ''; +end +clen = size(Z,1)+1; + +i=1; +while i<=length(varargin), + argok = 1; + if ischar(varargin{i}), + switch varargin{i}, + case 'tree', i=i+1; Z = varargin{i}; clen = size(Z,1)+1; + case 'base', i=i+1; base = varargin{i}; + case 'color', i=i+1; color = varargin{i}; + case 'coord', i=i+1; coord = varargin{i}; + case 'height', i=i+1; height = varargin{i}; + case 'name', i=i+1; name = varargin{i}; + otherwise argok=0; + end + else argok = 0; + end + if ~argok, disp(['(som_clstruct) Ignoring invalid argument #' num2str(i+1)]); end + i = i+1; +end + +if isempty(base), + dlen = clen; + base = 1:dlen; +else + dlen = length(base); + if any(base)>clen | any(base)<1, error('Incorrect base partition vector.'); end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% analysis of hierarchy + +% order of base clusters +order = 2*clen-1; +nonleaves = 1; +while any(nonleaves), + j = nonleaves(1); + ch = Z(order(j)-clen,1:2); + if j==1, oleft = []; else oleft = order(1:(j-1)); end + if j==length(order), oright = []; else oright = order((j+1):length(order)); end + order = [oleft, ch, oright]; + nonleaves = find(order>clen); +end + +% base cluster indeces for each non-base cluster +basecl = cell(clen-1,1); +for i=1:clen-1, + c1 = Z(i,1); if c1>clen, c1 = basecl{c1-clen}; end + c2 = Z(i,2); if c2>clen, c2 = basecl{c2-clen}; end + basecl{i} = [c1 c2]; +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% set coordinates, color and height and make the struct + +% coordinates +if size(coord,1)==2*clen-1, % this is ok already +else + if size(coord,1)==0, % the default + [dummy,coord] = sort(order); + coord = coord'; + elseif size(coord,1)==dlen & dlen>clen, % coordinates given for original data + codata = coord; + coord = zeros(clen,size(coord,2)); + for i=1:clen, coord(i,:) = mean(codata(find(base==i),:),1); end + end + if size(coord,1)==clen, % average from base clusters + coord = [coord; zeros(clen-1,size(coord,2))]; + for i=1:clen-1, coord(i+clen,:) = mean(coord(basecl{i},:),1); end + else + error('Incorrect coordinate matrix.'); + end +end + +% color +if size(color,1)==2*clen-1, % this is ok already +else + if size(color,1)==0, % the default + color(order,:) = hsv(length(order)); + elseif size(color,1)==dlen & dlen>clen, % colors given for original data + codata = color; + color = zeros(clen,3); + for i=1:clen, color(i,:) = mean(codata(find(base==i),:),1); end + end + if size(color,1)==clen, % average from base clusters + color = [color; zeros(clen-1,3)]; + for i=1:clen-1, color(i+clen,:) = mean(color(basecl{i},:),1); end + else + error('Incorrect color matrix.'); + end +end + +% height +if isempty(height), + height = [zeros(clen,1); Z(:,3)]; +elseif length(height)==clen-1, + if size(height,2)==clen-1, height = height'; end + height = [zeros(clen,1); height]; +elseif length(height)~=2*clen-1, + error('Incorrect height vector.'); +end + +% make the struct +sC = struct('type','som_clustering',... + 'name',name,'base',base,'tree',Z,... + 'color',color,'coord',coord,'height',height); +return; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +