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

Wie löse ich am besten ein lineares Optimierungsproblem?

 

clustering_n00b
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 25.11.2012, 11:13     Titel: Wie löse ich am besten ein lineares Optimierungsproblem?
  Antworten mit Zitat      
Hi zusammen! Very Happy


Ich beschäftige mich gerade mit einer einfachen Aufgabe im Bereich lineare Optimierung.

Nehmen wir an, dass sich eine Bildmatrix I aufspalten lässt in das Produkt zweier Matrizen A und B.

Nun sieht man schon, dass es mehrere mögliche Lösungen für A und B gibt, denn A' = k*A und B' = B/k ergeben das genau gleiche Bild I, wobei k eine skalare Konstante ist.

Die Problemstellung lautet folgendermassen:
Zitat:
Jetzt habe ich ein A', B', A und B gegeben und möchte A' und B' so nahe an A und B haben wie möglich.

Es ergeben sich also folgende zwei Probleme:
Finde k, so dass

<br />
1) A - A' = A - k*A minimal
<br />
2) B - B' = B - B/k = I/A - I/(k*A) minimal
<br />

Dabei soll k ungleich 1 sein (triviale Lösung)

Jetzt habe ich mal ein bisschen angefangen hier auszuprobieren.
Ich habe A' und A genommen (beide 222x267x3 Matrizen) und daraus eine Funktion definiert.
Code:
rfunc = @(k) A-k*A';


Zuerst wollte ich das Minimum grafisch überprüfen. Das hat aber einen Error verursacht:
Zitat:
fplot(rfunc, [-10, 10])
Subscripted assignment dimension mismatch.
Error in fplot (line 105)
x = xmin+minstep; y(2,Smile = feval(fun,x,args{4:end});


Dann bin ich zum eigentlichen Optimierungsproblem übergegangen, der wieder einen Error ausgegeben hat:
Zitat:
[kopt ropt] = fmincon(rfunc, 0, [], [], [], [], 1, inf)
Error using fmincon (line 704)
User supplied objective function must return a scalar value.



Jetzt habe ich die folgenden Fragen:
1) Welche Visualisierung würdet ihr hier empfehlen (fplot, ezcontour, ezsurf, etc.)?
2) Welche Minimimierungsfunktion eigenet sich hier am besten (fmincon, fminsearch, least-squares Methode, etc.) und wie kann man die Einschränkung 'k ~= 1' einbauen?


Freue mich auf Antworten! Smile




EDIT: Ich habe hier noch ein interessantes LSQ Skript gefunden, mit dem man Lösungspunkte auch grafisch anzeigen kann.
Macht es Sinn, in meiner Aufgabe ein A\b (LSQ) zu lösen?
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 25.11.2012, 13:44     Titel:
  Antworten mit Zitat      
Hallo,

so macht das gesamte Vorgehen erstmal keinen Sinn. Worin liegt überhaupt die Motivation I in ein Produkt aus A und B zu zerlegen. Warum nicht I=A+B?

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 25.11.2012, 14:13     Titel:
  Antworten mit Zitat      
Hi MaFam! Smile

Naja, das ist schon gegeben - da kann man nix machen.
Ist ja nicht wichtig, wie die Zerlegung stattfindet. Es geht einfach drum ein Gleichungssystem zu lösen.

Zuletzt bearbeitet von clustering_n00b am 25.11.2012, 14:21, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 25.11.2012, 14:18     Titel:
  Antworten mit Zitat      
Es ist entscheidend, wie die Zerlegung gestaltet werden soll! Kommt A' = k*A und B' = B/k von dir, oder ist das Teil einer Aufgabenstellung? Damit diese Bedingung überhaupt gelten kann, muss A und B bereits gegeben sein und I=A*B erfüllen. Ist das der Fall?
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 25.11.2012, 14:22     Titel:
  Antworten mit Zitat      
MaFam hat Folgendes geschrieben:
Es ist entscheidend, wie die Zerlegung gestaltet werden soll! Kommt A' = k*A und B' = B/k von dir, oder ist das Teil einer Aufgabenstellung? Damit diese Bedingung überhaupt gelten kann, muss A und B bereits gegeben sein und I=A*B erfüllen. Ist das der Fall?



Ja, natürlich ist es für die Rechnung entscheidend, aber wie das Bild I aufgebaut ist, kann ich nicht beeinflussen.


Ja, I = A*B ist erfüllt und alle 3 Grössen, sowie A' und B' sind gegeben.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 25.11.2012, 14:35     Titel:
  Antworten mit Zitat      
