Prévoir la propagation d’ondes HF avec le machine learning.

Depuis juin 2017, je travaille sur un projet de prédiction de propagation des ondes HF pour les radioamateurs, disposant d’une base de données conséquente contenant des « dxspots » radioamateurs (un dxspot étant un contact radioamateur établi sur une fréquence donnée, celui ci est partagé sur un réseau mondial appelé dxcluster auquel tous les radioamateurs ont accès) et des infos de propagations NOAA (National Oceanic and athmospheric administration), j’ai mis au point une application de prévision  » CRX Météo radio » basée sur du machine learning, l’idée est assez proche de ce que l’on trouve en finance pour faire de prévision d’ailleurs j’ai pu lire un exemple développé avec cette librairie fait pour analyser des données financières.

J’ai pu expérimenter divers algorithmes d’intelligence artificielle/machine learning ML, au final j’en ai retenu 2.

Le premier est un algorithme basé sur du ML SVM qui permet aussi une régression de données non linéaires SVR, c’est avec lui que j’ai eu les meilleurs résultats, inconvénient il demande une phase d’apprentissage, qui dans mon cas prend plusieurs heures.

L’autre, plus simple appelé KNN (comme  K-nearest neighbors), peut être utilisé pour de la régression ou de la classification, même si il n’est pas parfait, il permet d’avoir un résultat calculé directement sans pré calcul par contre je ne l’a i pas mis ici par défaut car ses résultats sont moins bon qu’avec le 1er algorithme.

Voici un aperçu de l’application, dans un premier temps on rentre  la bande de fréquence ici 7 Mhz ou 40m, les données réels que l’on souhaite avoir à l’affichage en +de celle de l’IA, le continent source et destination puis l’algorithme à utiliser :

On peut alors lancer la prédiction.

Un autre exemple cette fois sur 80m 3.5Mhz donc, avec + de données, l’IA fait moins d’erreurs,
et on est très prêt d’une journée « réelle » :

Ici on a 6x plus de données ce qui est normal puisqu’il s’agit de contacts radios fait entre stations européennes.
Au passage on peut voir quels sont les horaires d’ouverture de la bande 80m.
C’est aussi un outil intéressant pour étudier la MUF (max usable frequency).

Enfin voici la même prédiction avec cette fois le 1er algorithme KNN, moins exhaustif,
mais qui d’un point de vue temps de calcul/résultat obtenu est imbattable :

Notez que pour les 2 algorithmes, lors de la phase d’apprentissage de l’algorithme SVR, je génère des fichiers de données sérialisées issues de la base de données des dxspots, ceux ci sont utilisés par les 2 algorithmes, l’avantage est que il n’y a pas de requêtes à faire en base au moment de la simulation, cela réduit aussi énormément le temps d’exécution.

Côté mathématique:

j’utilise pour l’instant un algorithme de ML par défaut à savoir :
– Epsilon-SVR (support vector regression) avec un kernel RBF (radial basis function).
– J’ai également ajouté dans la liste des algorithmes, l’algorithme KNN qui m’a permis d’obtenir de premiers résultats mais ce n’est pas lui le plus pertinent.

Côté données :

– Toutes les 3H : je récupère les données Kp, Ap, SF depuis le FTP NOAA celles-ci correspondent à l’activité volcanique du soleil ( tâches solaires entre autre ) ce qui influe la propagation des ondes sur terre, celle-ci peut avoir des impacts important sur le fonctionnement de nos satellites ou encore de nos téléphones par exemple c’est pour cela que l’activité solaire est très surveillée.

– Toutes les 48H : je génère un fichier d’apprentissage « pré calculé » pour chaque combinaison à savoir :
=>   { Continent source – Continent destination – Bande amateur ex 40M } , soit au final 540 fichiers !
=>   je redécoupe en 3 chaque info NOAA (étant émise toutes les 3H) pour avoir celle ci toutes les heures et non toutes les 3H ( ce qui me permet de sélectionner les spots dans tranche d’une heure avec des filtres par zones ITU en base de données ) c’est une sorte d’interpolation.

Ensuite quand vous cliquez sur le bouton prédire dans l’application « météo » : 

– Cela va utiliser ce fameux fichier pré calculé.

En plus de cela vous allez lancer une simulation avec :
-> les dernières valeurs NOAA existantes ( maximum il y a 3H ) et environ 6 mois de données NOAA.
-> Ces données de propagation vont ensuite être utilisées avec un modèle SVR/RBF.
-> Le résultat de l’IA pour la partie propagation et ensuite injectée dans l’autre  modèle SVR/RBF,
qui lui va déterminer le nombre de spots / heure sur une bande amateur HF données.

