Ich habe versucht, Donald Knuths unvoreingenommenen sequentiellen Berechnungsalgorithmus in Python zu implementieren

In diesem Artikel wird der Algorithmus von Donald Knuth vorgestellt, der ein hervorragender Algorithmus zur Berechnung der Dispersion ist. Normalerweise verlasse ich mich bei der Berechnung der Verteilung auf die Bibliothek, und ich habe den Algorithmus nicht besonders berücksichtigt. Ich hoffe, dass ich diese Gelegenheit nutzen kann, um mein Wissen zu vertiefen.

Berechnungsprobleme nach der unverzerrten Varianzformel

Zunächst erkläre ich, warum Sie einen solchen Algorithmus benötigen. Die unverzerrte Verteilung wird durch die folgende Formel ausgedrückt.

\sigma^2 = \frac{1}{n(n-1)} \biggl(\sum_{i=1}^{n}x_i^2-\Bigl(\sum_{i=1}^{n}x_i\Bigr)^2\biggr) =\frac{1}{n-1}\Bigl(E[X^2]-E[X]^2\Bigr)

Hier sind zwei kumulative Summen. 1. Kumulative Summe von $ x $ selbst und 2. $ x ^ 2 $. Derzeit gibt es zwei Hauptprobleme. Erstens ist die Genauigkeit numerischer Berechnungen nicht garantiert, wenn $ x $ eine sehr große Zahl ist. Zweitens müssen wir wieder große Berechnungen durchführen, wenn wir mehr Proben haben. Um diese Herausforderungen zu lösen, schauen wir uns im nächsten Abschnitt den Algorithmus von Donald Knuth an.

Donald Knuths sequentieller Berechnungsalgorithmus

Um die oben genannten Probleme zu lösen, wurde dieser Algorithmus entwickelt, um die Varianz sequentiell zu berechnen. Der Algorithmus ist unten gezeigt. $ M_k $ repräsentiert den Durchschnitt und $ s_k $ ist der Zähler der Dispersion.

Initialisierung: $ M_1 = x_1, S_1 = 0 $ Berechnen Sie die folgende allmähliche Gleichung in $ k \ geq 2 $

\begin{align}
M_k &= M_{k-1} + \frac{(x_k - M_{k-1})}{k}\\
S_k &= S_{k-1} + (x_k - M_{k-1})*(x_k - M_k)
\end{align}

Die zu berechnende geschätzte unverzerrte Varianz beträgt $ s ^ 2 = S_k / (k-1) $ bei $ k \ geq 2 $.

Implementierung in Python

def calc_var(x, k=0, M=0, s=0):
    print('k=', k)
    print('M=', M)
    print('s=', s)
    print('-----------------------')
    if k == 0:
        M = x[0]
        s = 0
    delta = x[k] - M
    M += delta/(k+1)
    s += delta*(x[k]-M)
    k += 1
    if k == len(x):
        return M, s/(k-1)
    else:
        return calc_var(x, k=k, M=M, s=s)

x = [3.3, 5, 7.2, 12, 4, 6, 10.3]
print(calc_var(x))
k= 0
M= 0
s= 0
-----------------------
k= 1
M= 3.3
s= 0.0
-----------------------
k= 2
M= 4.15
s= 1.4449999999999996
-----------------------
k= 3
M= 5.166666666666667
s= 7.646666666666666
-----------------------
k= 4
M= 6.875
s= 42.6675
-----------------------
k= 5
M= 6.3
s= 49.279999999999994
-----------------------
k= 6
M= 6.25
s= 49.355
-----------------------
(6.828571428571428, 10.56904761904762)

Selbst mit Numpy werde ich den Mittelwert und die Varianz berechnen und vergleichen. Das Schlüsselwortargument ddof = 1 dient zur Berechnung als unverzerrte Verteilung.

import numpy as np
x_arr = np.array(x)
print((x_arr.mean(), x_arr.var(ddof=1)))

Ausgabeergebnis

(6.828571428571428, 10.569047619047621)

