Quelques réflexions sur les estimations de progression

« Fait: 42%, fin estimée dans 1729 secondes », ces messages sont omniprésents dans les logiciels, mais il y en a de meilleurs que d'autres. Quelques conseils tirés de mon expérience personnelle.

[Xkcd 612: Estimation]

D'abord, plutôt que « fin estimée dans 1729 secondes », « fin estimée à 15:56:30 », merci. Le temps qui reste, c'est sympa si on compte rester planté devant, l'heure ça permet de ne plus y penser. Évidemment, si on a la place, on met les deux.

Ensuite, l'estimation elle-même. On peut faire une extrapolation linéaire. Mais si on veut que ça s'adapte à des changements de vitesse, il faut garder trace des anciennes valeurs ? Toutes les minutes ? Ou bien on peut faire une régression linéaire pondérée pour moins cher.

Une régression linéaire, c'est des moyennes, variance, covariance. Calculer une moyenne partielle est très facile, une (co)variance à peine plus. Et avec ça on calcule la régression linéaire et on sait quand ça doit finir, 𝑟 nous dit si c'est précis.

Je laisse en exercice à mes lecteurs le calcul de la (co)variance d'une série avec un point de plus en fonction de la précédente. Attention cependant, si vous utilisez E(𝑋𝑌)−E(𝑋)E(𝑌) vous avez perdu, devinez pourquoi.

Comme ça, on peut faire une régression linéaire sur toutes les données. Ou alors on utilise une moyenne mobile exponentielle: 𝑋′=𝑘𝑋+(1-𝑘)𝑥, pour privilégier les dernières mesures.

Mais quel coefficient 𝑘 prendre ? Je propose exp(-5 temps depuis la dernière mesure / temps de réaction voulu). Si les mesures sont régulières, c'est une constante. Sinon, ça s'adapte automatiquement à l'irrégularité.

On pourra utiliser exp(-𝑥)≃1/(1+𝑥+𝑥²/2) pour éviter de faire trop chauffer la FPU pour pas grand chose.

Mais il y a un piège : une régression linéaire, ça peut surestimer ou sous-estimer en n'importe quel point, donc il est parfaitement possible qu'elle prédise qu'on est déjà arrivé. Heureusement, il est facile de l'éviter.

Il suffit de remplacer le point moyen par le point en cours dans la formule de la régression. Attention, dans toute la formule, y compris dans les (co)variances, pour avoir une vraie droite des moindres carrés passant par un point imposé.

Un petit point sur la précision : on n'a pas besoin de savoir la date si ça arrive dans quelques heures, on n'a pas besoin de savoir à la seconde près si ça arrive dans plusieurs jours. On peut donc ajuster la précision pour tenir dans un espace limité.

Avec seulement cinq variables numériques scalaires, on peut faire une estimation élégante avec une régression linéaire pondérée. J'espère qu'on verra progressivement moins d'extrapolations linéaires depuis le début ou l'avant-dernière mesure.

Voici quatre GIF animés montrant le comportement de cette méthode d'estimation sur des signaux aléatoires qui ralentissent au milieu :
[animation]
[animation]
[animation]
[animation]

Et voici le programme en JavaScript que j'ai utilisé pour générer ces animations (les instructions pour en faire des GIF animés sont dans le code source) : anim_regression.html