Statistische Kennzahlen wie Mittelwert / Standardabweichung laufend aktualiseren

Thomas Darimont

Erfahrenes Mitglied
Hallo,

Nicht immer kann man alle Werte eine Messreihe halten, so das es nützlich ist zu wissen, wie man statistische Kennzahlen auch "laufend" aktualiseren kann.

schaut mal hier:
Java:
package de.tutorials;

public class RunningStatisticsExample {
    public static void main(String[] args) {
    
        double[] values = {5,4,23,2,3,6,4,3};
        
        Statistics statistics = new Statistics();
        
        for(int i = 0; i< values.length;i++){
            statistics.update(values[i]);    
        }
        
        System.out.println(statistics);
        
    }
    
    static class Statistics {

      double mean;
      double standardDeviation;
      double variance;

      double sumOfSquares;
      double sum;

      int count;

      public void update(double value) {
         count++;
         this.sum += value;
         this.sumOfSquares += value * value;
         this.mean += (value - mean) / count;
         this.standardDeviation = Math.sqrt((count * sumOfSquares - sum * sum) / (count * (count - 1)));
         this.variance = this.standardDeviation * this.standardDeviation;
      }

      public double getMean() {
         return mean;
      }

      public void setMean(double mean) {
         this.mean = mean;
      }

      public double getStandardDeviation() {
         return standardDeviation;
      }

      public void setStandardDeviation(double standardDeviation) {
         this.standardDeviation = standardDeviation;
      }

      @Override
      public String toString() {

         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder.append("sum: ");
         stringBuilder.append(sum);
         stringBuilder.append("\n");

         stringBuilder.append("sum of x²: ");
         stringBuilder.append(sumOfSquares);
         stringBuilder.append("\n");

         stringBuilder.append("mean: ");
         stringBuilder.append(mean);
         stringBuilder.append("\n");

         stringBuilder.append("stddev: ");
         stringBuilder.append(standardDeviation);
         stringBuilder.append("\n");

         stringBuilder.append("variance: ");
         stringBuilder.append(variance);
         stringBuilder.append("\n");

         return stringBuilder.toString();
      }
   }
}

Ausgabe:
Code:
sum: 50.0
sum of x²: 644.0
mean: 6.25
stddev: 6.881652625434014
variance: 47.357142857142854

Gruß Tom
 

Oliver Gierke

Erfahrenes Mitglied
Was spricht dagegen, die Liste in der Statistics Klasse zu halten und die Getter die Berechnungen ausführen zu lassen? Wenn man die Liste updated oder manipuliert stimmen die Werte dann auch.

Okay, die Berechnungen werden jedes Mal neu ausgeführt, aber ich fänd den Entwurf objektorientierter ;).

REINHAUN!

Btw: 2 Tage noch bis zum Vierteljahrhundert :)
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

wie gesagt nicht immer kann man alle Werte halten ... manchmal sind einfach zu viele... Millionen Kassenbonsätze, Milliarden IP Datenpakete, etc.

Die Statistiken bei jedem Zugriff zu berechnen wäre bei großen Datenmengen unnötig teuer.

Gruß Tom

Jap. ich weis... das blinkt schon an so vielen Stellen, dass es mir immer schwerer fällt das zu ignorieren... ;-)