Utilisateur:Kelam/Bac à sable perso

Une page de Wikipédia, l'encyclopédie libre.
Ici, on se présente Ici, on cause Ici, on ébauche

Les algorithmes de calcul de la variance jouent un rôle majeur dans les statistiques numériques. Une difficulté clé dans la conception de bons algorithmes pour ce problème est que les formules de calcul de la variance peuvent impliquer le calcul de sommes de carrés, qui peuvent provoquer des instabilités numériques de même que des dépassements arithmétiques quand de grandes valeurs apparaissent..

Algorithme naïf[modifier | modifier le code]

Une formule usuelle pour le calcul de la variance d'une population de taille N est :

Avec la correction de Bessel qui permet d'avoir un estimateur sans biais de la variance pour un échantillon fini de n observations, the formula is:

Ainsi, un algorithme naïve algorithm to calculate the estimated variance is given by the following:

  • Soient n ← 0, Sum ← 0, SumSq ← 0
  • Pour chaque donné x :
    • nn + 1
    • Sum ← Sum + x
    • SumSq ← SumSq + x × x
  • Var = (SumSq − (Sum × Sum) / n) / (n − 1)

Cet algorithme peut facilement être adapté au calcul de la variance d'une population finie, en divisant par n au lieu de n − 1 à la dernière étape.

Puisque SumSq et (Sum×Sum)/n peuvent être des nombres très proches, une annulation catastrophique peut entrainer une précision du résultat inférieure à la précision machine utilisée pour le calcul. Ainsi, cet algorithme ne doit pas être utilisé en pratique[1],[2], aussi plusieurs algorithmes alternatifs, numériquement stables, ont été proposés[3]. This is particularly bad if the standard deviation is small relative to the mean.

Calcul avec des données décalées[modifier | modifier le code]

La variance est invariant en présence d'un paramètre de position, aussi, on peut utiliser cette propriété pour éviter le risque d'annulation catastrophique :

ce qui donne :

Plus est proche de la moyenne de l'échantillon, plus le calcul de la variance sera précis, mais choisir une valeur parmi les données de l'échantillon suffit à rendre le calcul stable. Si les valeurs sont petites alors il n'y aura pas de problème avec les sommes des carrés, et inversement, si elles sont grandes, alors la variance est également grandes. Dans tous les cas, le deuxième terme de la formuel est toujorus inférieur au premier, et il n'y aura donc pas d'annulation[2].

En prenant la première donnée comme paramètre , l'algorithme peut se réécrire en :

  • Soient n ← 0, Sum ← 0, SumSq ← 0, Kx0
  • Pour chaque donnée x :
    • nn + 1
    • Sum ← Sum + (xK)
    • SumSq ← SumSq + (xK) × (xK)
  • Var = (SumSq − (Sum × Sum) / n) / (n − 1)

Algorithme en deux passes[modifier | modifier le code]

Une alternative, se basant sur une autre formulation de la variance, consiste à calculer la moyenne dans un premier temps,

puis calculer la somme des carrés des différences par rapport à la moyenne,

On a donc le code :

  • Soient n ← 0, Sum ← 0, SumSq ← 0
  • Pour chaque donnée x :
    • nn + 1
    • Sum ← Sum + x
  • Moy = Sum / n
  • n ← 0
  • Pour chaque donnée x :
    • nn + 1
    • SumSq ← SumSq + (x − Moy) × (x − Moy)
  • Var = SumSq / (n − 1)

Cet algorithme est numériquement stable pour n petit[1],[4]. Cependant, les résultats des deux algorithmes simples (naïf et à deux passes) peuvent dépendre énormément de l'ordre des données et donc induire de mauvais résultats pour de grands ensembles de données par des erreurs répétées d'arrondi dans l'accumulation des sommes. Des techniques comme la sommation compensée peuvent aider à limiter l'impact de cette erreur.

Algorithme en ligne de Welford[modifier | modifier le code]

