Einzelnen Beitrag anzeigen

Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Frage aus dem Bereich: Lineare Regression

  Alt 25. Jan 2014, 18:21
Delphi-Quellcode:
program Project1;

{$AppType Console}

uses
  System.Math,
  System.SysUtils;

type
  TFunction<T, TResult> = reference to function (const X: T): TResult;
  TSchätzfunktion = TFunction<Extended, Extended>;

function ErzeugeSchätzer(const X, Y: array of Extended): TSchätzfunktion;
{ http://office.microsoft.com/de-de/excel-help/Schätzer-HP005209096.aspx }
var
  MittelwertX, MittelwertY: Extended;
  Zähler, Nenner: Extended;
  Index: NativeInt;
  Wert: Extended;
  A, B: Extended;
begin
  Assert(Length(X) = Length(Y));


  MittelwertX := Mean(X);
  MittelwertY := Mean(Y);

  Zahler := 0;
  for Index := 0 to High(X) do
    Zahler := Zahler + (X[Index] - MittelwertX) * (Y[Index] - MittelwertY);

  Nenner := 0;
  for Wert in X do
    Nenner := Nenner + Sqr(Wert - MittelwertX);

  B := Zahler / Nenner;
  A := MittelwertY - B * MittelwertX;

  Result :=
    function (const X: Extended): Extended
    begin
      Result := A + B * X;
    end;
end;

procedure Run;
var
  F: TSchätzfunktion;
  I: NativeInt;
  X, Y: Extended;
begin
  F := ErzeugeSchätzer(
    [0, 2],
    [0, 1]
  );

  WriteLn('X':6, 'Y':6);
  for I := -10 to 10 do
  begin
    X := I / 2;
    Y := F(X);
    WriteLn(X:6:2, Y:6:2);
  end;
end;

begin
  try
    Run;
  except
    on E: Exception do
      WriteLn(E.ClassName + ': ' + E.Message);
  end;

  if DebugHook <> 0 then
    ReadLn;
end.
Ausgabe:
Code:
     X    Y
 -5.00 -2.50
 -4.50 -2.25
 -4.00 -2.00
 -3.50 -1.75
 -3.00 -1.50
 -2.50 -1.25
 -2.00 -1.00
 -1.50 -0.75
 -1.00 -0.50
 -0.50 -0.25
  0.00  0.00
  0.50  0.25
  1.00  0.50
  1.50  0.75
  2.00  1.00
  2.50  1.25
  3.00  1.50
  3.50  1.75
  4.00  2.00
  4.50  2.25
  5.00  2.50
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."

Geändert von Panthrax (25. Jan 2014 um 18:24 Uhr)
  Mit Zitat antworten Zitat