Mercurial > hg > camir-aes2014
comparison toolboxes/MIRtoolbox1.3.2/somtoolbox/lvq1.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 codebook=lvq1(codebook, data, rlen, alpha); | |
2 | |
3 %LVQ1 Trains a codebook with the LVQ1 -algorithm. | |
4 % | |
5 % sM = lvq1(sM, D, rlen, alpha) | |
6 % | |
7 % sM = lvq1(sM,sD,30*length(sM.codebook),0.08); | |
8 % | |
9 % Input and output arguments: | |
10 % sM (struct) map struct, the class information must be | |
11 % present on the first column of .labels field | |
12 % D (struct) data struct, the class information must | |
13 % be present on the first column of .labels field | |
14 % rlen (scalar) running length | |
15 % alpha (scalar) learning parameter | |
16 % | |
17 % sM (struct) map struct, the trained codebook | |
18 % | |
19 % NOTE: does not take mask into account. | |
20 % | |
21 % For more help, try 'type lvq1', or check out online documentation. | |
22 % See also LVQ3, SOM_SUPERVISED, SOM_SEQTRAIN. | |
23 | |
24 %%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
25 % | |
26 % lvq1 | |
27 % | |
28 % PURPOSE | |
29 % | |
30 % Trains codebook with the LVQ1 -algorithm (described below). | |
31 % | |
32 % SYNTAX | |
33 % | |
34 % sM = lvq1(sM, D, rlen, alpha) | |
35 % | |
36 % DESCRIPTION | |
37 % | |
38 % Trains codebook with the LVQ1 -algorithm. Codebook contains a number | |
39 % of vectors (mi, i=1,2,...,n) and so does data (vectors xj, | |
40 % j=1,2,...,k). Both vector sets are classified: vectors may have a | |
41 % class (classes are set to the first column of data or map -structs' | |
42 % .labels -field). For each xj there is defined the nearest codebook | |
43 % -vector index c by searching the minimum of the euclidean distances | |
44 % between the current xj and codebook -vectors: | |
45 % | |
46 % c = min{ ||xj - mi|| }, i=[1,..,n], for fixed xj | |
47 % i | |
48 % If xj and mc belong to the same class, mc is updated as follows: | |
49 % mc(t+1) = mc(t) + alpha * (xj(t) - mc(t)) | |
50 % If xj and mc belong to different classes, mc is updated as follows: | |
51 % mc(t+1) = mc(t) - alpha * (xj(t) - mc(t)) | |
52 % Otherwise updating is not performed. | |
53 % | |
54 % Argument 'rlen' tells how many times training sequence is performed. | |
55 % LVQ1 -algorithm may be stopped after a number of steps, that is | |
56 % 30-50 times the number of codebook vectors. | |
57 % | |
58 % Argument 'alpha' is the learning rate, recommended to be smaller | |
59 % than 0.1. | |
60 % | |
61 % NOTE: does not take mask into account. | |
62 % | |
63 % REFERENCES | |
64 % | |
65 % Kohonen, T., "Self-Organizing Map", 2nd ed., Springer-Verlag, | |
66 % Berlin, 1995, pp. 176-179. | |
67 % | |
68 % See also LVQ_PAK from http://www.cis.hut.fi/research/som_lvq_pak.shtml | |
69 % | |
70 % REQUIRED INPUT ARGUMENTS | |
71 % | |
72 % sM The data to be trained. | |
73 % (struct) A map struct. | |
74 % | |
75 % D The data to use in training. | |
76 % (struct) A data struct. | |
77 % | |
78 % rlen (integer) Running length of LVQ1 -algorithm. | |
79 % | |
80 % alpha (float) Learning rate used in training. | |
81 % | |
82 % OUTPUT ARGUMENTS | |
83 % | |
84 % codebook Trained data. | |
85 % (struct) A map struct. | |
86 % | |
87 % EXAMPLE | |
88 % | |
89 % lab = unique(sD.labels(:,1)); % different classes | |
90 % mu = length(lab)*5; % 5 prototypes for each | |
91 % sM = som_randinit(sD,'msize',[mu 1]); % initial prototypes | |
92 % sM.labels = [lab;lab;lab;lab;lab]; % their classes | |
93 % sM = lvq1(sM,sD,50*mu,0.05); % use LVQ1 to adjust | |
94 % % the prototypes | |
95 % sM = lvq3(sM,sD,50*mu,0.05,0.2,0.3); % then use LVQ3 | |
96 % | |
97 % SEE ALSO | |
98 % | |
99 % lvq3 Use LVQ3 algorithm for training. | |
100 % som_supervised Train SOM using supervised training. | |
101 % som_seqtrain Train SOM with sequential algorithm. | |
102 | |
103 % Contributed to SOM Toolbox vs2, February 2nd, 2000 by Juha Parhankangas | |
104 % Copyright (c) Juha Parhankangas | |
105 % http://www.cis.hut.fi/projects/somtoolbox/ | |
106 | |
107 % Juha Parhankangas 310100 juuso 020200 | |
108 | |
109 cod = codebook.codebook; | |
110 c_class = class2num(codebook.labels(:,1)); | |
111 | |
112 dat = data.data; | |
113 d_class = class2num(data.labels(:,1)); | |
114 | |
115 x=size(dat,1); | |
116 y=size(cod,2); | |
117 | |
118 ONES=ones(size(cod,1),1); | |
119 | |
120 for t=1:rlen | |
121 | |
122 fprintf(1,'\rTraining round: %d',t); | |
123 tmp=NaN*ones(x,y); | |
124 | |
125 for j=1:x | |
126 no_NaN=find(~isnan(dat(j,:))); | |
127 di = sqrt(sum([cod(:,no_NaN) - ONES*dat(j,no_NaN)].^2,2)); | |
128 | |
129 [foo,ind] = min(di); | |
130 | |
131 if d_class(j) & d_class(j) == c_class(ind) % 0 is for unclassified vectors | |
132 tmp(ind,:) = cod(ind,:) + alpha * (dat(j,:) - cod(ind,:)); | |
133 elseif d_class(j) | |
134 tmp(ind,:) = cod(ind,:) - alpha*(dat(j,:) - cod(ind,:)); | |
135 end | |
136 end | |
137 | |
138 inds = find(~isnan(sum(tmp,2))); | |
139 cod(inds,:) = tmp(inds,:); | |
140 end | |
141 | |
142 codebook.codebook = cod; | |
143 | |
144 sTrain = som_set('som_train','algorithm','lvq1',... | |
145 'data_name',data.name,... | |
146 'neigh','',... | |
147 'mask',ones(y,1),... | |
148 'radius_ini',NaN,... | |
149 'radius_fin',NaN,... | |
150 'alpha_ini',alpha,... | |
151 'alpha_type','constant',... | |
152 'trainlen',rlen,... | |
153 'time',datestr(now,0)); | |
154 codebook.trainhist(end+1) = sTrain; | |
155 | |
156 return; | |
157 | |
158 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
159 | |
160 function nos = class2num(class) | |
161 | |
162 names = {}; | |
163 nos = zeros(length(class),1); | |
164 | |
165 for i=1:length(class) | |
166 if ~isempty(class{i}) & ~any(strcmp(class{i},names)) | |
167 names=cat(1,names,class(i)); | |
168 end | |
169 end | |
170 | |
171 tmp_nos = (1:length(names))'; | |
172 | |
173 for i=1:length(class) | |
174 if ~isempty(class{i}) | |
175 nos(i,1) = find(strcmp(class{i},names)); | |
176 end | |
177 end | |
178 | |
179 | |
180 |