Il est souvent utile de calculer la variance en une seule passe et d'utiliser chaque valeur une seule fois ; par exemple, quand les données sont collectées sans espace mémoire suffisant pour stocker toutes les valeurs, ou quand le coût mémoire domine le coût calcul. Pour un tel algorithme en ligne, une relation de récurrence est nécessaire entre les données, de façon à calculer les statistiques nécessaires par une méthode stable.

Les formules suivantes peuvent être utilisées pour mettre à jour la moyenne et la variance (estimée) de la suite, pour un élément additionnel xn. Ici, désigne la moyenne de l'échantillon des n premières données , la variance de l'échantillon par un estimateur biaisé, et la variance de l'échantillon par un estimateur sans biais.

Ces formules sont sources d'instabilité numérique, car elles soustraient de manière répétée un petit nombre d'un grand nombre qui grandit avec n. Une meilleure quantité pour mettre à jour la somme des carrés des différences à la moyenne , notée ici , sera :

Cet algorithme a été trouvé par Welford[5],[6] et largement analysé[2][7]. Il est courant de noter et [8].

  • Soient n ← 0, Moy_old ← 0, Moy_new ← 0, M ← 0, S ← 0
  • Pour chaque donné x :
    • nn + 1
    • M_new ← M_new + x
    • Si n > 1
      • M_old ← M_new
      • M_new ← M_old + (x – M_old) / n
      • M ← M + (x - Moy_old) × (x - Moy_new)
  • Var = M / (n − 1)

Cet algorithme est moins susceptible de causer des pertes de précision par une annulation catastrophique, mais peut ne pas être aussi efficace à cause des divisions dans la boucle. Pour un algorithme en deux passes plus robuste, on peut d'abord calculer la moyenne et soustraire cette estimation des données, puis utiliser l'algorithme sur les résidus.

L'algorithme parallèle illustré infra illustre comment fusionner des ensembles multiples de statistiques calculées en ligne.

Algorithme incrémental pondéré[modifier | modifier le code]

L'algorithme peut être adapté pour prendre en compte la pondération des échantillons, en remplaçant le compteur n par la somme des poids cumulés. West (1979)[9] suggère l'algorithme suivant :

  • Soient n ← 0, Sum ← 0, Sum2 ← 0, SumSq ← 0, Moy ← 0, Moy_old ← 0
  • Pour chaque donnée (x , w) :
    • nn + 1
    • Sum ← Sum + w
    • Moy_old ← Moy
    • Moy ← Moy_old + (w / Sum) × (x – Moy_old)
    • SumSq = Var + w × (x – Moy_old) × (x – Moy)
  • Var = SumSq / Sum2

Algorithme parallèle[modifier | modifier le code]

Chan et al.[10] remarquent que l'algorithme en ligne de Welford décrit supra est un cas spécial d'un algorithme de somme sur deux ensembles et :

.

Il peut être utile quand, par exemple, plusieurs unités de calcul peuvent être assignées à des parties discrètes des données d'entrée.

La méthode de Chan d'estimation de la moyenne est numériquement instable quand et sont toutes les deux très grandes, car l'erreur numérique en n'est pas échelonnée comme dan le cas où case. Dans de tels cas, on préférera .

Il peut être généralisée pour permettre la parallélisation avec AVX, avec le calcul sur carte graphique et sur clusters, et au calcul de la covariance[3].

Exemple[modifier | modifier le code]

On suppose que toutes les opérations utilisent l'arithmétique standard IEEE 754 double-precision. Pour l'échantillon (4, 7, 13, 16) d'une population infinie, la moyenne estimée est de 10, la variance estimée (sans biais) est de 30. Ces deux valeurs sont bien les résultats obtenus par l'algorithme naïf et l'algorithme à deux passes.

On considère maintenant l'échantillon (108 + 4, 108 + 7, 108 + 13, 108 + 16), qui possède la même variance que le premier. Cette fois, si l'algorithme à deux passes donne le bon résultat, l'algorithme naïf renvoie 29,333333333333332 au lieu de 30.

