J'ai essayé d'implémenter l'algorithme de calcul séquentiel non biaisé de Donald Knuth en Python

Cet article présente l'algorithme de Donald Knuth, qui est un bon algorithme de calcul de dispersion. Je me fie généralement à la bibliothèque pour le calcul de la distribution, et je n'ai pas considéré l'algorithme en particulier, donc j'espère pouvoir profiter de cette occasion pour approfondir mes connaissances.

Problèmes de calcul par la formule de variance sans biais

Tout d'abord, je vais vous expliquer pourquoi vous avez besoin d'un tel algorithme. La distribution non biaisée est exprimée par la formule suivante.

\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)

Maintenant, voici deux sommes cumulatives. 1. Somme cumulée de $ x $ lui-même et de 2. $ x ^ 2 $. Il y a actuellement deux problèmes principaux. Premièrement, la précision des calculs numériques n'est pas garantie lorsque $ x $ est un très grand nombre. Deuxièmement, nous devons refaire de gros calculs lorsque nous avons plus d'échantillons. Pour résoudre ces défis, examinons l'algorithme de Donald Knuth dans la section suivante.

Algorithme de calcul séquentiel de Donald Knuth

Pour résoudre les problèmes mentionnés ci-dessus, cet algorithme a été conçu pour calculer la variance séquentiellement. L'algorithme est illustré ci-dessous. $ M_k $ représente la moyenne et $ s_k $ est le numérateur de la dispersion.

Initialisation: $ M_1 = x_1, S_1 = 0 $ Calculez l'équation graduelle suivante en $ 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}

La variance non biaisée estimée à calculer est $ s ^ 2 = S_k / (k-1) $ à $ k \ geq 2 $.

Implémentation en Python

Implémentons-le en Python pour nous assurer que l'algorithme précédent fonctionne réellement. Puisqu'il s'agit d'une expression graduelle, nous allons l'implémenter avec une fonction récursive. J'ai rendu possible la vérification de chaque instruction d'impression afin que vous puissiez voir comment elle est calculée séquentiellement.

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))

Résultat d'exécution

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)

Calculons et comparons en fait la moyenne et la variance avec numpy. L'argument mot-clé ddof = 1 sert à calculer comme une distribution non biaisée.

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

Résultat de sortie

(6.828571428571428, 10.569047619047621)

J'ai pu calculer séquentiellement comme ça. En fait, je ne pense pas que python récursif soit plus rapide que numpy, donc je ne pense pas avoir une chance de l'implémenter moi-même, mais bien qu'il soit excellent comme algorithme de calcul de distribution, il n'est pas bien connu, alors laissez-moi l'écrire sous forme d'article. Je l'ai reçu. J'espère que cela sera utile à tout le monde.

Lien de référence

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

Recommended Posts

J'ai essayé d'implémenter l'algorithme de calcul séquentiel non biaisé de Donald Knuth en Python
J'ai essayé d'implémenter la régression logistique de Cousera en Python
J'ai essayé d'implémenter le filtre anti-spam bayésien de Robinson avec python
J'ai essayé d'implémenter la fonction gamma inverse en python
Implémentation de SimRank en Python
Algorithme génétique en python
Réapprendre Python (algorithme I)
Calculer la date avec python
Calculer les dates en Python
Implémentation de Shiritori en Python
Algorithme en Python (Dijkstra)
Implémenté en Python PRML Chapitre 4 Classification par algorithme Perceptron
J'ai essayé d'implémenter GA (algorithme génétique) en Python
Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)
J'ai implémenté une commande de remplacement de type Vim dans Slackbot #Python
J'ai écrit python en japonais
Algorithme en Python (jugement premier)
Calcul de la valeur de jeu de cisaillement en Python
Implémentation de l'algorithme de "Algorithm Picture Book" en Python3 (Bubble Sort)
Reproduire la méthode de division mutuelle euclidienne en Python
Algorithme en Python (dichotomie)
Implémenter l'algorithme de Dijkstra en python
Je comprends Python en japonais!
Ce que j'ai appris en Python
Implémentation de l'algorithme «Algorithm Picture Book» en Python3 (tri sélectif)
J'ai comparé le temps de calcul de la moyenne mobile écrite en Python
Algorithme en Python (recherche de priorité de largeur, bfs)
Implémentation de la segmentation d'image en python (Union-Find)
[Python] J'ai essayé d'implémenter un échantillonnage de Gibbs marginalisé
Développons un algorithme d'investissement avec Python 2
Règles d'apprentissage Widrow-Hoff implémentées en Python
J'ai écrit Fizz Buzz en Python
Implémentation de la méthode de propagation d'étiquettes en Python
J'ai essayé d'étudier le processus avec Python
Scikit-learn ne peut pas être installé en Python
J'ai écrit la file d'attente en Python
Implémentation d'un algorithme simple en Python 2
Implémentation des règles d'apprentissage Perceptron en Python
Exécutez un algorithme simple en Python
J'ai essayé la notification de ligne en Python
Implémenté en 1 minute! LINE Notify en Python
J'ai écrit la pile en Python
J'ai mis Python 2.7 dans Sakura VPS 1 Go.
J'ai essayé d'implémenter PLSA en Python
Un client HTTP simple implémenté en Python
J'ai fait un programme de gestion de la paie en Python!
Livre Ali en python: méthode Dyxtra Sec.2-5
Algorithme en Python (ABC 146 C Dichotomy
Implémenté en Python PRML Chapitre 7 SVM non linéaire
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'implémenter ADALINE en Python
Ecrire une méthode de cupidité simple en Python
Je voulais résoudre ABC159 avec Python
J'ai essayé d'implémenter PPO en Python
Implémenté dans Python PRML Chapter 5 Neural Network
J'ai cherché un nombre premier avec python
Mise en œuvre du tri Stuge dans Python 3 (tri à bulles et tri rapide)
Faisons un calcul de combinaison avec Python