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

Verwendung von fminunc/fmincon in Algorithmus

 

Sehiro
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 14.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2016, 15:36     Titel: Verwendung von fminunc/fmincon in Algorithmus
  Antworten mit Zitat      
Hallo,
ich habe derzeit Probleme, einen coordinate-descent artigen Algorithmus in Matlab zu implementieren.
Ich habe eine Funktion f gegeben, deren Gradient ich analytisch berechnen kann. In jeder Iteration meines Verfahrens möchte ich nun f(x^k+t*e_i) nach t minimieren, und dazu fminunc verwenden.

Meine Funktion f liefert sowohl den Funktionswert als auch den Gradient an der Stelle x:

Code:

function [ fx,dfx ] = f( x )
%berechnungen...
end
 


Dann möchte ich, dass mein Algorithmus etwa so aussieht.

Code:

for k=1:maxit

for i=1:n
fi=@(t)(f(x+t*(1:n==i)'));
[t(i),fval(i)]=fminunc(fi,0,options);
end
%update von x usw.
end
 


Dies funktioniert jedoch nicht, da der zweite Output von fi der Gradient der Funktion an der Stelle x ist, für die eindimensionale Optimierung bräuchte ich jedoch nur die Ableitung nach t (was gerade der i-te Eintrag des Gradienten ist). Gibt es also eine einfache Möglichkeit, wie ich aus dem function handle fi ein function handle bauen kann, welches als ersten Output f(x+te_i) liefert (genau wie fi), als zweiten Output jedoch nur den i-ten Eintrag des Gradienten?
Ich hoffe es ist verständlich was ich machen möchte.
(vielleicht nochmal ohne das ganze außenrum nur der Kern das Problems. Ich habe eine Funktion f
Code:

function [ fx,dfx ] = f( x )
%berechnungen...
end
 

und möchte ein function handle bauen, dass als Input t erhält und als ersten output f(x+te_i) und als zweiten Output df_i(x+te_i) zurückgibt. )

Eine mögliche Lösung, welche mir aber nicht besonders gut gefällt, wäre, der Funktion als dritten, optionalen, Inputparameter i zu übergeben. Falls dieser Parameter übergeben wird, würde die Funktion dann nur den i-ten Eintrag des Gradienten als zweiten Output zurückgeben. Zum einen würde ich aber gerne an der Funktion f nichts ändern müssen, zum anderen würde ich gerne allgemein verstehen wie man dieses Problem löst, und mir nicht nur einen Workaround für das spezielle Problem überlegen.

Für einen anderen Algorithmus habe ich das selbe Problem mit fmincon, aber wenn ich obiges Problem gelöst habe sollte das dann genauso gehen.

Danke schonmal für jede Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


Friidayy
Forum-Century

Forum-Century


Beiträge: 225
Anmeldedatum: 17.12.13
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 06.03.2016, 16:09     Titel:
  Antworten mit Zitat      
Scheint so, als wolltest du eine Schrittweitensteuerung implementieren, richitg?
f(x^k+t*e_i), xk wäre in dem Fall deine aktuelle Iterierte, t die Schrittweite und e_i deine aktuelle Suchrichtung? Du möchtest also letztendlich entlang der Suchrichtung dein t so wählen, dass der Funktionswert minimal ist.

Würde es dein Problem lösen, wenn du einfach zwei Functions schreibst. Eine zur Funktionsauswertung und eine zur berechnung des Gradienten?

P.S. Warum möchtest du umbedingt die "optimale" Schrittweite bestimmen? Die benötigte Rechenzeit wird dadurch extrem nach oben gehen. Normalerweise implementiert man Schrittweitensteuerungen so wie hier https://www.google.de/url?sa=t&.....6274245,d.bGQ&cad=rja


Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Sehiro
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 14.02.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2016, 16:21     Titel:
  Antworten mit Zitat      
Danke für die Antwort.
Zur Schrittweite: Es geht um ein Verfahren für sparsity constraint optimization, und mit den herkömmlichen Schrittweitenstrategien kann man da leider keine Konvergenz des Verfahrens garantieren (die Funktion f ist hier i.A. auch nicht konvex oder so). Daher die Minimierung.

Wenn ich zwei Funktionen schreibe, stehe ich doch vor einem ähnlichen Problem.
dann hätte ich zwei Funktionen f und df.

Code:

fi=@(t)(f(x+t*(1:n==i)'));
dfi=@(t)(df(x+t*(1:n==i)'));
fminunc(@(t)deal(fi(t),dfi(t)),0,options)
 

tut ja auch nicht das gewünschte, da ich dann wieder nicht auf den einzelnen Eintrag des Gradienten zugreifen kann. ich bräuchte sowas wie dfi(i)(t), was natürlich nicht der richtige Syntax ist.
Vielleicht fehlt mir auch nur ein stückchen syntax dass das alles möglich macht, aber ich sehe noch nicht wie das mein Problem löst.

Edit: Okay, in dem Fall kann man das ja tatsächlich einfach umgehen indem man
Code:

dfi=@(t)(df(x+t*(1:n==i)'))'*(1:n==i)';

verwendet.
Irgendwie kommt mir das trotzdem sehr unschön vor. Wenn also jemand noch einen Vorschlag hat wie ich das ganze schöner machen kann, wäre ich dankbar Smile
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 - 2025 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.