TimeSeries.pm und Standardabweichung: Falsch?

Begonnen von andies, 12 Oktober 2020, 10:04:54

Vorheriges Thema - Nächstes Thema

andies

Ich habe eine Frage zur Berechnung der Standardabweichung in TeimSeries.pm. Ich vermute, dass die Berechnung dort falsch ist. Der (sehr gut dokumentierte) Text lautet ab Zeile 243
# see Donald Knuth, The Art of Computer Programming, ch. 4.2.2, formulas 14ff.
  my $n= ++$self->{n};
  if($n> 1) {
    my $M= $self->{_M};
    $self->{_M}= $M + ($V - $M) / $n;
    $self->{_S}= $self->{_S} + ($V - $M) * ($V - $M);
    $self->{integral}+= $V;
    #main::Debug("V= $V M= $M _M= ".$self->{_M}." _S= " .$self->{_S}." int= ".$self->{integral});
  } else {
    $self->{_M}= $V;
    $self->{_S}= 0;
    $self->{integral}= $V;
  }

Donald Knuths Rechnung ist aber mE eine andere, siehe zum Beispiel https://gist.github.com/musically-ut/1502045/106af3cf8bd4db0c8581218759040b058da778d3 oder https://www.johndcook.com/blog/standard_deviation/. Der Unterschied besteht, glaube ich, darin, dass in der Zeile
$self->{_S}= $self->{_S} + ($V - $M) * ($V - $M);
einmal der vorige und einmal der gerade erst ermittelte Mittelwert genutzt wird. Ich kann zu wenig Perl um zu klären, wie man das nun schreiben muss.  Mit meinen naiven Kenntnissen würde ich jetzt
$self->{_S}= $self->{_S} + ($V - $self->{_M}) * ($V - $M);
vermuten.

Kann da jemand, der sich auskennt, feedback geben?
FHEM 6.1 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Dr. Boris Neubert

Hallo,

das Schöne an Open Source ist, dass kein Bug unentdeckt bleiben kann.

Ich habe gerade die Stelle in "meinem" Knuth nicht wiedergefunden, aber in den beiden zitierten Webquellen steht die Formel anders als implementiert, nämlich wie von Dir vorgeschlagen.

Ich schaue gelegentlich nochmal in den Knuth und korrigiere das dann im Code.

Danke, dass Du Dir die Mühe gemacht hast, das anzuschauen.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

andies

FHEM 6.1 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Dr. Boris Neubert

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!