forked from ilarinieminen/SOM-Toolbox
-
Notifications
You must be signed in to change notification settings - Fork 0
/
som_fuzzycolor.m
204 lines (179 loc) · 6.15 KB
/
som_fuzzycolor.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
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;