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

Optimierung mit Diskreter und Kontinuierlicher Variablen

 

MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2012, 21:36     Titel: Optimierung mit Diskreter und Kontinuierlicher Variablen
  Antworten mit Zitat      
Hallo,

ich steh auf dem Schlauch. Ich würde gern folgende Funktion berechnen:
Code:
function nll = erlang_pdf(data,param,~,~)
% The distribution is a continuous distribution,
% which has a positive value for all real numbers greater than zero,
% and is given by two parameters: the shape k,
% which is a non-negative integer, and the rate lambda,
% which is a non-negative real number. The distribution is sometimes defined
% using the inverse of the rate parameter, the scale mu.
% It is the distribution of the sum of k independent exponential variables with mean mu.

% When the shape parameter k equals 1,
% the distribution simplifies to the exponential distribution.
% The Erlang distribution is a special case of the Gamma distribution where the shape parameter k is an integer.
% In the Gamma distribution, this parameter is not restricted to the integers.

% param(1) = k
% param(2) = lambda
pdf = param(2)^param(1)*data.^(param(1)-1).*exp(-param(2)*data)./factorial(param(1)-1);
nll = -sum(log(pdf));
end %fun


Mein Problem ist, dass ich nicht weiss, wie ich die Bedingung umsetze, dass der Parameter k diskret bleibt?

Mein aktueller Ansatz:
Code:
nDyes = 3;
lifetime = 5;
dt = 0.032;

sampleSize = 5000;
data = zeros(sampleSize,1);

for sample = 1:sampleSize
    fluoresce = ones(nDyes,1);
    tau = 0;
    while any(fluoresce)
        u = rand(nDyes,1);
        fluoresce = fluoresce .* double(u <= exp(-dt/lifetime));
        tau = tau + 1;
    end
    data(sample) = tau*dt;
end

options = ...
    optimset('Display', 'notify-detailed', ...
    'Algorithm', 'interior-point', ...
    'Diagnostics', 'off');

[x,fval,exitflag,output,grad,hessian] = ...
    fmincon(@(param)erlang_pdf(data,param,[],[]),...
    [1 1],[],[],[],[],[2 1],[inf inf],[],options);


als Ergebnis, hätte ich gern, dass k == nDyes und lambda == lifetime.

Ich hab im Netz gesucht und folgendes Beispiel gefunden: http://www.mathworks.de/support/solutions/en/data/1-10PDHC/
Kenn mich mit den genetischen Optimieren aber überhaupt nicht aus. Wäre echt nett, wenn mir jmd. helfen würde...

Gruß
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.04.2012, 21:55     Titel:
  Antworten mit Zitat      
Hallo,

welchen Wertebereich soll k abdecken? Gibt es ein bestimmtes Verhalten in Abhängigkeit von k, d.h. ist z.B. bekannt, dass es nur ein lokales Minimum gibt?

Wenn du eine aktuelle MATLAB-Version hast, kannst du GA verwenden und die Option IntCon entsprechend setzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2012, 16:18     Titel:
  Antworten mit Zitat      
Hallo Harald,

k sollte sich physikalisch im Bereich 1-12 befinden. Deine zweite Frage versteh ich nicht genau, meinst du das auf die Likelihood-Funktion bezogen?

Ja, IntCon, wäre genau was ich suche, leider habe ich aktuell nur 2011a zur Hand. Fällt dir noch eine Möglichkeit ein? kann ich z.B. eine konstante Schrittweite für die Optimierung von k wählen z.B. 1? oder einen round-Befehl einsetzen?

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.04.2012, 16:42     Titel:
  Antworten mit Zitat      
Hallo,

in der Doku deiner Funktion steht ja, dass k nur ganzzahlig sein kann. Das einfachste wäre also eine for-Schleife über k=1:12 (oder welchen Wert auch immer), und dann nur den anderen Parameter zu optimieren. Und dann das beste Ergebnis zu verwenden.

Du kannst natürlich kontinuierlich optimieren und dann round verwenden; da musst du dich aber auf die Gutartigkeit der zu optimierenden Funktion verlassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.04.2012, 17:26     Titel:
  Antworten mit Zitat      
Ah! Das ist doch die Lösung, dank dir vielmals! Manchmal sieht man die offentsichliche Lösung einfach nicht...

LG
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.