Tant que la perte de précision est acceptable et vue comme un défaut mineur de l'algorithme naïf, augmenter encore le décalage rendra l'erreur catastrophique. CPour l'échantillon (109 + 4, 109 + 7, 109 + 13, 109 + 16), qui est encore de variance égale à 30, l'algorithme à deux passes reste fonctionnel mais l'algorithme naïf donne −170.66666666666666. Ce problème est causé par une annulation catastrophique dans l'algorithme naïf au moment de la soustraction de deux nombres similaires à la dernière étape de l'algorithme.

Higher-order statistics[modifier | modifier le code]

Terriberry[11] extends Chan's formulae to calculating the third and fourth central moments, needed for example when estimating skewness and kurtosis:

Here the are again the sums of powers of differences from the mean , giving

For the incremental case (i.e., ), this simplifies to:

By preserving the value , only one division operation is needed and the higher-order statistics can thus be calculated for little incremental cost.

An example of the online algorithm for kurtosis implemented as described is:

def online_kurtosis(data):
    n = mean = M2 = M3 = M4 = 0

    for x in data:
        n1 = n
        n = n + 1
        delta = x - mean
        delta_n = delta / n
        delta_n2 = delta_n**2
        term1 = delta * delta_n * n1
        mean = mean + delta_n
        M4 = M4 + term1 * delta_n2 * (n**2 - 3*n + 3) + 6 * delta_n2 * M2 - 4 * delta_n * M3
        M3 = M3 + term1 * delta_n * (n - 2) - 3 * delta_n * M2
        M2 = M2 + term1

    # Note, you may also calculate variance using M2, and skewness using M3
    # Caution: If all the inputs are the same, M2 will be 0, resulting in a division by 0.
    kurtosis = (n * M4) / (M2**2) - 3
    return kurtosis
  • Soient n ← 0, Sum ← 0, SumSq ← 0
  • Pour chaque donné x :
    • nn + 1
    • Sum ← Sum + x
    • SumSq ← SumSq + x × x
  • Var = (SumSq − (Sum × Sum) / n) / (n − 1)

Pébaÿ[12] further extends these results to arbitrary-order central moments, for the incremental and the pairwise cases, and subsequently Pébaÿ et al.[13] for weighted and compound moments. One can also find there similar formulas for covariance.

Choi and Sweetman[14] offer two alternative methods to compute the skewness and kurtosis, each of which can save substantial computer memory requirements and CPU time in certain applications. The first approach is to compute the statistical moments by separating the data into bins and then computing the moments from the geometry of the resulting histogram, which effectively becomes a one-pass algorithm for higher moments. One benefit is that the statistical moment calculations can be carried out to arbitrary accuracy such that the computations can be tuned to the precision of, e.g., the data storage format or the original measurement hardware. A relative histogram of a random variable can be constructed in the conventional way: the range of potential values is divided into bins and the number of occurrences within each bin are counted and plotted such that the area of each rectangle equals the portion of the sample values within that bin:

where and represent the frequency and the relative frequency at bin and is the total area of the histogram. After this normalization, the raw moments and central moments of can be calculated from the relative histogram:

where the superscript indicates the moments are calculated from the histogram. For constant bin width these two expressions can be simplified using :

The second approach from Choi and Sweetman[14] is an analytical methodology to combine statistical moments from individual segments of a time-history such that the resulting overall moments are those of the complete time-history. This methodology could be used for parallel computation of statistical moments with subsequent combination of those moments, or for combination of statistical moments computed at sequential times.

If sets of statistical moments are known: for , then each can be expressed in terms of the equivalent raw moments:

where is generally taken to be the duration of the time-history, or the number of points if is constant.

The benefit of expressing the statistical moments in terms of is that the sets can be combined by addition, and there is no upper limit on the value of .

where the subscript represents the concatenated time-history or combined . These combined values of can then be inversely transformed into raw moments representing the complete concatenated time-history

