Bonjour tout le monde,
il s'agit de mon premier post sur ce forum, je ne suis pas mathématicien.
J'ai un problème à résoudre et je pense que c'est les mathématiques qui peuvent m'aider.
Je voudrais écrire un programme ou algo qui puisse me donner une suite de nombres répétitifs retrouvés dans un ensemble de nombres. Ces suites ne pourront pas être exactement identiques, par exemple: 4, 3, 5, 100, 3, 3, 5, 117, 4, 4, 5, 112, ...
Si l'algo peut me donner 4, 3, 5, 110 par exemple, ce serait parfait.
L'idée c'est de traiter un ensemble de nombres afin de trouver une suite plus ou moins identique et l'utiliser pour prédire le nombre suivant dans un nouvel ensemble de nombres.
Quel outil de mathématique, loi, théorème me permettrait de réaliser cela ?
Petite info qui peut avoir son importance, je ne suis pas mathématicien mais informaticien
En vous remerciant par avance
Bonjour ,
sans être sûr d'avoir compris ce que tu cherches à obtenir , tu pourrais à partir de la liste initiale créer une 2° liste de couples (chiffre, nombre d'apparitions) .
Ensuite il suffit d'exploiter (trier , ...) cette 2° liste .
Cordialement
Bonjour,
merci pour ta réponse.
Juste pour clarifier: j'ai un système qui génére des nombres (peu importe l'origine). Lorsque je fais un représentation graphique ou que je lis les nombres que j'ai enregistré dans un fichier, je vois qu'ils suivent toujours le même "schéma": eg. petit nombre, petit nombre, petit nombre, grand nombre. Ces nombres sont très rarement les mêmes mais ils sont relativement proches, ce qui fait que le schéma reste le même.
Je voudrais extraire ce 'schéma'.
L'utilisation que je veux en faire est pour détecter ce schéma dans un flux en temps réel et à partir de la périodicité de ce schéma dans le flux, anticiper/prévoir les prochains nombres.
fm_31, comment exploiter les statistiques (je suppose qu'on parle de densité dans la liste que tu proposes) pour extraire ce schéma ?
Bonjour,
comme la suite est "quasimemt presque périodique" par hypothèse, on peut imaginer effectuer une décomposition en série de Fourier (FFT) sur les échantillons obtenus
ensuite les suivants seront obtenus en extrapolant cette série de Fourier, à laquelle on ajouterait un bruit aléatoire vu qu'il est de toute façon illusoire de vouloir prédire les termes suivants d'une suite dont on ne connait pas à priori une expression mathématique.
Le quasiment périodique étant uniquement et rien que une hypothèse (j'aurais même envie d'ajouter "gratuite")
Des documents sur le "traitement numérique du signal" (transformée en z etc) pourraient aussi donner des idées exploitables... ?
Une solution très simple pour un informaticien, si la pseudo période est supposée constante :
En appelant n la longueur de la série traitée...
Pour periode = 1 à n/2
Extraire les sous-suites successives de longueur = periode
Calculer la sous-suite moyenne
Calculer l'écart-quadratique moyen des sous-suites (~ "distance" à la suite moyenne)
Sélectionner la "période optimale" qui donne le moindre écart
Afficher la suite moyenne correspondant à la période optimale
Afficher un ou plusieurs indicateurs de la qualité de l'ajustement (fluctuations) :
suite des écarts moyens à la suite moyenne
suite des écarts moyens relatif
affichage sur une courbe (suite moyenne + fluctuations)
En bonus : étudier un critère statistique qui diagnostiquerait si le schéma trouvé est significatif.
Autre bonus : étudier le critère qui hiérarchise au mieux les différentes périodes candidates...
... il y a peut-être mieux que le moindre écart quadratique, selon la nature du problème traité...
Bonjour mathafou,
je vais aller jeter un oeil du côté des transformées de Fourier. Je n'ai jamais utilisé cet outil, c'est l'occasion
Quand tu parles de 'bruit' aléatoire, qu'est ce que tu entend par là ?
Merci pour ta réponse.
Pour un contrôle en continu, il faut préciser si on observe toute la série à mesure qu'elle s'allonge, ou si on se limite par exemple à une longueur maximale et donc à une série "glissante".
Dans tous les cas, il est possible d'optimiser l'algorithme que j'ai proposé, dans le cadre d'une application à un processus continu. Pour cela, on stocke ce qu'il faut sur le calcul des critères utilisés, pour les adapter avec la dernière valeur connue. Ce qui évite de refaire une grande partie des calculs déjà réalisés.
que tu as "prédit" 4, 3, 5, 110
mais que ça aurait tout aussi bien pu être 3,6,5,109 ou absolument n'importe quoi de "proche"
et donc que tu peux ajouter à disons 5,5,5,110 une valeur aléatoire à chacun des 4 nombres indépendamment.
avec ton exemple ça sera tout aussi "pertinent".
On pourrait voir ce que je propose comme une sorte d'analyse de variance (ANOVA) pour chaque période envisagée, avec sélection de la période qui livre l'ANOVA la plus significative : moindre variance inter groupes par rapport à la variance intra groupes.
@mathafou: d'accord, j'ai compris. Merci !
@LeDino:
- mmh, je pense que le problème va être justement de déterminer cette période. Du coup, il va peut-être falloir utiliser la TF que propose mathafou, non ?
- est-ce que l'algorithme que tu proposes porte un nom ?
Bon, j'essaye de comprendre ta proposition mais je coince, c'est peut-être à cause du vocabulaire. Est-ce qu'on pourrait prendre un exemple ?
Désolé, j'étais en train d'éditer mon post pendant que ton exemple arrivait.
Je te remercie beaucoup d'avoir pris le temps de réaliser cet exemple.
Je regarde ...
Exemple, pour p=2 : on considère que la période est 2.
Donc la série devient une succession de séquences de longueur 2 :
4 3 5 100 3 3 5 117 4 4 5 112
4.3 est la moyenne de 4 5 3 5 4 5
56.5 est la moyenne de 3 100 3 117 4 112
La séquence moyenne qui en résulte sera : 4,3 56,5
... qu'on peut si l'on veut arrondir à : 4 57
On compare alors la série d'origine avec la série de répétition de la séquence qu'on vient de trouver.
4 3 5 100 3 3 5 117 4 4 5 112 (observé)
4 57 4 57 4 57 4 57 4 57 4 57 (modèle)
Si l'écart entre les deux séries (observé et modèle) est faible : l'ajustement est bon.
Au final : on sélectionne la meilleure période (p*) : celle qui offre le meilleur ajustement.
C'est comme ça que l'algorithme trouvera naturellement que p*=4 offre de loin le meilleur ajustement.
Merci encore pour ton exemple. Je comprend un peu mieux maintenant ton approche et je la trouve intéressante.
Il y a une chose qui m'échappe. ERR est la racine carrée de la moyenne de "écarts quadratiques". Comment as-tu calculé ces écarts quadratiques ?
Ton algorithme semble correct.
J'ai calculé la même erreur type que toi (1629) pour p=5.
Le terme technique en anglais est plutôt RMSE (Root Mean Square Error) ou RMSD (Root Mean Square Deviation).
Quand on prend chaque terme de la séquence pseudo périodique, on peut aussi analyser leurs fluctuations :
Séquence périodique 216327 1238 1385 1 387 1 386
Ecart type 3434 3 1 1 1
Ecart type relatif 1,6% 0,2% 0,1% 0,1% 0,1%
Si ton modèle est valable, et stable dans le temps... alors ces écart observés sur le passé sont à peu près représentatif de ce qu'il devraient être sur le futur (sauf si le processus évolue dans le temps... et là tout dépend de tes hypothèses).
Dans ce cas, reste à voir comment expliquer les fluctuations et leurs évolutions...
Obéissent-elles à une tendance ?
En particulier pour le premier terme qui est plus élevé et plus fluctuant.
---
Pour choisir p* parmi 5 et ses multiples :
Il faudrait "en principe" prendre la plus petite valeur de p.
C'est celle qui "consomme" le moins de degrés de libertés, donc c'est c'elle qui produira en principe le modèle le plus "robuste", c'est à dire le plus généralisable.
Lorsque tu prends p=10, tu introduis 10 paramètres dans ton modèle (les 10 valeurs moyennes qui constituent ta séquence périodique), alors que pour p=5 tu n'introduis que 5 paramètres (les 5 valeurs moyennes de la séquence périodique).
Il est donc techniquement normal de produire un "meilleur ajustement" avec 10 paramètres qu'avec 5.
Mais ce meilleur ajustement n'est que technique et n'a pas forcément de justification.
En modélisation on appelle ça un phénomène de "sur-apprentissage" ou "apprentissage par cœur".
Tout ça ce sont des considérations "générales" et c'est en fonction de ta connaissance du contexte que tu dois trancher, naturellement...
Pour sélectionner p* qui serait le plus petit p parmi ceux dont le RMSE est faible :
Trier les RMSE par valeur croissante.
Démarrer à k=2
Prendre les k premières valeurs de p.
Tant que leur PGDC est > 1 augmenter k.
Garder le plus petit p parmi ces valeurs.
J'ai passé un peu de temps à recogiter tout ça. Les maths, ça fait longtemps et c'est pas mon rayon Bref, j'ai refait tous les calculs, histoire de bien comprendre.
Je me suis rendu compte en relisant les posts que je n'ai pas donné le contexte du problème.
Sur un système, je mesure l'intervalle de temps entre deux interruptions (même interruption) et je stocke ces valeurs dans un petit tableau de 8 valeurs (ça pourrait être un peu plus). A un instant donné, j'ai besoin d'estimer quand va se produire la prochaine interruption afin de déterminer combien de temps il me reste avant celle-ci. En fonction, du temps qu'il me reste j'effectue une opération ou pas.
Une mauvaise prédiction ou une bonne prédiction n'a pas d'impact sur les intervalles suivants et n'a pas de conséquences désastreuses. Une suite continue de mauvaises prédictions provoquera une baisse des performances du système et une augmentation de sa consommation d'énérgie. Nous sommes ici dans un cas de "best effort".
Jusqu'ici, l'algo que j'ai utilisé, mesure tout simplement la moyenne de ces intervalles et ça fonctionne plus ou moins bien. Je pense si l'algo pouvait intégrer la détection des patterns répétitifs alors le nombre de bonnes prédictions serait plus important avec des conséquences très positives pour le système.
Cependant, nous sommes dans le noyau, donc il y a des contraintes d'utilisation mémoire et de rapidité d'execution très fortes. Ce qui m'inquiete c'est la lourdeur de l'algo de détection de répétition.
Bonjour,
S'il est important que l'algorithme soit très économique et que tu penses qu'il y a une période fiable et que ce qui t'intéresse c'est en fait une prédiction "binaire" du type "si le prochain Tprévu est supérieur à un seuil Tmin, alors je lance un calcul qui se glissera dans l'intervalle"... alors tu peux simplifier le processus de détection.
Tu as une suite de temps Tk.
Lorsqu'arrive un nouveau terme Tn+1 de cette suite, tu remontes la suite en arrière terme à terme et tu repères le dernier terme > Tmin (qu'on appelera un "pic"). Tu notes DERP le Dernier Ecart de Rang à un Pic. Et ensuite tu regardes si ce DERP constitue une période plausible. Simplement en observant si les termes espacés de DERP sont en majorité des pics.
L'algorithme est super simplifiable. Même pas besoin de faire une recherche pour calculer DERP : il se calculera par incrément à chaque nouveau terme Tk (Dès que se présente un pic, tu réinitialises DERP à 0 pour le T suivant)...
Et tu peux calculer le nombre de pics effectivement trouvés sur les N dernières périodes de longueur DERP. Si ce nombre dépasse un taux (par exemple 90%), tu décides qu'il s'agit bien d'une période et donc qu'il est intéressant de prédire un pic. En prime, dès que le processus est suffisamment avancé, tu aura une trace de la période repérée par l'algorithme. Tu peux alors décider de l'utiliser sans la recalculer si tu es certain de sa stabilité.
Tout ça est à régler en prototypant.
Mais c'est ce qu'on peut imaginer de plus simple d'après les informations que tu donnes.
Le point clé ici, c'est la régularité de la période.
Si tu en es certain, cet algorithme élémentaire doit fonctionner facilement et efficacement.
Si la période peut "bouger", il faut imaginer une variante du genre : y a t-il un pic dans la série à période DERP plus ou moins un rang, par exemple... Et même sans ça, l'intérêt de l'algorithme proposé c'est qu'il est capable de corriger la période au fil du temps, si celle-ci passe d'une valeur à une autre. A creuser un peu, mais avec une pondération et en ne conservant que les termes les plus récents de la suite, tu peux avoir quelque chose qui s'adapte tout seul... A paramétrer et tester, bien sûr...
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :