2016-07-07 7 views
1

Ich habe eine Sammlung von n Fließkommawerten: x[n]. Als ich die Meanvalue und Standardabweichung berechnet werden soll, muss ich mit zwei Schleifen über alle Werte iterieren:Gibt es eine Approximation, um den Mittelwert und die Standardabweichung in einer Schleife zu erhalten

Erste Schleife alle Werte zu summieren und die Meanvalue berechnen:

sum = 0 
for(i=0; i<n; i++) 
    sum += x[i] 
mean = sum/n 

In einer zweiten Schleife I berechnen die Standardabweichung:

sum = 0 
for(i=0; i<n; i++) 
    sum += pow2(x[i] - mean) 
sder = sqrt(sum/n) 

ich bin mir bewusst, dass Sie diese Komplexität nicht reduzieren können, wenn Sie auf die exakten Werte für Meanvalue und Standardabweichung wollen. Aber gibt es eine Möglichkeit, sie in weniger Zeit zu berechnen, wenn Sie nur annähern? In einer Schleife bevorzugt.

+0

Was Sie dort haben, ist O (n). Meinst du, du willst es in einem Durchgang machen? – SirGuy

+0

ja ich meine das. Ich werde die Frage bearbeiten – RomCoo

+0

O (2n) ist O (n). Wenn Sie eine große O-Notation verwenden, wenn Sie konstante Faktorverbesserungen wünschen, denken Sie wahrscheinlich darüber falsch. – user2357112

Antwort

3

Werfen Sie einen Blick auf this section des Wikis auf die Standardabweichung, insbesondere die letzte Formel zu folgendem Algorithmus führt:

sum = 0; 
    sumsqrd = 0; 

    for(i = 0; i < n; i++) 
     sum += x[i] 
     sumsqrd += x[i] * x[i] 

    mean = sum/n 
    stddev = sqrt(sumsqrd/n - mean * mean) 
+0

Oh man, ich hätte in Mathe besser aufpassen sollen. Ich hätte nicht gedacht, dass es so einfach wäre. – RomCoo

+3

Es ist erwähnenswert, dass die numerische Stabilität dieses Algorithmus schlechter ist als die Berechnung des mittleren zuerst und dann die Berechnung der mittleren quadratischen Abweichung vom Mittelwert. Wenn zum Beispiel IEEE 754 verdoppelt wird, ergibt sich für [1e8 + 1, 1e8-1] eine Standardabweichung von 0. Wenn Sie eine Annäherung trotzdem akzeptieren würden, ist das wahrscheinlich in Ordnung, aber es wäre falsch zu denken, dass dieser Algorithmus keine Nachteile hat. – user2357112

2

Hier ist eine Version, die die Berechnungen in einem Durchgang der Fall ist, und ist rechnerisch stabiler :

mean = 0.0 
sum_sqrs = 0.0 
n = 0 

loop do 
    x = get_x() 
    break if x == nil 
    delta = x - mean 
    n += 1 
    mean += delta/n 
    sum_sqrs += delta * (x - mean) 
end 
sample_var = sum_sqrs/(n - 1) 

auf die Formeln in der unteren Hälfte des Rapid calculation methods Abschnitt der Wikipedia-Seite für Standard deviation gefunden Dieses basiert.

Verwandte Themen