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; |
Facebook
Twitter
Digg
Technorati
LinkedIn
Kommentieren