Gut, dann gilt es jetzt zu klären, was A-A' -> min überhaupt heißen soll. Wie definierst du den Abstand zwischen zwei Matrizen, wobei wir dann auch bei der Fehlermeldung sind: "User supplied objective function must return a scalar value."

Eine Norm würde A-A' auf einen Skalar abbilden. Das muss also zunächst geklärt werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 25.11.2012, 14:43     Titel:
  Antworten mit Zitat      
MaFam hat Folgendes geschrieben:
Gut, dann gilt es jetzt zu klären, was A-A' -> min überhaupt heißen soll. Wie definierst du den Abstand zwischen zwei Matrizen, wobei wir dann auch bei der Fehlermeldung sind: "User supplied objective function must return a scalar value."

Eine Norm würde A-A' auf einen Skalar abbilden. Das muss also zunächst geklärt werden.



Wie wäre es z.B. mit der Frobeniusnorm? Diese Variante scheint mir am naheliegendsten zu sein.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 26.11.2012, 08:45     Titel:
  Antworten mit Zitat      
Ja, diese Norm könnte man verwenden. Sodann würde ich die Zielfunktion aufstellen. Hier böte sich f(k)=norm(A-A')+norm(B-B') an. Mit der Frobeniusnorm wäre allerdings f quadratisch in k und hätte somit ein globales Minimum. Das ist nur interessant, wenn auf einem Gebiet optimiert wird. Daher würde ich die Spektralnorm oder die Maximumsnorm verwenden, wenn auf ganz IR ohne die 0 natürlich optimiert werden soll.
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 26.11.2012, 09:46     Titel:
  Antworten mit Zitat      
Hi nochmals!

Deine Antwort sein ganz interessant zu sein. Da möchte ich folgendes dazu sagen:

1) Wenn ich norm(X) in MATLAB eingebe, dann wird automatisch die Spektralnorm verwendet, oder (siehe Referenz; Ctrl + F für 'Spektralnorm')? Das scheint der Default zu sein.
Für die Frobeniunorm müsste ich n = norm(X,'fro') eingeben.

2) Ich würde eigentlich noch gerne 2 Gleichungssystem aufstellen, deren Optimalwerte k und k' berechnen, die beiden Funktionen plotten und danach grafisch vergleichen.

3) Wieso meinst du dass die Funktion quadratisch wird?

4) Die Definitionsmenge von k ist eigentlich das ganze Gebiet der reellen Zahlen IR ohne die triviale Lösung k = k' = 1.
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 26.11.2012, 10:08     Titel:
  Antworten mit Zitat      
clustering_n00b hat Folgendes geschrieben:

1) Wenn ich norm(X) in MATLAB eingebe, dann wird automatisch die Spektralnorm verwendet, oder (siehe Referenz; Ctrl + F für 'Spektralnorm')? Das scheint der Default zu sein.
Für die Frobeniunorm müsste ich n = norm(X,'fro') eingeben.


Ja, die Spektralnorm ist default (gibt's da eigentlich ein gutes deutsches Wort für?).

clustering_n00b hat Folgendes geschrieben:

2) Ich würde eigentlich noch gerne 2 Gleichungssystem aufstellen, deren Optimalwerte k und k' berechnen, die beiden Funktionen plotten und danach grafisch vergleichen.


Gut, ich hatte das so verstanden, dass k sowohl A-A', als auch B-B' minimieren soll. Das muss im Grund auch gelten, wenn später A'*B' wieder I ergeben soll. Daher verknüpfte ich beide Bedingungen.


clustering_n00b hat Folgendes geschrieben:

3) Wieso meinst du dass die Funktion quadratisch wird?


Schau' dir die Frobeniusnorm doch mal an. Es ist in der Tat nur lokal quadratisch, aber die Funktion besitzt nur ein globales Minimum. Da 1 eine Lösung ist, wird es keine weiteren Lösungen mehr geben.

clustering_n00b hat Folgendes geschrieben:

4) Die Definitionsmenge von k ist eigentlich das ganze Gebiet der reellen Zahlen IR ohne die triviale Lösung k = k' = 1.


Die Null muss auch raus, wegen 1/k. Es darf ruhig ganz IR ohne die Null verwendet werden. Auch darf die 1 entfernt werden. Dann führt Optimierung bei Verwendung der Frobeniusnorm allerdings immer betragsmäßig an den Wert, der am nächsten an der 1 liegt. Das führt dann zu zwei Lösungen auf dem Rand der Exklusion (das entfernte Intervall).
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 26.11.2012, 12:48     Titel:
  Antworten mit Zitat      
