Lineare Regression

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Lineare Regression

Beitrag von Eclipticon »

Hi ...

Zwar keine Unit oder eine Komponente, aber eine Funktion ;-) Sollte es einen besseren Ort fuer diesen Thread geben, bitte verschieben.

Ich wollte nur kurz eine soeben fertiggestellte Funktion zur Berechnung einer linearen Regressionsgerade vorstellen ... Weiterverwendung und Verbesserungsvorschlaege sind ausdruecklich erwuenscht!


Code: Alles auswählen

// Performs a linear regression analysis on DataX/DataY
// Return value is the slope of the regression line, secondary parameters (intercept and
// regression coefficient) are returned as out parameters
// Based on:
// http://www.easycalculation.com/statisti ... ession.php
// http://www.educalc.net/2104083.page
// http://de.wikibooks.org/wiki/Mathematik ... onsanalyse
function LinearRegression(DataX, DataY: array of double;
  out Intercept, Coefficient: double): double;
var
  i:     integer;
  SumX:  double = 0.0;
  SumXX: double = 0.0;
  SumY:  double = 0.0;
  SumXY: double = 0.0;
  AverageX, AverageY: double;
  DeltaX, DeltaY: double;
  SumDeltaXDeltaX: double = 0.0;
  SumDeltaXDeltaY: double = 0.0;
  SumDeltaYDeltaY: double = 0.0;
begin
 
  // Check data arrays
  Assert(Length(DataX) = Length(DataY),
    'Data sets X and Y for regression analysis do not match in length.');
  Assert(Length(DataX) >= 2, 'Data sets for regression are too short.');
 
  for i := Low(DataX) to High(DataX) do
  begin
    SumX  := SumX + DataX[i];
    SumXX := SumXX + (DataX[i] * DataX[i]);
    SumY  := SumY + DataY[i];
    SumXY := SumXY + (DataX[i] * DataY[i]);
  end;
  AverageX := SumX / Length(DataX);
  AverageY := SumY / Length(DataY);
  for i := Low(DataX) to High(DataX) do
  begin
    DeltaX := (DataX[i] - AverageX);
    DeltaY := (DataY[i] - AverageY);
    SumDeltaXDeltaX := SumDeltaXDeltaX + (DeltaX * DeltaX);
    SumDeltaXDeltaY := SumDeltaXDeltaY + (DeltaX * DeltaY);
    SumDeltaYDeltaY := SumDeltaYDeltaY + (DeltaY * DeltaY);
  end;
 
  // Calculate linear regression slope, intercept and correlation coefficient
  Result      := (Length(DataX) * SumXY - SumX * SumY) /
    (Length(DataX) * SumXX - SumX * SumX);
  Intercept   := (SumY - Result * SumX) / Length(DataX);
  Coefficient := SumDeltaXDeltaY / sqrt(SumDeltaXDeltaX * SumDeltaYDeltaY);
 
end;


Schoenen Abend ...

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Lineare Regression

Beitrag von MAC »

tolle sache .
Nur wäre es schön zu wissen, was das jetzt genau macht :mrgreen:
Anhand des letzten links http://de.wikibooks.org/wiki/Mathematik ... onsanalyse und der bilder vermute ich mal das man ein haufen daten in eine grobe funktion packen will.

Code: Alles auswählen

Signatur := nil;

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Lineare Regression

Beitrag von Eclipticon »

MAC hat geschrieben:Anhand des letzten links http://de.wikibooks.org/wiki/Mathematik ... onsanalyse und der bilder vermute ich mal das man ein haufen daten in eine grobe funktion packen will.


Ja, so in etwa ... die Funktion berechnet eine Trendlinie durch die X/Y Datenpunkte, die durch Steigung (Result) und y-Achsenabschnitt (Intercept) charakterisiert wird, sowie einen Parameter, die die Qualitaet der Passung dieser Trendlinie beschreibt (Coefficient).

Antworten