Known relationships between the raw moments () and the central moments () are then used to compute the central moments of the concatenated time-history. Finally, the statistical moments of the concatenated history are computed from the central moments:

Calcul de la covariance[modifier | modifier le code]

Des algorithmes très similaires peuvent être tirés des précédents pour le calcul de la covariance.

Algorithme naïf[modifier | modifier le code]

Un algorithme naïf de calcul de la covariance se ferait à partir de la formule :

ce qui se traduit par

  • Soient n ← 0, SumX ← 0, SumY ← 0, SumXY ← 0
  • Pour chaque donnée (x , y) :
    • nn + 1
    • SumX ← Sum + x
    • SumY ← SumY + x
    • SumXY ← SumXY + x × y
  • Cov = (SumXY − (SumX × SumY) / n) / (n − 1)

Avec estimation de la moyenne[modifier | modifier le code]

Comme pour la variance, la covariance de deux vecteurs aléatoires est invariante par translation, donc pour toutes valeurs constantes et données, on a :

et choisir une valeur parmi les données va rendre le calcul plus stable contre les annulations catastrophiques et plus robuste contre les grandes sommes.

À deux passes[modifier | modifier le code]

L'algorithme à deux passes calcul d'abord les deux moyennes, puis la covariance :

The two-pass algorithm may be written as:

def two_pass_covariance(data1, data2):
    n = len(data1)
    mean1 = sum(data1) / n
    mean2 = sum(data2) / n

    covariance = 0
    for i1, i2 in zip(data1, data2):
        a = i1 - mean1
        b = i2 - mean2
        covariance += a * b / n
    return covariance
  • Soient n ← 0, SumX ← 0, SumY ← 0, SumXY ← 0
  • Pour chaque donnée (x ,y) :
    • nn + 1
    • SumX ← SumX + x
    • SumY ← SumY + y
  • MoyX ← SumX / n
  • MoyY ← SumY / n
  • n ← 0
  • Pour chaque donnée (x ,y) :
    • nn + 1
    • SumXY ← SumXY + (x – MoyX) × (y – MoyY)
  • Cov = SumXY / n

Une version compensée légèrement plus précise exécute l'algorithme naïf complet sur les résidus. Les sommes finales et doivent être nulles, mais la deuxième passe compense toute petite erreur.

Online[modifier | modifier le code]

A stable one-pass algorithm exists, similar to the online algorithm for computing the variance, that computes co-moment :

The apparent asymmetry in that last equation is due to the fact that , so both update terms are equal to . Even greater accuracy can be achieved by first computing the means, then using the stable one-pass algorithm on the residuals.

Thus the covariance can be computed as

def online_covariance(data1, data2):
    meanx = meany = C = n = 0
    for x, y in zip(data1, data2):
        n += 1
        dx = x - meanx
        meanx += dx / n
        meany += (y - meany) / n
        C += dx * (y - meany)

    population_covar = C / n
    # Bessel's correction for sample variance
    sample_covar = C / (n - 1)
  • Soient n ← 0, Sum ← 0, SumSq ← 0
  • Pour chaque donné x :
    • nn + 1
    • Sum ← Sum + x
    • SumSq ← SumSq + x × x
  • Var = (SumSq − (Sum × Sum) / n) / (n − 1)

A small modification can also be made to compute the weighted covariance:

def online_weighted_covariance(data1, data2, data3):
    meanx = meany = 0
    wsum = wsum2 = 0
    C = 0
    for x, y, w in zip(data1, data2, data3):
        wsum += w
        wsum2 += w * w
        dx = x - meanx
        meanx += (w / wsum) * dx
        meany += (w / wsum) * (y - meany)
        C += w * dx * (y - meany)

    population_covar = C / wsum
    # Bessel's correction for sample variance
    # Frequency weights
    sample_frequency_covar = C / (wsum - 1)
    # Reliability weights
    sample_reliability_covar = C / (wsum - wsum2 / wsum)
  • Soient n ← 0, Sum ← 0, SumSq ← 0
  • Pour chaque donné x :
    • nn + 1
    • Sum ← Sum + x
    • SumSq ← SumSq + x × x
  • Var = (SumSq − (Sum × Sum) / n) / (n − 1)