MaFam hat Folgendes geschrieben:
Gut, ich hatte das so verstanden, dass k sowohl A-A', als auch B-B' minimieren soll. Das muss im Grund auch gelten, wenn später A'*B' wieder I ergeben soll. Daher verknüpfte ich beide Bedingungen.


Das soll auch so sein. Ich wollte aber die beiden Lösungsmengen selber vergleichen.


MaFam hat Folgendes geschrieben:

Die Null muss auch raus, wegen 1/k. Es darf ruhig ganz IR ohne die Null verwendet werden. Auch darf die 1 entfernt werden. Dann führt Optimierung bei Verwendung der Frobeniusnorm allerdings immer betragsmäßig an den Wert, der am nächsten an der 1 liegt. Das führt dann zu zwei Lösungen auf dem Rand der Exklusion (das entfernte Intervall).


Achso, da bin ich gespannt auf welches Minimum ich komme und wie die entsprechen Matrizen dann aussehen.



Jetzt noch zur eigentlichen Optimierung:
Code:
func = @(k) norm(A-A')+k*norm(B-B')
[kopt fopt] = fmincon(func, 0, [], [], [], [], 1, inf)


Etwa so?
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 26.11.2012, 16:07     Titel:
  Antworten mit Zitat      
Code:

func = @(k) norm(A-A')+k*norm(B-B')
 


Ich weiß jetzt nicht, warum du k*norm(B-B') schreibst. Das k ist doch schon in B' enthalten?!

Was die Nebenbedingungen betrifft, würde ich mit (...'lb',lb,'ub',ub,...) arbeiten.
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 26.11.2012, 17:21     Titel:
  Antworten mit Zitat      
MaFam hat Folgendes geschrieben:
Code:

func = @(k) norm(A-A')+k*norm(B-B')
 


Ich weiß jetzt nicht, warum du k*norm(B-B') schreibst. Das k ist doch schon in B' enthalten?!

Was die Nebenbedingungen betrifft, würde ich mit (...'lb',lb,'ub',ub,...) arbeiten.



Nein, das k ist nicht in B' enthalten! Mit dem k wollen wir B' so nahe am B wie möglich bringen. Analog für A.

Ich habe gerade folgendes überlegt:

min 1/2 || k * A' - A ||
min 1/2 || k * B - B' ||



Also ist das neue Problem:

min 1/2 || k * (A' + B) - (A + B') ||


Dies lässt sich in MATLAB mit lsqlin folgendermassen lösen:
Code:
k = lsqlin(A'(:) + B(:), A(:) + B'(:))


Das k, das ich aber bekommen habe, erscheint mir falsch, denn wenn ich die Bilder A, A' und A'*k anschaue, dann hat das k das Bild A' eher verschlechter, als näher am A gebracht.

Gleiches gilt für B.


Wieso funktioniert hier Least-Squares nicht?
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 26.11.2012, 18:22     Titel:
  Antworten mit Zitat      
Jetzt habe ich einen neuen Versuch gestartet mit fmincon.

Code:
func = @(k) norm(A(:)-k*A'(:))+k*norm(B(:)-B'(:));
          kopt = fmincon(func, 1, [], [], [], [], -2, 2)
 



Die Bilder A'*kopt und B'/kopt scheinen nun viel näher an A und B zu sein!


Ich bekomme jedoch einen ganz Haufen an Warnungen, mit denen ich nichts zu anfangen weiss:

Ich habe nun einen neuen Versuch gestartet, und zwar mit fmincon.

Zitat:

Warning: To use the default trust-region-reflective algorithm you
must supply the gradient in the objective function and set the
GradObj option to 'on'. FMINCON will use the active-set algorithm
instead. For information on applicable algorithms, see Choosing the
Algorithm in the documentation.

> In fmincon at 516
Warning: Your current settings will run a different algorithm
(interior-point) in a future release.

> In fmincon at 521
Local minimum possible. Constraints satisfied.

fmincon stopped because the predicted change in the objective function
is less than the default value of the function tolerance and constraints
are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 28.11.2012, 10:44     Titel:
  Antworten mit Zitat      
Ich habe dieses Problem nun anders behoben, und zwar habe ich wieder neu angefangen und Old-School-style durchgemacht.

Falls es jemanden interessiert:

Zielfunktion
f(k) = min sum((B_i - 1/k B_i'^2), i)

Nun leiten wir f(k) nach k ab. Das ergibt schlussendlich:
k = sum(B_i'^2, i)/sum(B_i' * B, i)

In MATLAB sieht das folgendermassen aus:
Code:
k = sum(B_est(:).^2)/sum(B_est(:).*B(:))



Gruss,
clustering_n00b
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.