Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_fuzzycolor.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_fuzzycolor.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,205 @@ +function [color,X]=som_fuzzycolor(sM,T,R,mode,initRGB,S) + +% SOM_FUZZYCOLOR Heuristic contraction projection/soft cluster color coding for SOM +% +% function [color,X]=som_fuzzycolor(map,[T],[R],[mode],[initRGB],[S]) +% +% sM (map struct) +% [T] (scalar) parameter that defines the speed of contraction +% T<1: slow contraction, T>1: fast contraction. Default: 1 +% [R] (scalar) number of rounds, default: 30 +% [mode] (string) 'lin' or 'exp', default: 'lin' +% [initRGB] (string) Strings accepted by SOM_COLORCODE, default: 'rgb2' +% [S] (matrix) MxM matrix a precalculated similarity matrix +% color (matrix) of size MxRx3 resulting color codes at each step +% X (matrix) of size MxRx2 coordiantes for projected unit weight vectors +% at each step of iteration. (Color code C is calculated using this +% projection.) +% +% The idea of the projection is to use a naive contraction model which +% pulls the units together. Units that are close to each other in the +% output space (clusters) contract faster into the same point in the +% projection. The original position for each unit is its location in +% the topological grid. +% +% This is an explorative tool to color code the map units so that +% similar units (in the sense of euclidean norm) have similar coloring +% (See also SOM_KMEANSCOLOR) The tool gives a series of color codings +% which start from an initial color coding (see SOM_COLORCODE) and +% show the how the fuzzy clustering process evolves. +% +% The speed of contraction is controlled by the input parameter T. If +% it is high the projection contracts more slowly and reveals more +% intermediate stages (hierarchy). A good value for T must be +% searched manually. It is probable that the default values do not +% yield good results. +% +% The conatrction process may be slow. In this case the mode can be +% set to 'exp' instead of 'lin', however, then the computing becomes +% heavier. +% +% EXAMPLE +% +% load iris; % or any other map struct sM +% [color]=som_fuzzycolor(sM,'lin',10); +% som_show(sM,'color',color); +% +% See also SOM_KMEANSCOLOR, SOM_COLORCODE, SOM_CLUSTERCOLOR +% +% REFERENCES +% +% Johan Himberg, "A SOM Based Cluster Visualization and Its +% Application for False Coloring", in Proceedings of International +% Joint Conference on Neural Networks (IJCNN2000)}, +% pp. 587--592,Vol. 3, 2000 +% +% Esa Alhoniemi, Johan Himberg, and Juha Vesanto, Probabilistic +% Measures for Responses of Self-Organizing Map Units, pp. 286--290, +% in Proceedings of the International ICSC Congress on Computational +% Intelligence Methods and Applications (CIMA '99)}, ICSC Academic +% Press}, 1999 +% +% Outline of the heuristic +% +% First a matrix D of squared pairwise euclidean distances +% D(i,j)=d(i,j)^2 between map weight vectors is calculated. This +% matrix is transformed into a similarity matrix S, +% s(i,j)=exp(-(D(i,j)/(T.^2*v)), where T is a free input parameter and +% v the variance of all elements of D v=var(D(:)). The matrix is +% further normalized so that all rows sum to one. The original +% topological coordinates X=som_unit_coords(sM) are successively +% averaged using this matrix. X(:,:,i)=S^i*X(:,:,1); As the process is +% actually a series of successive weighted averagings of the initial +% coordinates, all projected points eventually contract into one +% point. T is a user defined parameter that defines how fast the +% projection contracts into this center point. If T is too small, the +% process will end into the center point at once. +% +% In practise, we don't calculate powers of S, but compute +% +% X(:,:,i)=S.*X(:,:,i-1); % mode: 'lin' +% +% The contraction process may be slow if T is selected to be large, +% then for each step the similarity matrix is squared +% +% X(:,:,i)=S*X(:,:,1); S=S*S % mode: 'exp' +% +% The coloring is done using the function SOM_COLORCODE according to +% the projections in X, The coordinates are rescaled in order to +% achieve maximum color resolution. + +% Contributed to SOM Toolbox vs2, 2000 by Johan Himberg +% Copyright (c) by Johan Himberg +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Previously rownorm function normalized the rows of S erroneously +% into unit length, this major bug was corrected 14042003. Now the +% rownorm normalizes the rows to have unit sum as it should johan 14042003 + +%% Check input arguments + +if isstruct(sM), + if ~isfield(sM,'topol') + error('Topology field missing.'); + end + M=size(sM.codebook,1); +else + error('Requires a map struct.'); +end + +if nargin<2 | isempty(T), + T=1; +end +if ~vis_valuetype(T,{'1x1'}) + error('Input for T must be a scalar.'); +end + +if nargin<3 | isempty(R), + R=30; +end +if ~vis_valuetype(R,{'1x1'}) + error('Input for R must be a scalar.'); +end + +if nargin < 4 | isempty(mode), + mode='lin'; +end +if ~ischar(mode), + error('String input expected for mode.'); +else + mode=lower(mode); + switch mode + case {'lin','exp'} + ; + otherwise + error('Input for mode must be ''lin'' or ''exp''.'); + end +end + +if nargin < 5 | isempty(initRGB) + initRGB='rgb2'; +end + +if ischar(initRGB), + try + dummy=som_colorcode(sM,initRGB); + catch + error(['Color code ''' initRGB ''' not known, see SOM_COLORCODE.']); + end +else + error('Invalid color code string'); +end + +if nargin<6 | isempty(S), + S=fuzzysimilarity(sM,1./T); +end + +if ~vis_valuetype(S,{[M M]}), + error('Similarity matrix must be a MunitsxMunits matrix.') +end + +x = maxnorm(som_unit_coords(sM.topol.msize,sM.topol.lattice,'sheet')); + +x = x-repmat(mean(x),size(x,1),1); + +X(:,:,1)=x; +color(:,:,1)=som_colorcode(x,'rgb2',1); + +%%% Actions + +for i=1:R, + switch mode + case 'exp' + S=rownorm(S*S); + tmpX=S*X(:,:,1); + case 'lin' + tmpX=S*X(:,:,i); + end + X(:,:,i+1)=tmpX; + color(:,:,i+1)=som_colorcode(X(:,:,i+1),initRGB); +end + +color(isnan(color))=0; + +function r=fuzzysimilarity(sM,p) + % Calculate a "fuzzy response" similarity matrix + % sM: map + % p: sharpness factor + d=som_eucdist2(sM,sM); + v=std(sqrt(d(:))).^2; + r=rownorm(exp(-p^2*(d./v))); + r(~isfinite(r))=0; + return; + + +function X = rownorm(X) + + r = sum(X,2); + X = X ./ r(:,ones(size(X,2),1)); + return; + + +function X = maxnorm(X) + + for i=1:size(X,2), r = (max(X(:,i))-min(X(:,i))); if r, X(:,i) = X(:,i) / r; end, end + return;