– Côté données cela va générer  :

Avec comme échantillons en X :    {  heure N,  indice Kp, indice Sf }
=> En sortie :  Y {  nombre de dxspots / heure }

L’heure sera ensuite simplement incrémentée sur les prochaines 24H, les 2 indices NOAA seront eux calculés
avec le modèle SVR/RBF temps réel, heure par heure.

Ainsi on obtiendra après injection dans le deuxième modèle SVR/RBF : le nombre de spots par heure pour les prochaines 24 heures.

Au final on peut dire que le modèle SVR le plus « lourd » est pré calculé toutes les 48H ce qui va bientôt changer du fait de l’amélioration que j’ai faite côté génération de statistiques des dxspots, il passera normalement à 24H peut être moins.

La propagation elle, tenant dans une petite table, côté base de données, j’ai préféré utiliser un modèle SVR/RBF « temps réel » c.a.d que la phase d’apprentissage se fait que vous cliquez sur le bouton « predict ».

Enfin pour le modèle SVR/RBF lourd, j’ai du réaliser énormément de tests, pour déterminer les paramètres de l’algorithme en gros :   Coût, degrés, gamma.

Voici ce que j’utilise :  ( pour les connaisseurs )

C : 900            ( biais bas, variance haute )
E : 0.00005        ( pénalisation de toutes les erreurs —> 0 )
G : 0.15        Je dirai que c’est le plus lourd en calcul par contre c’est très avantageux pour la qualité des résultats.

Pour l’algorithme KNN voici ce que j’utilise :

K : 7
LAMBDA : 32
DISTANCE : Algorithme Minkowski.

Pour le moment dans la phase de prédiction, seul l’indice Kp est calculé par le ML, pour le flux solaire SF, je garde la dernière valeur issue du rapport NOAA ( max 3H donc ) cette valeur ne va pas varier dans le temps lors de la simulation ( variation de 1 à 2 points à la journée environ ). Pour ce point je ne sais pas encore comment le gérer / l’implémenter.

Je compte améliorer l’algorithme et aussi l’efficacité de l’IA, l’idée est simple je vais générer lors de l’apprentissage 2 types de statistiques que je vais additionner :

1.   Nombre de DXSPOTS postés par des humains ce que je fais déjà avec la table spots de CRX reliée au réseau dxcluster mondial.

2.   Nombre de DXSPOTS postés automatiquement en reliant CRX au réseau RBN :  http://www.reversebeacon.net/
autrement dit des « SKIMMERS » sortent de robots qui envoient des DXSPOTS tout seul, ceux ci seront stockés dans une table à part et aussi lié à une VM dédiée avec une instance DXSPIDER.

C’est l’auteur de DXWATCH Felipe PY1NB qui m’a soumis l’idée et je dois dire que cela va permettre
d’avoir plus de spots, et donc une IA plus précise.

Cette application « météo » est disponible sur le site : https://ham.crx.cloud/  site WEB qui compose le « Cloud radioamateur » que j’ai créé (https://www.crx.cloud/) enfin le code est 100% open-source est disponible ici : https://git.crx.cloud/crx-php/crx-cloud-ham/tree/master/app-php/dxClusterAiReport

Voici une liste des documentations qui m’ont aidé :

Une super introduction sur la notion d’erreur/biais :
https://openclassrooms.com/fr/courses/4011851-initiez-vous-au-machine-learning/4092326-trouvez-le-bon-compromis-entre-biais-et-variance

Voici une petite doc de la librairie PHP utilisée :  ( notée que c’est un frontend pour libsvm )
https://php-ml.readthedocs.io/en/latest/machine-learning/classification/svc/

Pour le SVM/RBF, visuellement cela donne ceci ( voir photo de droite ) :
http://www.coxdocs.org/lib/exe/fetch.php?media=perseus:user:activities:matrixprocessing:learning:svm.png

Et aussi des documentations plus techniques qui m’ont apportées des infos https://en.wikipedia.org/wiki/Radial_basis_function_kernelhttps://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm
https://riptutorial.com/php/example/19397/classification-using-php-mlhttp://saedsayad.com/k_nearest_neighbors.htm
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4978658
http://eprints.maynoothuniversity.ie/7850/1/MC_Minkowski.pdf   ( Distance MINKOWSKI pour l’algorithme KNN )

73 à tous ,
A bientôt,

 

Démarrez une conversation