Ich konnte so sequentiell rechnen. Eigentlich glaube ich nicht, dass Python-Rekursiv schneller als Numpy ist, also glaube ich nicht, dass ich die Möglichkeit habe, es selbst zu implementieren, aber obwohl es als verteilter Berechnungsalgorithmus ausgezeichnet ist, ist es nicht bekannt, also lassen Sie es mich schreiben Ich habe es erhalten. Ich hoffe, es wird für alle hilfreich sein.

Referenzlink

Accurately computing running variance https://www.johndcook.com/blog/standard_deviation/

Recommended Posts

Ich habe versucht, Donald Knuths unvoreingenommenen sequentiellen Berechnungsalgorithmus in Python zu implementieren
Ich habe versucht, Couseras logistische Regression in Python zu implementieren
Ich habe versucht, Robinsons Bayesian Spam Filter mit Python zu implementieren
Ich habe versucht, die inverse Gammafunktion in Python zu implementieren
SimRank in Python implementiert
Genetischer Algorithmus in Python
Python neu lernen (Algorithmus I)
Berechnen Sie das Datum mit Python
Berechnen Sie Daten in Python
Shiritori in Python implementiert
Algorithmus in Python (Dijkstra)
Implementiert in Python PRML Kapitel 4 Klassifizierung nach Perceptron-Algorithmus
Ich habe versucht, GA (genetischer Algorithmus) in Python zu implementieren
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)
Ich habe einen Vim-ähnlichen Ersetzungsbefehl in Slackbot #Python implementiert
Ich habe Python auf Japanisch geschrieben
Algorithmus in Python (Haupturteil)
Berechnung des Scherspielwerts in Python
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Bubble Sort)
Reproduzieren Sie die euklidische Methode der gegenseitigen Teilung in Python
Algorithmus in Python (Dichotomie)
Implementieren Sie den Dijkstra-Algorithmus in Python
Ich verstehe Python auf Japanisch!
Was ich in Python gelernt habe
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Selective Sort)
Ich habe die Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts verglichen
Algorithmus in Python (Breitenprioritätssuche, bfs)
Implementierte Bildsegmentierung in Python (Union-Find)
[Python] Ich habe versucht, marginalisiertes Gibbs-Sampling zu implementieren
Lassen Sie uns mit Python 2 einen Investitionsalgorithmus entwickeln
In Python implementierte Widrow-Hoff-Lernregeln
Ich habe Fizz Buzz in Python geschrieben
Implementierte Methode zur Weitergabe von Etiketten in Python
Ich habe versucht, den Prozess mit Python zu studieren
Scikit-learn kann nicht in Python installiert werden
Ich habe die Warteschlange in Python geschrieben
Implementierung eines einfachen Algorithmus in Python 2
Implementierte Perceptron-Lernregeln in Python
Führen Sie einen einfachen Algorithmus in Python aus
Ich habe Line Benachrichtigung in Python versucht
Implementiert in 1 Minute! LINE Benachrichtigen in Python
Ich habe den Stack in Python geschrieben
Ich habe Python 2.7 in Sakura VPS 1 GB installiert.
Ich habe versucht, PLSA in Python zu implementieren
Ein einfacher HTTP-Client, der in Python implementiert ist
Ich habe ein Pay-Management-Programm in Python erstellt!
Ali Buch in Python: Sec.2-5 Dyxtra-Methode
Algorithmus in Python (ABC 146 C Dichotomie
Implementiert in Python PRML Kapitel 7 Nichtlineare SVM
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich habe versucht, ADALINE in Python zu implementieren
Schreiben Sie eine einfache Giermethode in Python
Ich wollte ABC159 mit Python lösen
Ich habe versucht, PPO in Python zu implementieren
Implementiert in Python PRML Kapitel 5 Neuronales Netzwerk
Ich habe mit Python nach einer Primzahl gesucht
Stuge Sort in Python 3 implementiert (Bubble Sort & Quick Sort)
Lassen Sie uns eine Kombinationsberechnung mit Python durchführen