WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Twiddle Algorithmus zum optimieren von Parametern

 

Balzer82
Forum-Anfänger

Forum-Anfänger



Beiträge: 26
Anmeldedatum: 22.02.11
Wohnort: Dresden
Version: ---
     Beitrag Verfasst am: 10.07.2012, 17:13     Titel: Twiddle Algorithmus zum optimieren von Parametern
  Antworten mit Zitat      
Das Originaltutorial ist hier zu finden:

Numerische Optimierung in Matlab mit Twiddle-Algorithmus

Hier noch mal der Text:



Man stelle sich vor, es gilt einen Parameterraum (X und Y) abzusuchen, in welchem irgendwo optimale Parametervariationen versteckt sind, welche ein System (Z) maximieren oder minimieren. Ist das System nicht mehr analytisch (also mit Gleichungen) zu beschreiben, wird die in der Schule erlernte Variante, einfach die 1. und 2. Ableitung zu bilden und durch Nullstellensuche die Maxima und Minima zu finden, unmöglich. Es hilft nur noch die numerische Optimierung, auch simulationsbasierte Optimierung genannt.

Eine relativ einfach zu implementierende Suche ist der so genannte Twiddle-Algorithmus, welchen Prof. Sebastian Thrun am besten persönlich erklärt:

http://www.youtube.com/watch?v=2uQ2BSzDvXs

Dieser Algorithmus sucht nun den Parameterraum intelligent ab und variiert die Schrittweite der Suche, je nachdem ob man in der Nähe eines Maxima bzw. Minima ist.

Code:
clear all, clc, close all
%% Twiddle Algorithmus nach Sebastian Thrun
tic
 
params = [0 0];   %Startparameter X & Y
dparams = [3 3];  %Startschrittweite DeltaX & DeltaY
 
it=1;
 
%Kostenfunktion ausrechnen
cfzz(it) = calcCost(params(1),params(2));
bestcost = cfzz(it);
 
% Maximierung der Kostenfunktion!
while sum(dparams) > 0.01
    for i=1:length(params) % alle Parameter durch gehen
        params(i)=params(i)+dparams(i);
 
        %Kostenfunktion ausrechnen
        cfzz(it) = calcCost(params(1),params(2));
 
        if cfzz(it) > bestcost
            bestcost = cfzz(it);
            dparams(i)= dparams(i)*1.05;
        else
            % in andere Richtung suchen
            params(i)=params(i)- 2*dparams(i);
            cfzz(it) = calcCost(params(1),params(2));
 
            if cfzz(it) > bestcost %wenn aktuelle Kosten höher (=gut)
                bestcost = cfzz(it);
                dparams(i) = dparams(i)*1.05; %mit größerem Schritt probieren
            else
                params(i)=params(i)+dparams(i);
                dparams(i)=dparams(i)*0.95; % an sonsten kleineren Schritt
            end
        end
 
    it = it+1;
    disp(['Twiddle #' num2str(it-1) ' mit Parametern ' num2str(params,'%2.5f \t') ', Funktionswert: ' num2str(cfzz(it-1),'%2.5f \t')])
    paramsstore(it,:) = params; % für späteres Plotten in Variable ablegen
 
    end %paramseter durch gehen
 
end
 
disp(['Twiddle-Berechnungsdauer ' num2str(toc) 's'])
disp(['                X           Y '])
disp(['Maximum bei ' num2str(params,'%2.5f \t')])


Die Funktion calcCost, welche den Funktionswert Z zurück gibt, ist die in Matlab enthaltene Standardfunktion “peaks”, welche in diesem Beispiel gewählt wurde:

Code:
function [out] = calcCost(X,Y)
% Kostenfunktion, welche von Eingangsparametern
% abhängt
out = peaks(X,Y);


Natürlich ist das Ergebnis Abhängig von den gewählten Eingangsparametern. Der Algorithmus kann auch in lokalen Maxima/Minima hängen bleiben und kein globales (absolut bestes) Ergebnis bringen. Dies kann man zum Beispiel schon erreichen, wenn man den oben genannten Twiddle-Algorithmus mit dparams=[1 1] los laufen lässt. Er schafft es dann nicht mehr, vom ersten lokalen Maximum weg zu kommen. Es ist also immer Vorsicht geboten mit den Ergebnissen!
_________________

"Bremsen ist die sinnlose Umwandlung von Exergie in Anergie - daran kann man sich höchstens noch die Finger verbrennen" - Prof. J. Morgenstern
Private Nachricht senden Benutzer-Profile anzeigen


Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.