Registriert seit: 27. Aug 2004
60 Beiträge
Delphi 7 Enterprise
|
Itereation optimieren
7. Sep 2007, 19:39
Liebe Community,
ich bastle zur Zeit an einem Programm, mit dem man eine mulivariate Regression für Dosis-Wirkungs-Kurven durchführen kann, also für logistische, sigmoidale Funktionen. Das mache ich mit der Methode der kleinsten Quadrate, was auch hervorragend funkioniert. Allerdings habe ich ein Geschwindigkeitsproblem: Bei vier unabhängigen Parametern, die die zu approximierende Funktion beschreiben, ergeben sich nach meiner iterativen Methode vier geschachtelte While-Schleifen... Die Berechnung dauert fast eine Minute.
Jetzt kommt meine Frage an Euch: wie kann ich das Ganze soweit optmieren, dass das Ganze nicht so lange dauert?
Hier mein Code:
Delphi-Quellcode:
//####### Berechnen der Best-Fit-Values für den in "Datensatz" gegebenen Dataset ######
procedure TMainform.Regression;
Var
x: Integer;
i, j, k, l,
nr_fifty, nr_eighty,
xmin, xmax, ymin, ymax,
a, b, c, d, start: Double;
F: TRealData;
G: TRealArray;
msg: String;
begin
//Parameter xmin, xmax, log(EC50) und hillslope mit den kleinsten Fehlerquadraten ermitteln
start := 9999999999;
i := ymin + 10;
while i > ymin - 10 do
begin
j := ymax - 10;
while j < (ymax + 10) do
begin
k := xmin;
while k < xmax do
begin
l := -6;
while l < -2 do
begin
if (getR(i, j, k, l)) < start then
begin
start := (getR(i, j, k, l));
a := i;
b := j;
c := k;
d := l;
end;
l := l + 0.1;
end;
k := k + 0.1;
end;
j := j + 0.1;
end;
i := i - 0.1;
end;
[...]
end;
//###### Summe der Fehlerquadrate ermitteln ######
function TMainform.getR(ymin, ymax, ec, hillslope: double): Double;
Var
i: Integer;
R: Double;
begin
R := 0;
for i := 0 to Datensatz.RowCount - 1 do
begin
R := R + Power(Datensatz.Cell[1,i].AsFloat-func(Datensatz.Cell[0,i].AsFloat, ymin, ymax, ec, hillslope), 2);
end;
result := R;
end;
//###### Gibt den Funktionswert von X mit den gegebenen Parametern zurück ######
function TMainform.func(x, ymin, ymax, ec, hillslope: double): Double;
begin
result := ymin + (ymax-ymin)/(1+Power(10,( ec-x)*hillslope));
end;
Markus Brinkmann
|