Mercurial > hg > camir-aes2014
comparison toolboxes/MIRtoolbox1.3.2/somtoolbox/som_trajectory.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e9a9cd732c1e |
---|---|
1 function som_trajectory(bmus,varargin) | |
2 | |
3 %SOM_TRAJECTORY Launch a "comet" trajectory visualization GUI. | |
4 % | |
5 % som_show(sM,'umat','all') | |
6 % bmus = som_bmus(sM,sD); | |
7 % som_trajectory(bmus) | |
8 % som_trajectory(bmus, 'data1', sD, 'trajsize', [12 6 3 1]') | |
9 % som_trajectory(bmus, 'data1', sD.data(:,[1 2 3]), 'name1', {'fii' 'faa' 'foo'}) | |
10 % | |
11 % Input arguments ([]'s are optional): | |
12 % bmus (matrix) size Nx1, vector of BMUS | |
13 % ['argID', (string) Other arguments can be given as 'argID', value | |
14 % value] (varies) pairs. See list below for valid values. | |
15 % | |
16 % NOTE: the GUI only works on a figure which has been made with SOM_SHOW. | |
17 % | |
18 % Here are the valid argument IDs (case insensitive) and associated values: | |
19 % 'color' string 'xor' or ColorSpec, default: 'xor'. | |
20 % (default: according to lattice as in som_cplane) | |
21 % 'TrajSize' vector of size Nx1 to define the length of comet | |
22 % (N) and size of the comet dots in points. | |
23 % default: [16 12 10 8 6 4]' | |
24 % 'Data1' SOM Toolbox data struct or matrix. The size of | |
25 % data matrix (in data struct the field .data) is | |
26 % Nxd, where N must be the same as the amount of | |
27 % BMUS given in the first input argument 'bmus' | |
28 % This data is shown in a new window in d subplots. | |
29 % Default: BMU indices (first input argument) | |
30 % 'Name1' cell array of d strings which contains names | |
31 % for the components in 'Data1'. If 'Data1' is a SOM | |
32 % Toolbox data struct, the existing component names | |
33 % are overdone. | |
34 % 'Figure' scalar that must be a handle to an existing figure | |
35 % which has been made using SOM_SHOW function. | |
36 % Default: current active figure (gcf). | |
37 % | |
38 % The following tools can be found in the 'Tools' -menu. | |
39 % | |
40 % Remove Trajectory: removes trajectory from the map. | |
41 % Dye Nodes : opens GUI for selecting color for the nodes | |
42 % and points selected. | |
43 % Clear Markers : removes markers from map and data figure. | |
44 % Save : saves the current situation as a struct. | |
45 % Load : loads the struct from workspace and draws markers. | |
46 % | |
47 % Mouse operation | |
48 % | |
49 % In data window: Left button is used to drag the operation point ruler | |
50 % if left button is on blank area, it starts | |
51 % In map window : Left button starts a polygon; right button | |
52 % finishes; middle button toggles a unit. | |
53 % | |
54 % SOM_TRAJECTORY is an application for observing trajectory behavior. | |
55 % | |
56 % Using mouse the line in data figure can be dragged and the | |
57 % trajectory moves in the SOM SHOW figure. It is also possible to move | |
58 % trajectory by pressing keys '>' and '<' when mouse pointer is above | |
59 % data figure. | |
60 % | |
61 % Regions can be chosen from the data and the points in that region | |
62 % are mapped to the component planes. Regions can be chosen also in | |
63 % the map. In this situation data points and map nodes are also | |
64 % marked (Left mouse button adds point to the polygon indicating the | |
65 % region and right button finals the polygon). By clicking a node (the | |
66 % middle button) that node is either added or removed from selection. | |
67 % | |
68 % It should be noticed that choosing intervals from data may cause | |
69 % situations that seem to be bugs. If there exisist marks of different | |
70 % color, removing them by clicking the map may left some marks in the | |
71 % data, because more than one point in the data is mapped to the same | |
72 % node in the map and the removing operation depends on the color of | |
73 % the marks. However, all the marks can be removed by using the 'Clear | |
74 % Markers' -operation. | |
75 % | |
76 % FEATURES | |
77 % | |
78 % The first input argument 'bmus' may also be a munits x N matrix | |
79 % In this case each column defines a "fuzzy response". That is, | |
80 % each column defines a hit histogram function). The element | |
81 % bmus(i,t) sets the size of marker on unit i at time t. | |
82 % NOTE: - in this case no regions can be selcted on the map! | |
83 % - only > and < keys can be used to move the operation point | |
84 % line: it can't be dragged | |
85 % - "fuzzy response is always black (hope this will be fixed) | |
86 % | |
87 % It is possible to open a second data window showing different data: | |
88 % use indetifiers 'Data2' (and 'Name2'). The argument syntax is | |
89 % identical to 'Data1' (and 'Name1'). | |
90 % | |
91 % See also SOM_SHOW, SOM_SHOW_ADD, SOM_BMUS. | |
92 | |
93 % Contributed to SOM Toolbox 2.0, February 11th, 2000 by Johan | |
94 % Himberg and Juha Parhankangas | |
95 % Copyright (c) 2000 by the Johan Himberg and Juha Parhankangas | |
96 % http://www.cis.hut.fi/projects/somtoolbox/ | |
97 | |
98 % Check arguments | |
99 | |
100 error(nargchk(1,Inf,nargin)); % Check no. of input arguments | |
101 | |
102 %% Init input argument struct (see subfunction) | |
103 Traj=iniTraj(bmus); | |
104 | |
105 % Check tentative BMU input validity | |
106 | |
107 if ~vis_valuetype(bmus,{'nxm'}), | |
108 error(['First input should be a vector of BMU indices or' ... | |
109 ' a "response matrix"']); | |
110 end | |
111 | |
112 %% Check optional arguments | |
113 for i=1:2:length(varargin) | |
114 identifier=lower(varargin{i}); | |
115 value=varargin{i+1}; | |
116 | |
117 % Trajectory color | |
118 switch identifier | |
119 case 'color' | |
120 if isempty(value) | |
121 value='xor'; | |
122 end | |
123 if vis_valuetype(value,{'colorstyle','xor'}) | |
124 Traj.color=value; | |
125 else | |
126 error('''Color'' has to be ColorSpec or string ''xor''.'); | |
127 end | |
128 | |
129 % 1st data | |
130 case 'data1' | |
131 if isempty(value), | |
132 value=[]; | |
133 elseif vis_valuetype(value,{'nxm'}) | |
134 Traj.primary_data=value; | |
135 elseif isstruct(value) & isfield(value,'type') & ... | |
136 ischar(value.type) & strcmp(value.type,'som_data'), | |
137 Traj.primary_data=value.data; | |
138 if isempty(Traj.primary_names), | |
139 Traj.primary_names=value.comp_names; | |
140 end | |
141 end | |
142 | |
143 % 2nd data | |
144 case 'data2' | |
145 if isempty(value), | |
146 value=[]; | |
147 elseif vis_valuetype(value,{'nxm'}) | |
148 Traj.secondary_data=value; | |
149 elseif isstruct(value) & isfield(value,'type') & ... | |
150 ischar(value.type) & strcmp(value.type,'som_data'), | |
151 Traj.secondary_data=value.data; | |
152 if isempty(Traj.secondary_names), | |
153 Traj.secondary_names=value.comp_names; | |
154 end | |
155 end | |
156 | |
157 % Trajectory length & size | |
158 case 'trajsize' | |
159 if isempty(value), | |
160 Traj.size=[16 12 10 8 6 4]'; | |
161 end | |
162 if vis_valuetype(value,{'nx1'}) | |
163 Traj.size=value | |
164 else | |
165 error('''TrajSize'' has to be a nx1 vector.'); | |
166 end | |
167 | |
168 % Names for first data variables | |
169 case 'name1' | |
170 if isempty(value), | |
171 Traj.primary_names=[]; | |
172 elseif ~vis_valuetype(value,{'cellcolumn_of_char'}), | |
173 error('''Name1'': variable names must be in a cell column array.') | |
174 else | |
175 Traj.primary_names = value; | |
176 end | |
177 % Names for 2nd data variables | |
178 case 'name2' | |
179 if isempty(value), | |
180 Traj.secondary_names=[]; | |
181 elseif ~vis_valuetype(value,{'cellcolumn_of_char'}), | |
182 error('''Name2'': variable names must be in a cell column array.') | |
183 else | |
184 Traj.secondary_names = value; | |
185 end | |
186 | |
187 % Figure number | |
188 case 'figure' | |
189 if isempty(value) | |
190 Traj.figure='gcf'; | |
191 end | |
192 if vis_valuetype(value,{'1x1'}) | |
193 Traj.figure=value; | |
194 else | |
195 error('''Figure'' should be number of an existing figure.') | |
196 end | |
197 end | |
198 end | |
199 | |
200 %% Get SOM data from figure | |
201 [h,msg,lattice,msize,dim]=vis_som_show_data('all',Traj.figure); | |
202 | |
203 %% Not a SOM_SHOW figure? | |
204 if ~isempty(msg); | |
205 error('Figure is invalid: use SOM_SHOW to draw the figure.'); | |
206 end | |
207 | |
208 % Get map size from figure data | |
209 Traj.lattice=lattice; | |
210 Traj.msize=msize; | |
211 if length(msize)>2, | |
212 error(['This function works only with 2D maps: figure contains' ... | |
213 ' something else.']); | |
214 end | |
215 munits=prod(msize); | |
216 | |
217 % Check BMU (or response) and map match | |
218 | |
219 if vis_valuetype(bmus,{'nx1'}); | |
220 if max(bmus)>prod(msize) | min(bmus) <1 | |
221 error('BMU indexes out of range.') | |
222 elseif any(round(bmus)~=bmus) | |
223 error('BMU indexes must be integer.'); | |
224 elseif isempty(Traj.primary_data), | |
225 Traj.primary_data=bmus; | |
226 end | |
227 elseif size(bmus,1) ~= munits | |
228 error(['Response matrix column number must match with the number of' ... | |
229 ' map units.']); | |
230 else | |
231 bmus=bmus'; | |
232 if isempty(Traj.primary_data), | |
233 Traj.primary_data=[1:size(bmus,1)]'; | |
234 Traj.primary_names={'BMU Index'}; | |
235 end | |
236 end | |
237 | |
238 size1=size(Traj.primary_data); | |
239 size2=size(Traj.secondary_data); | |
240 | |
241 % Data2 must not be defined alone | |
242 | |
243 if isempty(Traj.primary_data)&~isempty(Traj.secondary_data), | |
244 error('If ''Data2'' is specified ''Data1'' must be specified, too.'); | |
245 elseif ~isempty(Traj.secondary_data) ... | |
246 & size1~= size2 | |
247 % If data1 and data2 exist both, check data1 and data2 match | |
248 error('''Data1'' and ''Data2'' have different amount of data vectors.') | |
249 end | |
250 | |
251 % Check BMU and data1 match (data2 matches with 1 anyway) | |
252 | |
253 if ~isempty(Traj.primary_data) & size(bmus,1) ~= size1, | |
254 error(['The number of data vectors in ''data1'' must match with' ... | |
255 ' the number of rows in the first input argument (bmus).']); | |
256 end | |
257 | |
258 % Check that number of names and data dimension is consistent | |
259 | |
260 if ~isempty(Traj.primary_names) & (size1(2)~=length(Traj.primary_names)), | |
261 error('Number of component names and ''Data1'' dimension mismatch.'); | |
262 end | |
263 if ~isempty(Traj.secondary_names) & ... | |
264 (size2(2)~=length(Traj.secondary_names)), | |
265 error('Number of component names and ''Data2'' dimension mismatch.'); | |
266 end | |
267 | |
268 %% Call the function that does the job | |
269 vis_trajgui(Traj); | |
270 | |
271 %%% Subfunctions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
272 | |
273 function Traj=iniTraj(bmus) | |
274 | |
275 Traj.figure=gcf; | |
276 Traj.primary_data=[]; | |
277 Traj.secondary_data=[]; | |
278 Traj.primary_names = []; | |
279 Traj.secondary_names = []; | |
280 Traj.size=[16 12 10 8 6 4]'; | |
281 Traj.bmus=bmus; | |
282 Traj.color='xor'; | |
283 Traj.msize=[]; | |
284 Traj.lattice=[]; | |
285 |