Mit Hilfe der Lernende Vektorquantisierung, hier speziell des RLVQ, können Charakteristika aus Daten gewonnen werden. Die so genannten Prototypen sind Vektoren, die eine Art Mittelwert der Daten einer Gruppierung / Label bilden.

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
function [Neurons] = rlvq( Data, Labels, NeuronLabels, T, eta )
     % RLVQ
     %
     % Data ... (m x dim)- Matrix der m Datenpunkte als dim-dimensionale Zeilenvektoren
     % Labels ... (m x 1) - Matrix der Label 1,2,...,k der m Datenpunkte
     % NeuronLabels ... (n x 1) - Matrix der Neuronenlabel aus 1,...,k
     % N ... Anzahl Neuronen
     % T ... Trainingsepochen
     % eta ... Lernrate
     %
     % Return:
     % Neurons ... (n x dim) - Matrix der n Neuronen
     %

     if size(NeuronLabels,1) < size(NeuronLabels,2)
          NeuronLabels = NeuronLabels';
     end
     [m,dim] = size(Data);

     % Initialisieren
     w = rand( size(NeuronLabels,1) , dim );
     ONES = ones( size(NeuronLabels,1), 1 );

     %Lambda wird um eine Zehnerpotenz kleiner gewaehlt
     %damit w schneller adaptiert als Lambda (wird dies
     %nicht gemacht, "stuerzt" die Erkennungsrate ab ;-)
     lambda_eta = eta / 10;

     %Lambda Matrix (für jedes X^i gibt es ein Lambda_L)
     %Matrix erzeugen und zeilenweise normalisieren
     lambda = ones(size(NeuronLabels,1), dim);
     for n = 1:size(NeuronLabels,1)
          lambda(n,:) = lambda(n,:) / norm(lambda(n,:));
     end;

     for t=1:T
          % Wähle ein Muster (x,y)
          for i = 1:m
               x = Data(i,:);
               y = Labels(i,1);

               %bestimme Gewinner. d ist Vektor mit Abstaenden von x zu jeden
               %Vektor aus w
               %Abstände anhand der Lambda-Matrix bestimmen (für alle Vektoren
               %bestimmen) und minimalen ermitteln => Gewinner zu Adaption
               d = sqrt(sum( (lambda.^2) .* (w - ONES*x).^2, 2));
               [foo,j]=min(d);

               %der Gewinner wird optimiert (Vorberechnung x-w)
               %Gewinner und dazu gehörendes Lambda adaptieren
               xmw = (x-w(j,:));
               if y == NeuronLabels(j,1)
                    w(j,:)      = w(j,:) + eta*                            xmw;
                    lambda(j,:) = lambda(j,:) - lambda_eta* lambda(j,:) .* xmw.^2;
               else
                    w(j,:)      = w(j,:) - eta*                            xmw;
                    lambda(j,:) = lambda(j,:) + lambda_eta* lambda(j,:) .* xmw.^2;
               end
               
               %nur das neue adaptierte Lambda muss normalisiert werden
               lambda(j,:) = lambda(j,:) / norm( lambda(j,:) );
          end
     end
     Neurons = w;
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay
  • Technorati
  • Yigg
  • LinkedIn
  • Suggest to Techmeme via Twitter
  • Blogosphere News
  • MSN Reporter
  • MySpace