En fait, l'algorithme de Welford peut facilement être adapté pour calculer pondéré Variance. Et en fixant les poids à -1, vous devriez être en mesure d'annuler efficacement les éléments. Je n'ai pas vérifié les mathématiques pour savoir si elles autorisent les poids négatifs, mais à première vue, elles devraient le faire !
J'ai fait une petite expérience en utilisant ELKI :
void testSlidingWindowVariance() {
MeanVariance mv = new MeanVariance(); // ELKI implementation of weighted Welford!
MeanVariance mc = new MeanVariance(); // Control.
Random r = new Random();
double[] data = new double[1000];
for (int i = 0; i < data.length; i++) {
data[i] = r.nextDouble();
}
// Pre-roll:
for (int i = 0; i < 10; i++) {
mv.put(data[i]);
}
// Compare to window approach
for (int i = 10; i < data.length; i++) {
mv.put(data[i-10], -1.); // Remove
mv.put(data[i]);
mc.reset(); // Reset statistics
for (int j = i - 9; j <= i; j++) {
mc.put(data[j]);
}
assertEquals("Variance does not agree.", mv.getSampleVariance(),
mc.getSampleVariance(), 1e-14);
}
}
J'obtiens environ ~14 chiffres de précision par rapport à l'algorithme exact à deux passages ; c'est à peu près tout ce que l'on peut attendre des doubles. Notez que Welford fait a un certain coût de calcul en raison des divisions supplémentaires - il prend environ deux fois plus de temps que l'algorithme exact à deux passages. Si la taille de votre fenêtre est petite, il peut être beaucoup plus judicieux de recalculer la moyenne et, dans un second temps, la variance. chaque temps.
J'ai ajouté cette expérience comme test unitaire à ELKI, vous pouvez voir la source complète ici : http://elki.dbs.ifi.lmu.de/browser/elki/trunk/test/de/lmu/ifi/dbs/elki/math/TestSlidingVariance.java il se compare également à la variance exacte à deux passages.
Cependant, sur des ensembles de données asymétriques, le comportement peut être différent. Cet ensemble de données est évidemment uniformément distribué, mais j'ai également essayé un tableau trié et cela a fonctionné.
Mise à jour : nous avons publié un article avec des détails sur différents schémas de pondération pour la (co-)variance :
Schubert, Erich, et Michael Gertz. " Calcul parallèle numériquement stable de la (co-)variance. " Actes de la 30e conférence internationale sur la gestion des bases de données scientifiques et statistiques. ACM, 2018. (A remporté le prix du meilleur article de la SSDBM).
Il est également question de la façon dont la pondération peut être utilisée pour paralléliser le calcul, par exemple avec AVX, les GPU ou sur des grappes.
1 votes
+1 pour avoir mentionné l'algorithme de Welford ; je savais qu'il était dans Knuth mais je ne connaissais pas la source originale.
2 votes
Bonjour, qu'avez-vous fait au final ? Avez-vous adapté l'algorithme de Chan ? Par ailleurs, la somme de Kahan ne devrait-elle pas être capable de surmonter les instabilités numériques en utilisant l'approche "naïve" (en gardant la trace des sommes des valeurs et de leurs carrés) ?