Likewise, there is a formula for combining the covariances of two sets that can be used to parallelize the computation:[3]

Weighted batched version[modifier | modifier le code]

A version of the weighted online algorithm that does batched updated also exists: let denote the weights, and write

The covariance can then be computed as

Voir aussi[modifier | modifier le code]

References[modifier | modifier le code]

  1. a et b (en) Bo Einarsson, Accuracy and Reliability in Scientific Computing, SIAM, (ISBN 978-0-89871-584-2, lire en ligne), p. 47
  2. a b et c Tony F. Chan, Gene H. Golub et Randall J. LeVeque, « Algorithms for computing the sample variance: Analysis and recommendations », The American Statistician, vol. 37, no 3,‎ , p. 242–247 (DOI 10.1080/00031305.1983.10483115, JSTOR 2683386, lire en ligne [archive du ])
  3. a b et c (en) Erich Schubert et Michael Gertz, Numerically stable parallel computation of (co-)variance, ACM, , 10 p. (ISBN 9781450365055, DOI 10.1145/3221269.3223036, S2CID 49665540, lire en ligne)
  4. (en) Nicholas J. Higham, Accuracy and Stability of Numerical Algorithms, 2nd, (ISBN 978-0-898715-21-7, DOI 10.1137/1.9780898718027, lire en ligne), « Problem 1.10 ». Metadata le liste dans ACM Digital Library.
  5. B. P. Welford, « Note on a method for calculating corrected sums of squares and products », Technometrics, vol. 4, no 3,‎ , p. 419–420 (DOI 10.2307/1266577, JSTOR 1266577)
  6. Donald E. Knuth (1998). The Art of Computer Programming, volume 2: Seminumerical Algorithms, 3rd edn., p. 232. Boston: Addison-Wesley.
  7. Robert F. Ling, « Comparison of Several Algorithms for Computing Sample Means and Variances », Journal of the American Statistical Association, vol. 69, no 348,‎ , p. 859–866 (DOI 10.2307/2286154, JSTOR 2286154)
  8. John D. Cook, « Accurately computing sample variance », sur John D. Cook Consulting: Expert consulting in applied mathematics & data privacy,
  9. D. H. D. West, « Updating Mean and Variance Estimates: An Improved Method », Communications of the ACM, vol. 22, no 9,‎ , p. 532–535 (DOI 10.1145/359146.359153, S2CID 30671293)
  10. (en) Tony F. Chan, Gene H. Golub et Randall J. LeVeque, « Updating Formulae and a Pairwise Algorithm for Computing Sample Variances », Department of Computer Science, Stanford University,
  11. Timothy B. Terriberry, « Computing Higher-Order Moments Online » [archive du ], (consulté le )
  12. Philippe Pierre Pébay, « Formulas for Robust, One-Pass Parallel Computation of Covariances and Arbitrary-Order Statistical Moments », Sandia National Laboratories (SNL), (DOI 10.2172/1028931)
  13. Philippe Pébaÿ, Timothy Terriberry, Hemanth Kolla et Janine Bennett, « Numerically Stable, Scalable Formulas for Parallel and Online Computation of Higher-Order Multivariate Central Moments with Arbitrary Weights », Computational Statistics, Springer, vol. 31, no 4,‎ , p. 1305–1325 (DOI 10.1007/s00180-015-0637-z, S2CID 124570169, lire en ligne)
  14. a et b Myoungkeun Choi et Bert Sweetman, « Efficient Calculation of Statistical Moments for Structural Health Monitoring », Journal of Structural Health Monitoring, vol. 9, no 1,‎ , p. 13–24 (DOI 10.1177/1475921709341014, S2CID 17534100)

External links[modifier | modifier le code]