<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Franz-maximilien+ceron</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Franz-maximilien+ceron"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Franz-maximilien_ceron"/>
	<updated>2026-05-21T07:47:17Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15022</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15022"/>
		<updated>2023-05-26T13:31:54Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
Ces limites sont ces paramètres:&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe se qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;L&#039;axe des abscisses est le temps et celui des ordonnées le pourcentage d&#039;humidité&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15021</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15021"/>
		<updated>2023-05-26T13:31:25Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
Ces limites sont ces paramètres:&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;L&#039;axe des abscisses est le temps et celui des ordonnées le pourcentage d&#039;humidité&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe se qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15020</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15020"/>
		<updated>2023-05-26T13:31:12Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
Ces limites sont ces paramètres:&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe se qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15019</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15019"/>
		<updated>2023-05-26T13:30:59Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
Ces limites sont ces paramètres:&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;L&#039;axe des abscisses est le temps et celui des ordonnées le pourcentage d&#039;humidité&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe se qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Comment_lancer_un_serveur_Kafka&amp;diff=15018</id>
		<title>Comment lancer un serveur Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Comment_lancer_un_serveur_Kafka&amp;diff=15018"/>
		<updated>2023-05-26T13:23:17Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lancement d&#039;un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Dans cette page nous verrons comment lancer un serveur Kafka. J&#039;utiliserais ici une installation Kafka 2.13-3.4.0 sur une machine Windows 10.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les commandes pour les machines sous Linux sont presques similaires: par exmeple nos fichiers ne seront pas en .bat mains en .sh&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans toute la suite de cette page, on considère que l&#039;archive contenant les fichiers serveurs sont dans un fichier &#039;kafka&#039; dont la chemin est C:\Tool.&lt;br /&gt;
&lt;br /&gt;
Nous ouvrirons alors des invites de commandes dans le répertoire courants suivants:&lt;br /&gt;
&lt;br /&gt;
: C:\Tool\kafka\bin\windows&lt;br /&gt;
&lt;br /&gt;
==Lancement d&#039;un serveur Zoookeeeper==&lt;br /&gt;
&lt;br /&gt;
Pour lancer un serveur Zookeeper, il suffit d&#039;exécuter la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: zookeeper-server-start.bat ..\..\config\zookeeper.properties&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;arrêter, faire la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: zookeeper-server-stop.bat&lt;br /&gt;
&lt;br /&gt;
==Lancement d&#039;un serveur Kafka==&lt;br /&gt;
&lt;br /&gt;
Pour lancer un serveur Kafka, il suffit d&#039;exécuter la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: kafka-server-start.bat ..\..\config\server.properties&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;arrêter, faire la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: kafka-server-stop.bat&lt;br /&gt;
&lt;br /&gt;
==Recommendation==&lt;br /&gt;
&lt;br /&gt;
Il faut d&#039;abord lancer le serveur Zookeeper, puis Kafka. Et pour éteindre les services, on éffectue l&#039;extinction dans le sens inverse: d&#039;abords Kafka puis Zookeeper.&lt;br /&gt;
&lt;br /&gt;
Si vous voulez lancer de multiples serveurs, il est alors conseillé de créer des copies des fichiers en .properties en changeant les paramètres.&lt;br /&gt;
&lt;br /&gt;
==Commandes utiles==&lt;br /&gt;
&lt;br /&gt;
Dans cette parties, nous verrons des commandes simples pour l&#039;installation d&#039;un service Kafka.&lt;br /&gt;
&lt;br /&gt;
===Topic===&lt;br /&gt;
&lt;br /&gt;
Commande pour créer un topic:&lt;br /&gt;
&lt;br /&gt;
: kafka-topics.bat --create --topic NomTopic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1&lt;br /&gt;
&lt;br /&gt;
Commande pour lister tous les topics:&lt;br /&gt;
&lt;br /&gt;
: kafka-topics.bat --bootstrap-serveur=localhost:9092 --list&lt;br /&gt;
&lt;br /&gt;
Commande pour lister tous les partitions d&#039;un topic:&lt;br /&gt;
&lt;br /&gt;
: kafka-topics.bat --bootstrap-serveur=localhost:9092 --describe --topic NomTopic&lt;br /&gt;
&lt;br /&gt;
Commande pour supprimer un  topic:&lt;br /&gt;
&lt;br /&gt;
: kafka-topics.bat --bootstrap-serveur=localhost:9092 --delete --topic NomTopic&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039;: &#039;&#039;La suppression est désactivée par défaut, il faut rajouter dans le fichier de configuration la ligne suivante:&amp;lt;br&amp;gt;delete.topic.enable=true&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Création d&#039;un Producer===&lt;br /&gt;
&lt;br /&gt;
Pour créer un producer qui enverra des données dans un topic voulu, il faut exécuter la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: kafka-console-producer.bat --broker-list localhost:9092 --topic NomTopic&lt;br /&gt;
&lt;br /&gt;
===Création d&#039;un Consumer===&lt;br /&gt;
&lt;br /&gt;
Pour créer un consumer qui lira des données dans un topic voulu, il faut exécuter la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic NomTopic&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15017</id>
		<title>Code de base pour la détection d anomalies</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15017"/>
		<updated>2023-05-26T13:16:42Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Code important */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dans cette page vous trouverez le code de base pour le producer, et le consumer de détection d&#039;erreurs ainsi que pour l&#039;affichage des données.&lt;br /&gt;
&lt;br /&gt;
=Code du producer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_producer_code.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import serial&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
import time&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
## Création d&#039;un fichier pour sauvegarder les données issues du capteur (optionel)&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Paramètre de la carte Arduino et de  l&#039;ip du serveur Kafka&lt;br /&gt;
portArduino = &amp;quot;COM3&amp;quot;&lt;br /&gt;
adresseKafka = &#039;localhost:9092&#039;&lt;br /&gt;
&lt;br /&gt;
##Fonction pour permettre et récupérer le nom du topic ainsi que la valeur (!dépend des données envoyées par la carte Arduino)&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return topic,valeur&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec la carte Arduino&lt;br /&gt;
serial_port = serial.Serial(port = portArduino, baudrate = 9600)&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec le sreveur Kafka&lt;br /&gt;
producer = KafkaProducer(bootstrap_servers=adresseKafka)&lt;br /&gt;
&lt;br /&gt;
## On boucle à l&#039;infini pour transmettre continuellement des données&lt;br /&gt;
while True:&lt;br /&gt;
    # Récupération de la donnée issue de la carte Arduino&lt;br /&gt;
    msg = serial_port.readline()&lt;br /&gt;
&lt;br /&gt;
    # convertit le msg de l&#039;ARDUINO en chaine de caractères&lt;br /&gt;
    msg = msg.decode(&#039;utf-8&#039;)[:-2] # enlève les \r\n&lt;br /&gt;
    # Récupération du temps pour la sauvegarde dans un fichier externe (optionel)&lt;br /&gt;
    temp = time.time()&lt;br /&gt;
    donnee = (msg, temp)&lt;br /&gt;
    print(msg)&lt;br /&gt;
&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    topic,message = separateur_serial(msg)&lt;br /&gt;
    # print(topic,message)&lt;br /&gt;
&lt;br /&gt;
    # convertit le message en bytes&lt;br /&gt;
    message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
    #envoie de la donnée sur le serveur Kafka&lt;br /&gt;
    producer.send(topic, message_bytes)&lt;br /&gt;
&lt;br /&gt;
## code pour fermeture du producer&lt;br /&gt;
## producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code important==&lt;br /&gt;
&lt;br /&gt;
Importation de la bibliothèquue Kafka Python&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet l&#039;envoie d&#039;un message à un topic nommé, il est conseillé de d&#039;abord convertir le message en bytes ou en JSON&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
message = &#039;Bonjour&#039;&lt;br /&gt;
topic = &#039;NomPartition&#039;&lt;br /&gt;
&lt;br /&gt;
message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
producer.send(topic, message_bytes )&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Permet la fermeture du producer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code du consumer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_ConsumerErreur.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Bibliotheque&lt;br /&gt;
from kafka import KafkaConsumer&lt;br /&gt;
from kafka.structs import TopicPartition&lt;br /&gt;
&lt;br /&gt;
from sklearn.ensemble import IsolationForest&lt;br /&gt;
import pandas as pd&lt;br /&gt;
&lt;br /&gt;
from sklearn.cluster import DBSCAN&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
import pickle&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Fonction pour convertir une liste en DataFrame&lt;br /&gt;
def convert_list_database(liste):&lt;br /&gt;
    tableau = []&lt;br /&gt;
    for i in range(len(liste)-1):&lt;br /&gt;
        tableau.append(liste[i])&lt;br /&gt;
    # return tableau&lt;br /&gt;
    return pd.DataFrame(tableau, columns=[&#039;c1&#039;])&lt;br /&gt;
&lt;br /&gt;
## Variable&lt;br /&gt;
nomTopic = &#039;humidite&#039;&lt;br /&gt;
bootstrap_servers = &#039;localhost:9092&#039;&lt;br /&gt;
topic = TopicPartition(nomTopic, 0)&lt;br /&gt;
&lt;br /&gt;
## Programme&lt;br /&gt;
## Création d&#039;un consumer&lt;br /&gt;
consumer = KafkaConsumer(bootstrap_servers = bootstrap_servers)&lt;br /&gt;
&lt;br /&gt;
## Assignation au topic que l&#039;on va lire&lt;br /&gt;
consumer.assign([topic])&lt;br /&gt;
&lt;br /&gt;
## Permet d&#039;aller à la fin de la partition&lt;br /&gt;
consumer.poll()&lt;br /&gt;
consumer.seek_to_end(topic)&lt;br /&gt;
&lt;br /&gt;
## Création de la FILE&lt;br /&gt;
taille_File = 20 +1&lt;br /&gt;
file = []&lt;br /&gt;
&lt;br /&gt;
## Boucle des messages&lt;br /&gt;
for msg in consumer:&lt;br /&gt;
    ## Décodage du message, ici en UTF-8&lt;br /&gt;
    msg = msg.value.decode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    ##Partie detection&lt;br /&gt;
&lt;br /&gt;
    ## Partie de détection d&#039;erreur&lt;br /&gt;
    if len(file) &amp;gt; taille_File:&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        file.pop(0)&lt;br /&gt;
&lt;br /&gt;
        print(&amp;quot;Erreur ?&amp;quot;)&lt;br /&gt;
        #etat allant de -1 à 1&lt;br /&gt;
&lt;br /&gt;
	## on met ci-dessous la fonction de détection d&#039;anomalies&lt;br /&gt;
        etat = detectionAnomaly(file, taille_File)&lt;br /&gt;
&lt;br /&gt;
    ## Partie d&#039;initialisation&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Initialisation&amp;quot;, round(len(file)/taille_File,2)) # Pourcentage ?&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        # etat 2 correspond à l&#039;initialisation&lt;br /&gt;
        etat = -2&lt;br /&gt;
&lt;br /&gt;
    ## Partie pour sauvegarder les erreurs dans un fichiers externes (optionnel)&lt;br /&gt;
    temps = time.time()&lt;br /&gt;
    valeur = msg&lt;br /&gt;
&lt;br /&gt;
    donnee = (valeur,temps,etat)&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    ## Aller à la fin de la partition&lt;br /&gt;
    consumer.poll()&lt;br /&gt;
    consumer.seek_to_end(topic)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code important==&lt;br /&gt;
&lt;br /&gt;
Importation des bibliothèques Kafka Python&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from kafka import KafkaConsumer&lt;br /&gt;
from kafka.structs import TopicPartition&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un consumer ainsi que son asignation à sa partition&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nomTopic = UnNomDeTopic&lt;br /&gt;
bootstrap_servers = AdresseIP:Port&lt;br /&gt;
numPartition = LeNuméroDeLaPartition&lt;br /&gt;
partition= TopicPartition(nomTopic, numPartition)&lt;br /&gt;
&lt;br /&gt;
consumer = KafkaConsumer(bootstrap_servers = bootstrap_servers)&lt;br /&gt;
consumer.assign([partition])&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se rendre à la fin de la partition&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
consumer.poll()&lt;br /&gt;
consumer.seek_to_end(partition)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lecture de la partition, attention on a une boucle for mais elle a le comportement d&#039;une boucle while. Si vous avez encodé votre message alors la première chose à faire est de le décoder.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
for msg in consumer:&lt;br /&gt;
    &lt;br /&gt;
    msg = msg.value.decode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fermeture d&#039;un consumer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
consumer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code pour affichage du résultat de notre code=&lt;br /&gt;
&lt;br /&gt;
Attention cette affichage est pour ce projet. Adapté le pour votre projet selon vos bases de données.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_SHOW_DATA_RESULT.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
##Fonction pour mise en forme des données&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
## variable contenant tous les fichiers avec les données&lt;br /&gt;
fichier_reference = &amp;quot;saveLISTEDONNEE.txt&amp;quot;&lt;br /&gt;
fichier1 = &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;&lt;br /&gt;
fichier2 = &amp;quot;saveLISTEDONNEE_ISOLATION.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##imporation des fichiers précédants&lt;br /&gt;
data_ref = pickle.load( open( fichier_reference, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_DBSCAN = pickle.load( open( fichier1, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_ISOLATION = pickle.load( open( fichier2, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
##Affichage des nombres de mesures contenues dans les fichiers respectifs&lt;br /&gt;
print(&amp;quot;DATA ref = &amp;quot;,len(data_ref))&lt;br /&gt;
print(&amp;quot;DATA DBSCAN = &amp;quot;,len(data_DBSCAN))&lt;br /&gt;
print(&amp;quot;DATA ISOLATION = &amp;quot;,len(data_ISOLATION))&lt;br /&gt;
&lt;br /&gt;
def modification_dataREF(data):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Remise en forme de notre base de référence&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dataBis = []&lt;br /&gt;
    for elt in data:&lt;br /&gt;
        valeur = separateur_serial(elt[0], separateur =&amp;quot;!&amp;quot;)&lt;br /&gt;
        donnee = (valeur,elt[1])&lt;br /&gt;
        dataBis.append(donnee)&lt;br /&gt;
    return dataBis&lt;br /&gt;
&lt;br /&gt;
## Affichage avec plt des données&lt;br /&gt;
data_ref = modification_dataREF(data_ref)&lt;br /&gt;
# base de référence&lt;br /&gt;
y = [float(elt[0]) for elt in data_ref]&lt;br /&gt;
x = [float(elt[1]) for elt in data_ref]&lt;br /&gt;
plt.plot(x,y,color = &amp;quot;blue&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#DBSCAN&lt;br /&gt;
for elt in data_DBSCAN:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;red&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#Isolation Forest&lt;br /&gt;
for elt in data_ISOLATION:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;green&amp;quot;)&lt;br /&gt;
# Remarque&lt;br /&gt;
# si elt[1] == 2 alors on est en itialisation&lt;br /&gt;
# si elt[1] == -1 alors on est en anomalie&lt;br /&gt;
&lt;br /&gt;
## Affichage des données&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15016</id>
		<title>Code de base pour la détection d anomalies</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15016"/>
		<updated>2023-05-26T13:13:21Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Code important */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dans cette page vous trouverez le code de base pour le producer, et le consumer de détection d&#039;erreurs ainsi que pour l&#039;affichage des données.&lt;br /&gt;
&lt;br /&gt;
=Code du producer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_producer_code.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import serial&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
import time&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
## Création d&#039;un fichier pour sauvegarder les données issues du capteur (optionel)&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Paramètre de la carte Arduino et de  l&#039;ip du serveur Kafka&lt;br /&gt;
portArduino = &amp;quot;COM3&amp;quot;&lt;br /&gt;
adresseKafka = &#039;localhost:9092&#039;&lt;br /&gt;
&lt;br /&gt;
##Fonction pour permettre et récupérer le nom du topic ainsi que la valeur (!dépend des données envoyées par la carte Arduino)&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return topic,valeur&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec la carte Arduino&lt;br /&gt;
serial_port = serial.Serial(port = portArduino, baudrate = 9600)&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec le sreveur Kafka&lt;br /&gt;
producer = KafkaProducer(bootstrap_servers=adresseKafka)&lt;br /&gt;
&lt;br /&gt;
## On boucle à l&#039;infini pour transmettre continuellement des données&lt;br /&gt;
while True:&lt;br /&gt;
    # Récupération de la donnée issue de la carte Arduino&lt;br /&gt;
    msg = serial_port.readline()&lt;br /&gt;
&lt;br /&gt;
    # convertit le msg de l&#039;ARDUINO en chaine de caractères&lt;br /&gt;
    msg = msg.decode(&#039;utf-8&#039;)[:-2] # enlève les \r\n&lt;br /&gt;
    # Récupération du temps pour la sauvegarde dans un fichier externe (optionel)&lt;br /&gt;
    temp = time.time()&lt;br /&gt;
    donnee = (msg, temp)&lt;br /&gt;
    print(msg)&lt;br /&gt;
&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    topic,message = separateur_serial(msg)&lt;br /&gt;
    # print(topic,message)&lt;br /&gt;
&lt;br /&gt;
    # convertit le message en bytes&lt;br /&gt;
    message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
    #envoie de la donnée sur le serveur Kafka&lt;br /&gt;
    producer.send(topic, message_bytes)&lt;br /&gt;
&lt;br /&gt;
## code pour fermeture du producer&lt;br /&gt;
## producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code important==&lt;br /&gt;
&lt;br /&gt;
Importation de la bibliothèquue Kafka Python&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet l&#039;envoie d&#039;un message à un topic nommé, il est conseillé de d&#039;abord convertir le message en bytes ou en JSON&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
message = &#039;Bonjour&#039;&lt;br /&gt;
topic = &#039;NomPartition&#039;&lt;br /&gt;
&lt;br /&gt;
message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
producer.send(topic, message_bytes )&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Permet la fermeture du producer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code du consumer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_ConsumerErreur.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Bibliotheque&lt;br /&gt;
from kafka import KafkaConsumer&lt;br /&gt;
from kafka.structs import TopicPartition&lt;br /&gt;
&lt;br /&gt;
from sklearn.ensemble import IsolationForest&lt;br /&gt;
import pandas as pd&lt;br /&gt;
&lt;br /&gt;
from sklearn.cluster import DBSCAN&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
import pickle&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Fonction pour convertir une liste en DataFrame&lt;br /&gt;
def convert_list_database(liste):&lt;br /&gt;
    tableau = []&lt;br /&gt;
    for i in range(len(liste)-1):&lt;br /&gt;
        tableau.append(liste[i])&lt;br /&gt;
    # return tableau&lt;br /&gt;
    return pd.DataFrame(tableau, columns=[&#039;c1&#039;])&lt;br /&gt;
&lt;br /&gt;
## Variable&lt;br /&gt;
nomTopic = &#039;humidite&#039;&lt;br /&gt;
bootstrap_servers = &#039;localhost:9092&#039;&lt;br /&gt;
topic = TopicPartition(nomTopic, 0)&lt;br /&gt;
&lt;br /&gt;
## Programme&lt;br /&gt;
## Création d&#039;un consumer&lt;br /&gt;
consumer = KafkaConsumer(bootstrap_servers = bootstrap_servers)&lt;br /&gt;
&lt;br /&gt;
## Assignation au topic que l&#039;on va lire&lt;br /&gt;
consumer.assign([topic])&lt;br /&gt;
&lt;br /&gt;
## Permet d&#039;aller à la fin de la partition&lt;br /&gt;
consumer.poll()&lt;br /&gt;
consumer.seek_to_end(topic)&lt;br /&gt;
&lt;br /&gt;
## Création de la FILE&lt;br /&gt;
taille_File = 20 +1&lt;br /&gt;
file = []&lt;br /&gt;
&lt;br /&gt;
## Boucle des messages&lt;br /&gt;
for msg in consumer:&lt;br /&gt;
    ## Décodage du message, ici en UTF-8&lt;br /&gt;
    msg = msg.value.decode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    ##Partie detection&lt;br /&gt;
&lt;br /&gt;
    ## Partie de détection d&#039;erreur&lt;br /&gt;
    if len(file) &amp;gt; taille_File:&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        file.pop(0)&lt;br /&gt;
&lt;br /&gt;
        print(&amp;quot;Erreur ?&amp;quot;)&lt;br /&gt;
        #etat allant de -1 à 1&lt;br /&gt;
&lt;br /&gt;
	## on met ci-dessous la fonction de détection d&#039;anomalies&lt;br /&gt;
        etat = detectionAnomaly(file, taille_File)&lt;br /&gt;
&lt;br /&gt;
    ## Partie d&#039;initialisation&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Initialisation&amp;quot;, round(len(file)/taille_File,2)) # Pourcentage ?&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        # etat 2 correspond à l&#039;initialisation&lt;br /&gt;
        etat = -2&lt;br /&gt;
&lt;br /&gt;
    ## Partie pour sauvegarder les erreurs dans un fichiers externes (optionnel)&lt;br /&gt;
    temps = time.time()&lt;br /&gt;
    valeur = msg&lt;br /&gt;
&lt;br /&gt;
    donnee = (valeur,temps,etat)&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    ## Aller à la fin de la partition&lt;br /&gt;
    consumer.poll()&lt;br /&gt;
    consumer.seek_to_end(topic)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code important==&lt;br /&gt;
&lt;br /&gt;
Importation des bibliothèques Kafka Python&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from kafka import KafkaConsumer&lt;br /&gt;
from kafka.structs import TopicPartition&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un consumer ainsi que son asignation à sa partition&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nomTopic = UnNomDeTopic&lt;br /&gt;
bootstrap_servers = AdresseIP:Port&lt;br /&gt;
numPartition = LeNuméroDeLaPartition&lt;br /&gt;
partition= TopicPartition(nomTopic, numPartition)&lt;br /&gt;
&lt;br /&gt;
consumer = KafkaConsumer(bootstrap_servers = bootstrap_servers)&lt;br /&gt;
consumer.assign([partition])&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se rendre à la fin de la partition&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
consumer.poll()&lt;br /&gt;
consumer.seek_to_end(numPartition)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lecture de la partition, attention on a une boucle for mais elle a le comportement d&#039;une boucle while. Si vous avez encodé votre message alors la première chose à faire est de le décoder.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
for msg in consumer:&lt;br /&gt;
    &lt;br /&gt;
    msg = msg.value.decode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fermeture d&#039;un consumer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
consumer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code pour affichage du résultat de notre code=&lt;br /&gt;
&lt;br /&gt;
Attention cette affichage est pour ce projet. Adapté le pour votre projet selon vos bases de données.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_SHOW_DATA_RESULT.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
##Fonction pour mise en forme des données&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
## variable contenant tous les fichiers avec les données&lt;br /&gt;
fichier_reference = &amp;quot;saveLISTEDONNEE.txt&amp;quot;&lt;br /&gt;
fichier1 = &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;&lt;br /&gt;
fichier2 = &amp;quot;saveLISTEDONNEE_ISOLATION.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##imporation des fichiers précédants&lt;br /&gt;
data_ref = pickle.load( open( fichier_reference, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_DBSCAN = pickle.load( open( fichier1, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_ISOLATION = pickle.load( open( fichier2, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
##Affichage des nombres de mesures contenues dans les fichiers respectifs&lt;br /&gt;
print(&amp;quot;DATA ref = &amp;quot;,len(data_ref))&lt;br /&gt;
print(&amp;quot;DATA DBSCAN = &amp;quot;,len(data_DBSCAN))&lt;br /&gt;
print(&amp;quot;DATA ISOLATION = &amp;quot;,len(data_ISOLATION))&lt;br /&gt;
&lt;br /&gt;
def modification_dataREF(data):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Remise en forme de notre base de référence&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dataBis = []&lt;br /&gt;
    for elt in data:&lt;br /&gt;
        valeur = separateur_serial(elt[0], separateur =&amp;quot;!&amp;quot;)&lt;br /&gt;
        donnee = (valeur,elt[1])&lt;br /&gt;
        dataBis.append(donnee)&lt;br /&gt;
    return dataBis&lt;br /&gt;
&lt;br /&gt;
## Affichage avec plt des données&lt;br /&gt;
data_ref = modification_dataREF(data_ref)&lt;br /&gt;
# base de référence&lt;br /&gt;
y = [float(elt[0]) for elt in data_ref]&lt;br /&gt;
x = [float(elt[1]) for elt in data_ref]&lt;br /&gt;
plt.plot(x,y,color = &amp;quot;blue&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#DBSCAN&lt;br /&gt;
for elt in data_DBSCAN:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;red&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#Isolation Forest&lt;br /&gt;
for elt in data_ISOLATION:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;green&amp;quot;)&lt;br /&gt;
# Remarque&lt;br /&gt;
# si elt[1] == 2 alors on est en itialisation&lt;br /&gt;
# si elt[1] == -1 alors on est en anomalie&lt;br /&gt;
&lt;br /&gt;
## Affichage des données&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15015</id>
		<title>Code de base pour la détection d anomalies</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15015"/>
		<updated>2023-05-26T13:12:40Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Code du consumer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dans cette page vous trouverez le code de base pour le producer, et le consumer de détection d&#039;erreurs ainsi que pour l&#039;affichage des données.&lt;br /&gt;
&lt;br /&gt;
=Code du producer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_producer_code.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import serial&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
import time&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
## Création d&#039;un fichier pour sauvegarder les données issues du capteur (optionel)&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Paramètre de la carte Arduino et de  l&#039;ip du serveur Kafka&lt;br /&gt;
portArduino = &amp;quot;COM3&amp;quot;&lt;br /&gt;
adresseKafka = &#039;localhost:9092&#039;&lt;br /&gt;
&lt;br /&gt;
##Fonction pour permettre et récupérer le nom du topic ainsi que la valeur (!dépend des données envoyées par la carte Arduino)&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return topic,valeur&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec la carte Arduino&lt;br /&gt;
serial_port = serial.Serial(port = portArduino, baudrate = 9600)&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec le sreveur Kafka&lt;br /&gt;
producer = KafkaProducer(bootstrap_servers=adresseKafka)&lt;br /&gt;
&lt;br /&gt;
## On boucle à l&#039;infini pour transmettre continuellement des données&lt;br /&gt;
while True:&lt;br /&gt;
    # Récupération de la donnée issue de la carte Arduino&lt;br /&gt;
    msg = serial_port.readline()&lt;br /&gt;
&lt;br /&gt;
    # convertit le msg de l&#039;ARDUINO en chaine de caractères&lt;br /&gt;
    msg = msg.decode(&#039;utf-8&#039;)[:-2] # enlève les \r\n&lt;br /&gt;
    # Récupération du temps pour la sauvegarde dans un fichier externe (optionel)&lt;br /&gt;
    temp = time.time()&lt;br /&gt;
    donnee = (msg, temp)&lt;br /&gt;
    print(msg)&lt;br /&gt;
&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    topic,message = separateur_serial(msg)&lt;br /&gt;
    # print(topic,message)&lt;br /&gt;
&lt;br /&gt;
    # convertit le message en bytes&lt;br /&gt;
    message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
    #envoie de la donnée sur le serveur Kafka&lt;br /&gt;
    producer.send(topic, message_bytes)&lt;br /&gt;
&lt;br /&gt;
## code pour fermeture du producer&lt;br /&gt;
## producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code important==&lt;br /&gt;
&lt;br /&gt;
Importation de la bibliothèquue Kafka Python&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet l&#039;envoie d&#039;un message à un topic nommé, il est conseillé de d&#039;abord convertir le message en bytes ou en JSON&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
message = &#039;Bonjour&#039;&lt;br /&gt;
&lt;br /&gt;
message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
producer.send(topic, message_bytes )&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Permet la fermeture du producer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code du consumer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_ConsumerErreur.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Bibliotheque&lt;br /&gt;
from kafka import KafkaConsumer&lt;br /&gt;
from kafka.structs import TopicPartition&lt;br /&gt;
&lt;br /&gt;
from sklearn.ensemble import IsolationForest&lt;br /&gt;
import pandas as pd&lt;br /&gt;
&lt;br /&gt;
from sklearn.cluster import DBSCAN&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
import pickle&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Fonction pour convertir une liste en DataFrame&lt;br /&gt;
def convert_list_database(liste):&lt;br /&gt;
    tableau = []&lt;br /&gt;
    for i in range(len(liste)-1):&lt;br /&gt;
        tableau.append(liste[i])&lt;br /&gt;
    # return tableau&lt;br /&gt;
    return pd.DataFrame(tableau, columns=[&#039;c1&#039;])&lt;br /&gt;
&lt;br /&gt;
## Variable&lt;br /&gt;
nomTopic = &#039;humidite&#039;&lt;br /&gt;
bootstrap_servers = &#039;localhost:9092&#039;&lt;br /&gt;
topic = TopicPartition(nomTopic, 0)&lt;br /&gt;
&lt;br /&gt;
## Programme&lt;br /&gt;
## Création d&#039;un consumer&lt;br /&gt;
consumer = KafkaConsumer(bootstrap_servers = bootstrap_servers)&lt;br /&gt;
&lt;br /&gt;
## Assignation au topic que l&#039;on va lire&lt;br /&gt;
consumer.assign([topic])&lt;br /&gt;
&lt;br /&gt;
## Permet d&#039;aller à la fin de la partition&lt;br /&gt;
consumer.poll()&lt;br /&gt;
consumer.seek_to_end(topic)&lt;br /&gt;
&lt;br /&gt;
## Création de la FILE&lt;br /&gt;
taille_File = 20 +1&lt;br /&gt;
file = []&lt;br /&gt;
&lt;br /&gt;
## Boucle des messages&lt;br /&gt;
for msg in consumer:&lt;br /&gt;
    ## Décodage du message, ici en UTF-8&lt;br /&gt;
    msg = msg.value.decode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    ##Partie detection&lt;br /&gt;
&lt;br /&gt;
    ## Partie de détection d&#039;erreur&lt;br /&gt;
    if len(file) &amp;gt; taille_File:&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        file.pop(0)&lt;br /&gt;
&lt;br /&gt;
        print(&amp;quot;Erreur ?&amp;quot;)&lt;br /&gt;
        #etat allant de -1 à 1&lt;br /&gt;
&lt;br /&gt;
	## on met ci-dessous la fonction de détection d&#039;anomalies&lt;br /&gt;
        etat = detectionAnomaly(file, taille_File)&lt;br /&gt;
&lt;br /&gt;
    ## Partie d&#039;initialisation&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Initialisation&amp;quot;, round(len(file)/taille_File,2)) # Pourcentage ?&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        # etat 2 correspond à l&#039;initialisation&lt;br /&gt;
        etat = -2&lt;br /&gt;
&lt;br /&gt;
    ## Partie pour sauvegarder les erreurs dans un fichiers externes (optionnel)&lt;br /&gt;
    temps = time.time()&lt;br /&gt;
    valeur = msg&lt;br /&gt;
&lt;br /&gt;
    donnee = (valeur,temps,etat)&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    ## Aller à la fin de la partition&lt;br /&gt;
    consumer.poll()&lt;br /&gt;
    consumer.seek_to_end(topic)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code important==&lt;br /&gt;
&lt;br /&gt;
Importation des bibliothèques Kafka Python&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from kafka import KafkaConsumer&lt;br /&gt;
from kafka.structs import TopicPartition&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un consumer ainsi que son asignation à sa partition&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nomTopic = UnNomDeTopic&lt;br /&gt;
bootstrap_servers = AdresseIP:Port&lt;br /&gt;
numPartition = LeNuméroDeLaPartition&lt;br /&gt;
partition= TopicPartition(nomTopic, numPartition)&lt;br /&gt;
&lt;br /&gt;
consumer = KafkaConsumer(bootstrap_servers = bootstrap_servers)&lt;br /&gt;
consumer.assign([partition])&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se rendre à la fin de la partition&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
consumer.poll()&lt;br /&gt;
consumer.seek_to_end(numPartition)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lecture de la partition, attention on a une boucle for mais elle a le comportement d&#039;une boucle while. Si vous avez encodé votre message alors la première chose à faire est de le décoder.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
for msg in consumer:&lt;br /&gt;
    &lt;br /&gt;
    msg = msg.value.decode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fermeture d&#039;un consumer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
consumer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code pour affichage du résultat de notre code=&lt;br /&gt;
&lt;br /&gt;
Attention cette affichage est pour ce projet. Adapté le pour votre projet selon vos bases de données.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_SHOW_DATA_RESULT.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
##Fonction pour mise en forme des données&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
## variable contenant tous les fichiers avec les données&lt;br /&gt;
fichier_reference = &amp;quot;saveLISTEDONNEE.txt&amp;quot;&lt;br /&gt;
fichier1 = &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;&lt;br /&gt;
fichier2 = &amp;quot;saveLISTEDONNEE_ISOLATION.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##imporation des fichiers précédants&lt;br /&gt;
data_ref = pickle.load( open( fichier_reference, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_DBSCAN = pickle.load( open( fichier1, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_ISOLATION = pickle.load( open( fichier2, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
##Affichage des nombres de mesures contenues dans les fichiers respectifs&lt;br /&gt;
print(&amp;quot;DATA ref = &amp;quot;,len(data_ref))&lt;br /&gt;
print(&amp;quot;DATA DBSCAN = &amp;quot;,len(data_DBSCAN))&lt;br /&gt;
print(&amp;quot;DATA ISOLATION = &amp;quot;,len(data_ISOLATION))&lt;br /&gt;
&lt;br /&gt;
def modification_dataREF(data):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Remise en forme de notre base de référence&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dataBis = []&lt;br /&gt;
    for elt in data:&lt;br /&gt;
        valeur = separateur_serial(elt[0], separateur =&amp;quot;!&amp;quot;)&lt;br /&gt;
        donnee = (valeur,elt[1])&lt;br /&gt;
        dataBis.append(donnee)&lt;br /&gt;
    return dataBis&lt;br /&gt;
&lt;br /&gt;
## Affichage avec plt des données&lt;br /&gt;
data_ref = modification_dataREF(data_ref)&lt;br /&gt;
# base de référence&lt;br /&gt;
y = [float(elt[0]) for elt in data_ref]&lt;br /&gt;
x = [float(elt[1]) for elt in data_ref]&lt;br /&gt;
plt.plot(x,y,color = &amp;quot;blue&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#DBSCAN&lt;br /&gt;
for elt in data_DBSCAN:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;red&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#Isolation Forest&lt;br /&gt;
for elt in data_ISOLATION:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;green&amp;quot;)&lt;br /&gt;
# Remarque&lt;br /&gt;
# si elt[1] == 2 alors on est en itialisation&lt;br /&gt;
# si elt[1] == -1 alors on est en anomalie&lt;br /&gt;
&lt;br /&gt;
## Affichage des données&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15014</id>
		<title>Code de base pour la détection d anomalies</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15014"/>
		<updated>2023-05-26T13:06:24Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dans cette page vous trouverez le code de base pour le producer, et le consumer de détection d&#039;erreurs ainsi que pour l&#039;affichage des données.&lt;br /&gt;
&lt;br /&gt;
=Code du producer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_producer_code.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import serial&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
import time&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
## Création d&#039;un fichier pour sauvegarder les données issues du capteur (optionel)&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Paramètre de la carte Arduino et de  l&#039;ip du serveur Kafka&lt;br /&gt;
portArduino = &amp;quot;COM3&amp;quot;&lt;br /&gt;
adresseKafka = &#039;localhost:9092&#039;&lt;br /&gt;
&lt;br /&gt;
##Fonction pour permettre et récupérer le nom du topic ainsi que la valeur (!dépend des données envoyées par la carte Arduino)&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return topic,valeur&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec la carte Arduino&lt;br /&gt;
serial_port = serial.Serial(port = portArduino, baudrate = 9600)&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec le sreveur Kafka&lt;br /&gt;
producer = KafkaProducer(bootstrap_servers=adresseKafka)&lt;br /&gt;
&lt;br /&gt;
## On boucle à l&#039;infini pour transmettre continuellement des données&lt;br /&gt;
while True:&lt;br /&gt;
    # Récupération de la donnée issue de la carte Arduino&lt;br /&gt;
    msg = serial_port.readline()&lt;br /&gt;
&lt;br /&gt;
    # convertit le msg de l&#039;ARDUINO en chaine de caractères&lt;br /&gt;
    msg = msg.decode(&#039;utf-8&#039;)[:-2] # enlève les \r\n&lt;br /&gt;
    # Récupération du temps pour la sauvegarde dans un fichier externe (optionel)&lt;br /&gt;
    temp = time.time()&lt;br /&gt;
    donnee = (msg, temp)&lt;br /&gt;
    print(msg)&lt;br /&gt;
&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    topic,message = separateur_serial(msg)&lt;br /&gt;
    # print(topic,message)&lt;br /&gt;
&lt;br /&gt;
    # convertit le message en bytes&lt;br /&gt;
    message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
    #envoie de la donnée sur le serveur Kafka&lt;br /&gt;
    producer.send(topic, message_bytes)&lt;br /&gt;
&lt;br /&gt;
## code pour fermeture du producer&lt;br /&gt;
## producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code important==&lt;br /&gt;
&lt;br /&gt;
Importation de la bibliothèquue Kafka Python&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet l&#039;envoie d&#039;un message à un topic nommé, il est conseillé de d&#039;abord convertir le message en bytes ou en JSON&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
message = &#039;Bonjour&#039;&lt;br /&gt;
&lt;br /&gt;
message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
producer.send(topic, message_bytes )&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Permet la fermeture du producer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code du consumer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_ConsumerErreur.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Bibliotheque&lt;br /&gt;
from kafka import KafkaConsumer&lt;br /&gt;
from kafka.structs import TopicPartition&lt;br /&gt;
&lt;br /&gt;
from sklearn.ensemble import IsolationForest&lt;br /&gt;
import pandas as pd&lt;br /&gt;
&lt;br /&gt;
from sklearn.cluster import DBSCAN&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
import pickle&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Fonction pour convertir une liste en DataFrame&lt;br /&gt;
def convert_list_database(liste):&lt;br /&gt;
    tableau = []&lt;br /&gt;
    for i in range(len(liste)-1):&lt;br /&gt;
        tableau.append(liste[i])&lt;br /&gt;
    # return tableau&lt;br /&gt;
    return pd.DataFrame(tableau, columns=[&#039;c1&#039;])&lt;br /&gt;
&lt;br /&gt;
## Variable&lt;br /&gt;
nomTopic = &#039;humidite&#039;&lt;br /&gt;
bootstrap_servers = &#039;localhost:9092&#039;&lt;br /&gt;
topic = TopicPartition(nomTopic, 0)&lt;br /&gt;
&lt;br /&gt;
## Programme&lt;br /&gt;
## Création d&#039;un consumer&lt;br /&gt;
consumer = KafkaConsumer(bootstrap_servers = bootstrap_servers)&lt;br /&gt;
&lt;br /&gt;
## Assignation au topic que l&#039;on va lire&lt;br /&gt;
consumer.assign([topic])&lt;br /&gt;
&lt;br /&gt;
## Permet d&#039;aller à la fin de la partition&lt;br /&gt;
consumer.poll()&lt;br /&gt;
consumer.seek_to_end(topic)&lt;br /&gt;
&lt;br /&gt;
## Création de la FILE&lt;br /&gt;
taille_File = 20 +1&lt;br /&gt;
file = []&lt;br /&gt;
&lt;br /&gt;
## Boucle des messages&lt;br /&gt;
for msg in consumer:&lt;br /&gt;
    ## Décodage du message, ici en UTF-8&lt;br /&gt;
    msg = msg.value.decode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    ##Partie detection&lt;br /&gt;
&lt;br /&gt;
    ## Partie de détection d&#039;erreur&lt;br /&gt;
    if len(file) &amp;gt; taille_File:&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        file.pop(0)&lt;br /&gt;
&lt;br /&gt;
        print(&amp;quot;Erreur ?&amp;quot;)&lt;br /&gt;
        #etat allant de -1 à 1&lt;br /&gt;
&lt;br /&gt;
	## on met ci-dessous la fonction de détection d&#039;anomalies&lt;br /&gt;
        etat = detectionAnomaly(file, taille_File)&lt;br /&gt;
&lt;br /&gt;
    ## Partie d&#039;initialisation&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Initialisation&amp;quot;, round(len(file)/taille_File,2)) # Pourcentage ?&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        # etat 2 correspond à l&#039;initialisation&lt;br /&gt;
        etat = -2&lt;br /&gt;
&lt;br /&gt;
    ## Partie pour sauvegarder les erreurs dans un fichiers externes (optionnel)&lt;br /&gt;
    temps = time.time()&lt;br /&gt;
    valeur = msg&lt;br /&gt;
&lt;br /&gt;
    donnee = (valeur,temps,etat)&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    ## Aller à la fin de la partition&lt;br /&gt;
    consumer.poll()&lt;br /&gt;
    consumer.seek_to_end(topic)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code important==&lt;br /&gt;
&lt;br /&gt;
Importation de la bibliothèquue Kafka Python&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code pour affichage du résultat de notre code=&lt;br /&gt;
&lt;br /&gt;
Attention cette affichage est pour ce projet. Adapté le pour votre projet selon vos bases de données.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_SHOW_DATA_RESULT.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
##Fonction pour mise en forme des données&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
## variable contenant tous les fichiers avec les données&lt;br /&gt;
fichier_reference = &amp;quot;saveLISTEDONNEE.txt&amp;quot;&lt;br /&gt;
fichier1 = &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;&lt;br /&gt;
fichier2 = &amp;quot;saveLISTEDONNEE_ISOLATION.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##imporation des fichiers précédants&lt;br /&gt;
data_ref = pickle.load( open( fichier_reference, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_DBSCAN = pickle.load( open( fichier1, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_ISOLATION = pickle.load( open( fichier2, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
##Affichage des nombres de mesures contenues dans les fichiers respectifs&lt;br /&gt;
print(&amp;quot;DATA ref = &amp;quot;,len(data_ref))&lt;br /&gt;
print(&amp;quot;DATA DBSCAN = &amp;quot;,len(data_DBSCAN))&lt;br /&gt;
print(&amp;quot;DATA ISOLATION = &amp;quot;,len(data_ISOLATION))&lt;br /&gt;
&lt;br /&gt;
def modification_dataREF(data):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Remise en forme de notre base de référence&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dataBis = []&lt;br /&gt;
    for elt in data:&lt;br /&gt;
        valeur = separateur_serial(elt[0], separateur =&amp;quot;!&amp;quot;)&lt;br /&gt;
        donnee = (valeur,elt[1])&lt;br /&gt;
        dataBis.append(donnee)&lt;br /&gt;
    return dataBis&lt;br /&gt;
&lt;br /&gt;
## Affichage avec plt des données&lt;br /&gt;
data_ref = modification_dataREF(data_ref)&lt;br /&gt;
# base de référence&lt;br /&gt;
y = [float(elt[0]) for elt in data_ref]&lt;br /&gt;
x = [float(elt[1]) for elt in data_ref]&lt;br /&gt;
plt.plot(x,y,color = &amp;quot;blue&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#DBSCAN&lt;br /&gt;
for elt in data_DBSCAN:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;red&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#Isolation Forest&lt;br /&gt;
for elt in data_ISOLATION:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;green&amp;quot;)&lt;br /&gt;
# Remarque&lt;br /&gt;
# si elt[1] == 2 alors on est en itialisation&lt;br /&gt;
# si elt[1] == -1 alors on est en anomalie&lt;br /&gt;
&lt;br /&gt;
## Affichage des données&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15013</id>
		<title>Code de base pour la détection d anomalies</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Code_de_base_pour_la_d%C3%A9tection_d_anomalies&amp;diff=15013"/>
		<updated>2023-05-26T13:05:33Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Code du producer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dans cette page vous trouverez le code de base pour le producer, et le consumer de détection d&#039;erreurs ainsi que pour l&#039;affichage des données.&lt;br /&gt;
&lt;br /&gt;
=Code du producer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_producer_code.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import serial&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
import time&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
## Création d&#039;un fichier pour sauvegarder les données issues du capteur (optionel)&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Paramètre de la carte Arduino et de  l&#039;ip du serveur Kafka&lt;br /&gt;
portArduino = &amp;quot;COM3&amp;quot;&lt;br /&gt;
adresseKafka = &#039;localhost:9092&#039;&lt;br /&gt;
&lt;br /&gt;
##Fonction pour permettre et récupérer le nom du topic ainsi que la valeur (!dépend des données envoyées par la carte Arduino)&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return topic,valeur&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec la carte Arduino&lt;br /&gt;
serial_port = serial.Serial(port = portArduino, baudrate = 9600)&lt;br /&gt;
&lt;br /&gt;
## Initialisation de la connection avec le sreveur Kafka&lt;br /&gt;
producer = KafkaProducer(bootstrap_servers=adresseKafka)&lt;br /&gt;
&lt;br /&gt;
## On boucle à l&#039;infini pour transmettre continuellement des données&lt;br /&gt;
while True:&lt;br /&gt;
    # Récupération de la donnée issue de la carte Arduino&lt;br /&gt;
    msg = serial_port.readline()&lt;br /&gt;
&lt;br /&gt;
    # convertit le msg de l&#039;ARDUINO en chaine de caractères&lt;br /&gt;
    msg = msg.decode(&#039;utf-8&#039;)[:-2] # enlève les \r\n&lt;br /&gt;
    # Récupération du temps pour la sauvegarde dans un fichier externe (optionel)&lt;br /&gt;
    temp = time.time()&lt;br /&gt;
    donnee = (msg, temp)&lt;br /&gt;
    print(msg)&lt;br /&gt;
&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    topic,message = separateur_serial(msg)&lt;br /&gt;
    # print(topic,message)&lt;br /&gt;
&lt;br /&gt;
    # convertit le message en bytes&lt;br /&gt;
    message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
    #envoie de la donnée sur le serveur Kafka&lt;br /&gt;
    producer.send(topic, message_bytes)&lt;br /&gt;
&lt;br /&gt;
## code pour fermeture du producer&lt;br /&gt;
## producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Code important==&lt;br /&gt;
&lt;br /&gt;
Importation de la bibliothèquue Kafka Python&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
from kafka import KafkaProducer&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permet l&#039;envoie d&#039;un message à un topic nommé, il est conseillé de d&#039;abord convertir le message en bytes ou en JSON&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
message = &#039;Bonjour&#039;&lt;br /&gt;
&lt;br /&gt;
message_bytes = bytes(message, &#039;utf-8&#039;)&lt;br /&gt;
&lt;br /&gt;
producer.send(topic, message_bytes )&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Permet la fermeture du producer&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
producer.close()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code du consumer=&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_ConsumerErreur.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Bibliotheque&lt;br /&gt;
from kafka import KafkaConsumer&lt;br /&gt;
from kafka.structs import TopicPartition&lt;br /&gt;
&lt;br /&gt;
from sklearn.ensemble import IsolationForest&lt;br /&gt;
import pandas as pd&lt;br /&gt;
&lt;br /&gt;
from sklearn.cluster import DBSCAN&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
import pickle&lt;br /&gt;
listeDonnee = []&lt;br /&gt;
pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
## Fonction pour convertir une liste en DataFrame&lt;br /&gt;
def convert_list_database(liste):&lt;br /&gt;
    tableau = []&lt;br /&gt;
    for i in range(len(liste)-1):&lt;br /&gt;
        tableau.append(liste[i])&lt;br /&gt;
    # return tableau&lt;br /&gt;
    return pd.DataFrame(tableau, columns=[&#039;c1&#039;])&lt;br /&gt;
&lt;br /&gt;
## Variable&lt;br /&gt;
nomTopic = &#039;humidite&#039;&lt;br /&gt;
bootstrap_servers = &#039;localhost:9092&#039;&lt;br /&gt;
topic = TopicPartition(nomTopic, 0)&lt;br /&gt;
&lt;br /&gt;
## Programme&lt;br /&gt;
## Création d&#039;un consumer&lt;br /&gt;
consumer = KafkaConsumer(bootstrap_servers = bootstrap_servers)&lt;br /&gt;
&lt;br /&gt;
## Assignation au topic que l&#039;on va lire&lt;br /&gt;
consumer.assign([topic])&lt;br /&gt;
&lt;br /&gt;
## Permet d&#039;aller à la fin de la partition&lt;br /&gt;
consumer.poll()&lt;br /&gt;
consumer.seek_to_end(topic)&lt;br /&gt;
&lt;br /&gt;
## Création de la FILE&lt;br /&gt;
taille_File = 20 +1&lt;br /&gt;
file = []&lt;br /&gt;
&lt;br /&gt;
## Boucle des messages&lt;br /&gt;
for msg in consumer:&lt;br /&gt;
    ## Décodage du message, ici en UTF-8&lt;br /&gt;
    msg = msg.value.decode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    ##Partie detection&lt;br /&gt;
&lt;br /&gt;
    ## Partie de détection d&#039;erreur&lt;br /&gt;
    if len(file) &amp;gt; taille_File:&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        file.pop(0)&lt;br /&gt;
&lt;br /&gt;
        print(&amp;quot;Erreur ?&amp;quot;)&lt;br /&gt;
        #etat allant de -1 à 1&lt;br /&gt;
&lt;br /&gt;
	## on met ci-dessous la fonction de détection d&#039;anomalies&lt;br /&gt;
        etat = detectionAnomaly(file, taille_File)&lt;br /&gt;
&lt;br /&gt;
    ## Partie d&#039;initialisation&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Initialisation&amp;quot;, round(len(file)/taille_File,2)) # Pourcentage ?&lt;br /&gt;
        file.append(msg)&lt;br /&gt;
        # etat 2 correspond à l&#039;initialisation&lt;br /&gt;
        etat = -2&lt;br /&gt;
&lt;br /&gt;
    ## Partie pour sauvegarder les erreurs dans un fichiers externes (optionnel)&lt;br /&gt;
    temps = time.time()&lt;br /&gt;
    valeur = msg&lt;br /&gt;
&lt;br /&gt;
    donnee = (valeur,temps,etat)&lt;br /&gt;
    # sauvegarde des données dans un fichier de sauvegarde !consomme du temps si le fichier est trop grand&lt;br /&gt;
    listeDonnee = pickle.load( open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
    listeDonnee.append(donnee)&lt;br /&gt;
    pickle.dump( listeDonnee, open( &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;, &amp;quot;wb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
    ## Aller à la fin de la partition&lt;br /&gt;
    consumer.poll()&lt;br /&gt;
    consumer.seek_to_end(topic)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Code pour affichage du résultat de notre code=&lt;br /&gt;
&lt;br /&gt;
Attention cette affichage est pour ce projet. Adapté le pour votre projet selon vos bases de données.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Fichier:CFM_SHOW_DATA_RESULT.pdf Code en pdf]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
## Importation des bibliothèques&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import pickle&lt;br /&gt;
&lt;br /&gt;
##Fonction pour mise en forme des données&lt;br /&gt;
def separateur_serial(chaine, separateur =&amp;quot;!&amp;quot;):&lt;br /&gt;
    indice = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range (len(chaine) -1, -1 , -1):&lt;br /&gt;
        if chaine[i] == separateur:&lt;br /&gt;
            indice = i&lt;br /&gt;
            break&lt;br /&gt;
    topic = chaine[:indice]&lt;br /&gt;
    valeur = chaine[indice +1:]&lt;br /&gt;
    return valeur&lt;br /&gt;
&lt;br /&gt;
## variable contenant tous les fichiers avec les données&lt;br /&gt;
fichier_reference = &amp;quot;saveLISTEDONNEE.txt&amp;quot;&lt;br /&gt;
fichier1 = &amp;quot;saveLISTEDONNEE_DBSCAN.txt&amp;quot;&lt;br /&gt;
fichier2 = &amp;quot;saveLISTEDONNEE_ISOLATION.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
##imporation des fichiers précédants&lt;br /&gt;
data_ref = pickle.load( open( fichier_reference, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_DBSCAN = pickle.load( open( fichier1, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
data_ISOLATION = pickle.load( open( fichier2, &amp;quot;rb&amp;quot; ) )&lt;br /&gt;
&lt;br /&gt;
##Affichage des nombres de mesures contenues dans les fichiers respectifs&lt;br /&gt;
print(&amp;quot;DATA ref = &amp;quot;,len(data_ref))&lt;br /&gt;
print(&amp;quot;DATA DBSCAN = &amp;quot;,len(data_DBSCAN))&lt;br /&gt;
print(&amp;quot;DATA ISOLATION = &amp;quot;,len(data_ISOLATION))&lt;br /&gt;
&lt;br /&gt;
def modification_dataREF(data):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Remise en forme de notre base de référence&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    dataBis = []&lt;br /&gt;
    for elt in data:&lt;br /&gt;
        valeur = separateur_serial(elt[0], separateur =&amp;quot;!&amp;quot;)&lt;br /&gt;
        donnee = (valeur,elt[1])&lt;br /&gt;
        dataBis.append(donnee)&lt;br /&gt;
    return dataBis&lt;br /&gt;
&lt;br /&gt;
## Affichage avec plt des données&lt;br /&gt;
data_ref = modification_dataREF(data_ref)&lt;br /&gt;
# base de référence&lt;br /&gt;
y = [float(elt[0]) for elt in data_ref]&lt;br /&gt;
x = [float(elt[1]) for elt in data_ref]&lt;br /&gt;
plt.plot(x,y,color = &amp;quot;blue&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#DBSCAN&lt;br /&gt;
for elt in data_DBSCAN:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;red&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#Isolation Forest&lt;br /&gt;
for elt in data_ISOLATION:&lt;br /&gt;
    if elt[2] == 2:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;k&amp;quot;)&lt;br /&gt;
    elif elt[2] == -1:&lt;br /&gt;
        plt.axvline(x=elt[1],color=&amp;quot;green&amp;quot;)&lt;br /&gt;
# Remarque&lt;br /&gt;
# si elt[1] == 2 alors on est en itialisation&lt;br /&gt;
# si elt[1] == -1 alors on est en anomalie&lt;br /&gt;
&lt;br /&gt;
## Affichage des données&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15012</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15012"/>
		<updated>2023-05-26T12:57:51Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Cas anormal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
Ces limites sont ces paramètres:&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe se qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15011</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15011"/>
		<updated>2023-05-26T12:57:14Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
Ces limites sont ces paramètres:&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe se qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15010</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15010"/>
		<updated>2023-05-26T12:56:27Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Limites de DBSCAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
Ces limites sont ces paramètres:&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15009</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15009"/>
		<updated>2023-05-26T12:55:54Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Limites d&amp;#039;Isolation Forest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15008</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15008"/>
		<updated>2023-05-26T12:55:37Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Limites d&amp;#039;Isolation Forest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15007</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15007"/>
		<updated>2023-05-26T12:55:20Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Limites d&amp;#039;Isolation Forest */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15006</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15006"/>
		<updated>2023-05-26T12:52:47Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies ou nécessiteront sinon des paramètres qui dépendront de la situation. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15005</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15005"/>
		<updated>2023-05-26T12:50:54Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Démarche pour la détection d’anomalies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15004</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15004"/>
		<updated>2023-05-26T12:50:22Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Limite des deux algorithmes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15003</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15003"/>
		<updated>2023-05-26T12:50:15Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Rechherche d&amp;#039;anomalies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit un dérèglement de notre graphe en bleu&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sur la figure ci-dessus, nous voyons que nos données ne sont pas stables, ce qui a été détecter comme anomalie par nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Ici on voit non plus un dérèglement mais plusieurs&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le ce cas, nos programmes peuvent détecter la première variation mais n&#039;indiquent cependant pas les autres. En effet la File est alors &amp;quot;parasitée&amp;quot; par des données anormales, il devient alors plus compliqué voire impossible de détecter d&#039;autres variations.&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;On est différent de l&#039;état initiale mais ce n&#039;est pas une anomalies ?&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce dernier cas, nous sommes d&#039;abors dans une situation stable puis survint une variation qui estt détecter puis nos données redeviennent stables. Cependant les données finales sont différents que celles de débuts, ne devraient-elles pas être considérées comme des anomalies ? Ce comportement est du à la File qui possède une taille fixe et qui se remplie de nouveaux éléments continuellement. Au final si l&#039;erreur devient constante alors elle se transforme une donnée normal.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15002</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15002"/>
		<updated>2023-05-26T12:40:28Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Phase d&amp;#039;initialisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation, sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
===Rechherche d&#039;anomalies===&lt;br /&gt;
&lt;br /&gt;
====Cas normal====&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
&lt;br /&gt;
====Cas anormal====&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
&lt;br /&gt;
====Cas d&#039;un surplus d&#039;anomalies====&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15001</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15001"/>
		<updated>2023-05-26T12:39:00Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Vous pouvez voir que le graphe bleu n&#039;est pas constant donc normalement une anomalie&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation. Sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15000</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=15000"/>
		<updated>2023-05-26T12:37:48Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une (petite) différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous verrons les cas particuliers de nos programmes:&lt;br /&gt;
&lt;br /&gt;
===Phase d&#039;initialisation===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
&lt;br /&gt;
La figure ci-dessus représente la partie d&#039;initialisation. Sur cette période toutes les anomalies ne seront pas détectés car on remplira pour la première fois notre File.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14999</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14999"/>
		<updated>2023-05-26T12:35:00Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ensuite on peut représenter nos données sous forme d&#039;un graphe ce qui donne la figure suivante:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On superpose au graphique précédant des barres verticales qui auront chacune leur particularités:&lt;br /&gt;
: En noir les données de l&#039;initialisation&lt;br /&gt;
: En rouge les anomalies détectées par DBSCAN&lt;br /&gt;
: En vert celles détectées par Isolation Forest&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14998</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14998"/>
		<updated>2023-05-26T12:32:08Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
On peut déjà voir que sur toutes les mesures du capteurs, seulement une partie a été analysé (à peu près la moitié). On voit également une différence de vitesse entre nos deux algorithmes.&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14997</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14997"/>
		<updated>2023-05-26T12:29:44Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
Dans un premiers temps, vous pouvez voir ci-dessous sur quel ensemble nous a fourni notre montage sur environ une trentaine de minutes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_3.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_4.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_5.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_6.png|center]]&lt;br /&gt;
[[Fichier:CFM_humidite_7.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14996</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14996"/>
		<updated>2023-05-26T12:27:55Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_3.png]]&lt;br /&gt;
[[Fichier:CFM_humidite_4.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_5.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_6.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_7.PNG]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_3.png&amp;diff=14995</id>
		<title>Fichier:CFM humidite 3.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_3.png&amp;diff=14995"/>
		<updated>2023-05-26T12:27:18Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : Franz-maximilien ceron a téléversé une nouvelle version de Fichier:CFM humidite 3.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14994</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14994"/>
		<updated>2023-05-26T12:26:52Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_2.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_3.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_4.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_5.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_6.PNG]]&lt;br /&gt;
[[Fichier:CFM_humidite_7.PNG]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14993</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14993"/>
		<updated>2023-05-26T12:26:30Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.PNG]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14992</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14992"/>
		<updated>2023-05-26T12:25:56Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_humidite_1.png]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_7.png&amp;diff=14991</id>
		<title>Fichier:CFM humidite 7.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_7.png&amp;diff=14991"/>
		<updated>2023-05-26T12:25:41Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_6.png&amp;diff=14990</id>
		<title>Fichier:CFM humidite 6.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_6.png&amp;diff=14990"/>
		<updated>2023-05-26T12:25:31Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_5.png&amp;diff=14989</id>
		<title>Fichier:CFM humidite 5.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_5.png&amp;diff=14989"/>
		<updated>2023-05-26T12:25:22Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_4.png&amp;diff=14988</id>
		<title>Fichier:CFM humidite 4.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_4.png&amp;diff=14988"/>
		<updated>2023-05-26T12:25:15Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_3.png&amp;diff=14987</id>
		<title>Fichier:CFM humidite 3.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_3.png&amp;diff=14987"/>
		<updated>2023-05-26T12:25:07Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_2.PNG&amp;diff=14986</id>
		<title>Fichier:CFM humidite 2.PNG</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_2.PNG&amp;diff=14986"/>
		<updated>2023-05-26T12:25:00Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_1.PNG&amp;diff=14985</id>
		<title>Fichier:CFM humidite 1.PNG</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_humidite_1.PNG&amp;diff=14985"/>
		<updated>2023-05-26T12:24:49Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14984</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14984"/>
		<updated>2023-05-26T12:16:51Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Test de notre montage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
Pour tester le fonctionnement de nos algorithmes de détections d&#039;erreurs, nous avons fait le montage suivant:&lt;br /&gt;
&lt;br /&gt;
Un capteur d&#039;humidité relié à une carte ARDUINO qui sera notre producer.&lt;br /&gt;
&lt;br /&gt;
Un ordinateur qui sera l&#039;hébergeur de notre serveur Kafka&lt;br /&gt;
&lt;br /&gt;
Un consumer qui sera un script Python avec nos algorithmes.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14983</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14983"/>
		<updated>2023-05-26T12:13:34Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Test de notre montage==&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Comment_lancer_un_serveur_Kafka&amp;diff=14982</id>
		<title>Comment lancer un serveur Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Comment_lancer_un_serveur_Kafka&amp;diff=14982"/>
		<updated>2023-05-26T12:12:05Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Topic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Lancement d&#039;un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Dans cette page nous verrons comment lancer un serveur Kafka. J&#039;utiliserais ici une installation Kafka 2.13-3.4.0 sur une machine Windows 10.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les commandes pour les machines sous Linux sont presques similaires: par exmeple nos fichiers ne seront pas en .bat mains en .sh&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans toute la suite de cette page, on considère que l&#039;archive contenant les fichiers serveurs sont dans un fichier &#039;kafka&#039; dont la chemin est C:\Tool.&lt;br /&gt;
&lt;br /&gt;
Nous ouvrirons alors des invites de commandes dans le répertoire courants suivants:&lt;br /&gt;
&lt;br /&gt;
: C:\Tool\kafka\bin\windows&lt;br /&gt;
&lt;br /&gt;
==Lancement d&#039;un serveur Zoookeeeper==&lt;br /&gt;
&lt;br /&gt;
Pour lancer un serveur Zookeeper, il suffit d&#039;exécuter la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: zookeeper-server-start.bat ..\..\config\zookeeper.properties&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;arrêter, faire la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: zookeeper-server-stop.bat&lt;br /&gt;
&lt;br /&gt;
==Lancement d&#039;un serveur Kafka==&lt;br /&gt;
&lt;br /&gt;
Pour lancer un serveur Kafka, il suffit d&#039;exécuter la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: kafka-server-start.bat ..\..\config\server.properties&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;arrêter, faire la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: kafka-server-stop.bat&lt;br /&gt;
&lt;br /&gt;
==Recommendation==&lt;br /&gt;
&lt;br /&gt;
Il faut d&#039;abord lancer le serveur Zookeeper, puis Kafka. Et pour éteindre les services, on éffectue l&#039;extinction dans le sens inverse: d&#039;abords Kafka puis Zookeeper.&lt;br /&gt;
&lt;br /&gt;
Si vous voulez lancer de multiples serveurs, il est alors conseillé de créer des copies des fichiers en .properties en changeant les paramètres.&lt;br /&gt;
&lt;br /&gt;
==Commandes utiles==&lt;br /&gt;
&lt;br /&gt;
Dans cette parties, nous verrons des commandes simples pour l&#039;installation d&#039;un service Kafka.&lt;br /&gt;
&lt;br /&gt;
===Topic===&lt;br /&gt;
&lt;br /&gt;
Commande pour créer un topic:&lt;br /&gt;
&lt;br /&gt;
: kafka-topics.bat --create --topic NomTopic --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1&lt;br /&gt;
&lt;br /&gt;
Commande pour lister tous les topics:&lt;br /&gt;
&lt;br /&gt;
: kafka-topics.bat --bootstrap-serveur=localhost:9092 --list&lt;br /&gt;
&lt;br /&gt;
Commande pour lister tous les partitions d&#039;un topic:&lt;br /&gt;
&lt;br /&gt;
: kafka-topics.bat --bootstrap-serveur=localhost:9092 --describe --topic NomTopic&lt;br /&gt;
&lt;br /&gt;
Commande pour supprimer un  topic:&lt;br /&gt;
&lt;br /&gt;
: kafka-topics.bat --bootstrap-serveur=localhost:9092 --delete --topic NomTopic&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039;: &#039;&#039;La suppression est désactivée par défaut, il faut rajouter dans le fichier de configuration la ligne suivante:&amp;lt;br&amp;gt;delete.topic.enable=true&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Création d&#039;un Producer==&lt;br /&gt;
&lt;br /&gt;
Pour créer un producer qui enverra des données dans un topic voulu, il faut exécuter la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: kafka-console-producer.bat --broker-list localhost:9092 --topic NomTopic&lt;br /&gt;
&lt;br /&gt;
==Création d&#039;un Consumer==&lt;br /&gt;
&lt;br /&gt;
Pour créer un consumer qui lira des données dans un topic voulu, il faut exécuter la commande suivante:&lt;br /&gt;
&lt;br /&gt;
: kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic NomTopic&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14981</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14981"/>
		<updated>2023-05-26T12:08:16Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Limites de DBSCAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans cet exemple, nous allons représenter le fonctionnement de l&#039;algorithme DBSCAN à l&#039;aide d&#039;un ensemble de points, un ε arbitraire ainsi qu&#039;un N de 2.&lt;br /&gt;
&lt;br /&gt;
En premier, nous allons représenter toutes les sphères d&#039;influences de tailles ε.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous sélectionnons aléatoirement un point et nous regardons si il possède des voisins permettant la création d&#039;un cluster.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Tous les points qui satisfont la condition de N alors peuvent à leurs tours &amp;quot;propager&amp;quot; le cluster jusqu&#039;à insatisfaction des conditions initiales.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on ne peut plus propager le cluster alors on répète la première étape avec un point qui n&#039;a pas déjà été visité.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
Ainsi dans notre exemple, nous voyons deux clusters: le vert et le bleu, ainsi qu&#039;une anomalie: le point rouge.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14980</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14980"/>
		<updated>2023-05-26T12:01:33Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Explication du fonctionnement de DBSCAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, nous allons représenter toutes les sphères d&#039;influences de tailles&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14979</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14979"/>
		<updated>2023-05-26T12:00:45Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* Explication du fonctionnement de DBSCAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_2.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_3.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_4.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14978</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14978"/>
		<updated>2023-05-26T12:00:24Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* DBSCAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
====Explication du fonctionnement de DBSCAN====&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_figure_1.PNG|600px|center]]&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_figure_4.PNG&amp;diff=14977</id>
		<title>Fichier:CFM figure 4.PNG</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_figure_4.PNG&amp;diff=14977"/>
		<updated>2023-05-26T11:58:44Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_figure_3.PNG&amp;diff=14976</id>
		<title>Fichier:CFM figure 3.PNG</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_figure_3.PNG&amp;diff=14976"/>
		<updated>2023-05-26T11:58:36Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_figure_2.PNG&amp;diff=14975</id>
		<title>Fichier:CFM figure 2.PNG</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_figure_2.PNG&amp;diff=14975"/>
		<updated>2023-05-26T11:58:28Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_figure_1.PNG&amp;diff=14974</id>
		<title>Fichier:CFM figure 1.PNG</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:CFM_figure_1.PNG&amp;diff=14974"/>
		<updated>2023-05-26T11:58:17Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14973</id>
		<title>Détection d’anomalies en « temps réel » via la plateforme de streaming d’évènements Kafka</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=D%C3%A9tection_d%E2%80%99anomalies_en_%C2%AB_temps_r%C3%A9el_%C2%BB_via_la_plateforme_de_streaming_d%E2%80%99%C3%A9v%C3%A8nements_Kafka&amp;diff=14973"/>
		<updated>2023-05-26T11:54:06Z</updated>

		<summary type="html">&lt;p&gt;Franz-maximilien ceron : /* DBSCAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L’objectif de ce projet était de pouvoir mettre en place un serveur Kafka et de détecter des anomalies dans le flux de données envoyé au serveur.&lt;br /&gt;
&lt;br /&gt;
=Qu&#039;est-ce qu’un serveur Kafka et l’utilité de détecter des anomalies.=&lt;br /&gt;
&lt;br /&gt;
Un serveur Apache Kafka est une plateforme de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d&#039;enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs.  Apache Kafka est de type d’intégration asynchrone se qui signifie que les données envoyées et consultées seront stockées dans un magasin intermédiaire (des fichiers topics).&lt;br /&gt;
&lt;br /&gt;
Apache Kafka permet donc des utilisations pour lesquels le débit de données est élevée, avec une latence réduite à quelques millisecondes. Les utilisateurs peuvent ainsi accéder les données en temps réel ce qui est primordial avec l’avènement de l’Internet des Objets.&lt;br /&gt;
&lt;br /&gt;
Cependant des erreurs peuvent apparaître dans les sources pourraient autant être les capteurs initiaux qu’un défaut de transmission. C’est pourquoi nous allons coupler à notre seurveur Apache Kafka, des algorithmes de détection d’anomalies Python pour mettre en évidence d’éventuelles anomalies qui pourraient apparaître et ainsi prévenir notre utilisateur.&lt;br /&gt;
&lt;br /&gt;
=Infrastructure d’un serveur Kafka=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez télécharger les fichiers nécessaires avec le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://kafka.apache.org/downloads Site d&#039;Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
==Zookeeper==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Avant de lancer notre serveur Kafka, nous allons d’abord déployer un autre service complémentaire nommé Apache Zookeeper.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Les dossiers pour exécuter Zookeeper sont normalement déjà présent dans l&#039;archive téléchargée.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce service permet gérer, coordonner un cluster de machines et fournit un service de configuration. Il a un rôle de surveillance, il va pouvoir organiser la gestion des broker (voir Apache Kafka) ainsi que le stockage lié aux informations de configurations (configuration des topics, nombre de partition, …).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Zookeeper_schema.jpg|400px|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple d&#039;une installation de serveur Zookeepers avec des serveurs Kafkas&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque&#039;&#039;&#039; : &#039;&#039;L’utilisation d’un serveur Zookeeper tend à disparaître pour permettre une utilisation individuelle de serveur Apache Kafka.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Kafka==&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_logo.png|200px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant lancer notre serveur Kafka qui pourra être intégré dans un cluster. Pour être précis nous lançons un broker dont l’id est unique.&lt;br /&gt;
Ce broker possède en lui différents topics, il sert à regrouper des données entre elles, qui eux-mêmes sont composés de partitions où seront stockés nos données. &lt;br /&gt;
Il n’y a théoriquement aucune limite au nombre de topics ou de partitions créés. Cela permet d’avoir plusieurs consumers sur le même topic avec différent stade de lecture.&lt;br /&gt;
Pour envoyer des données à notre topic, nous allons utiliser un producer et pour les lire dans nos partitions, nous allons utiliser un consumer.&lt;br /&gt;
On peut faire des producers/consumers mixtes.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_Kafka_schema.png|500px|center]]&lt;br /&gt;
&lt;br /&gt;
==Lancement du serveur==&lt;br /&gt;
&lt;br /&gt;
Pour effectuer le lancement d&#039;un serveur Kafka suivez le lien ci-dessous:&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Comment_lancer_un_serveur_Kafka Comment lancer un service Apache Kafka]&lt;br /&gt;
&lt;br /&gt;
=Démarche pour la détection d’anomalies=&lt;br /&gt;
&lt;br /&gt;
Pour trouver des anomalies, nous nous sommes d&#039;abord appuyés sur le travail de [https://www.lama.univ-savoie.fr/mediawiki/index.php/D%C3%A9tection_d%E2%80%99anomalies_par_Isolation_Forest_:_application_pour_l%E2%80%99industrie_4.0 Mila DESMET] sur l&#039;algorithme d&#039;Isolation Forest, cependant celui-ci avait des limites et nous avons alors exploré la détection avec un autre algorithme qui est le DBSCAN.&lt;br /&gt;
&lt;br /&gt;
Pour faire notre détection d&#039;erreurs, nous allons faire faire un montage à partir d&#039;une carte Arduino munie d&#039;un capteur d&#039;humidité dont les mesures seront envoyées sur un serveur Kafka. Ces mêmes données seront ensuite lues par un consumer qui lira les mesures et pourra dès lors détecter les anomalies.&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_de_base_pour_la_d%C3%A9tection_d_anomalies Explication du code de base pour la détection d&#039;erreurs]&lt;br /&gt;
&lt;br /&gt;
==Isolation Forest==&lt;br /&gt;
&lt;br /&gt;
Pour la détection d’anomalies, nous allons mettre en place un producer qui va lire les dernières données inscrites dans le topic. &lt;br /&gt;
Nous allons insérer les valeurs extraites dans une FILE d’une taille n puis nous allons nous servir de l’algorithme de détection d’anomalie Isolation Forest. Cet algorithme nécessite une base de donnée de référence qui vont être les n -1 premiers éléments de la FILE puis nous allons comparer les n -1 derniers éléments à notre référence. Seul le dernier élément peut changer, c’est sur celui-ci que l’on regarde s’il n’est pas anormal.&lt;br /&gt;
Cette méthode permet de commencer notre programme en ayant aucune valeur, cependant à chaque lancement une période d’initialisation sera nécessaire dont la durée dépendra de la taille de la FILE.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:CFM_exemple_file.PNG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;&#039;&#039;Exemple de la File avec en rouge l&#039;élément observé&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;La FILE doit être particulière car tous ces éléments doivent être lisibles ; soit on la dépile et on la repile, soit notre structure permet directement de la parcourir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_Isolation_Forest Lien code Isolation Forest]&lt;br /&gt;
&lt;br /&gt;
===Limites d&#039;Isolation Forest===&lt;br /&gt;
&lt;br /&gt;
: La taille de la FILE : il faut choisir arbitrairement la taille de la FILE mais ces limites : si la taille est trop grande, alors des anomalies pourraient être cachées par d’autres postérieurs ; si la taille est trop petite, alors le taux de faux positifs risque d’augmenter.&lt;br /&gt;
&lt;br /&gt;
: Les faux positifs : l’algorithme Isolation Forest nécessite un taux de contamination par défaut, pour régler ce problème j’ai décidé que le taux serait un élément de la FILE parmi tous cela permet de réduire le nombre de faux positif mais pas de le supprimer. Plus le taux sera haut, plus notre algorithme de détection sera sensible, mais il y aura plus de faux positif.&lt;br /&gt;
&lt;br /&gt;
: Les faux négatifs : tous comme les faux positifs, les faux négatifs peuvent apparaître de part les mêmes raisons.&lt;br /&gt;
&lt;br /&gt;
==DBSCAN==&lt;br /&gt;
&lt;br /&gt;
DBSCAN est un algorithme fondé sur la densité de clusters: c&#039;est à dire que les points sont réunis dans des clusters, les points qui peuvent être atteindre sont alors reliés aux clusters les plus proches et si un point est trop éloigné alors si les conditions nécessaires sont réunis alors il devient un autre cluster sinon il est considéré comme une anomalie.&lt;br /&gt;
&lt;br /&gt;
Les deux paramètres importants de cet algorithme sont:&lt;br /&gt;
&lt;br /&gt;
: ε: la distance de l&#039;influence d&#039;une donnée&lt;br /&gt;
: N: le nombre de points pour qu&#039;une donnée soit considérée comme appartenant à un cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.lama.univ-savoie.fr/mediawiki/index.php/Code_DBSCAN Lien code DBSCAN]&lt;br /&gt;
&lt;br /&gt;
===Limites de DBSCAN===&lt;br /&gt;
&lt;br /&gt;
: ε : l&#039;algorithme se repose sur la distance ε qui sépare nos données, il faut alors déterminer à l&#039;avance ce chiffre, plus il augmente plus le taux d&#039;erreur s&#039;élève.&lt;br /&gt;
&lt;br /&gt;
: N : l&#039;algorithme se repose sur un nombre N qui est la distance qui sépare nos données, si N est trop grand alors aucun cluster ne sera créé donc toutes nos données seront considérées comme des anomalies.&lt;br /&gt;
&lt;br /&gt;
==Limite des deux algorithmes==&lt;br /&gt;
&lt;br /&gt;
: L’initialisation : si le temps entre chaque données est élevé alors la période initialisation le sera aussi et toutes les données d’initialisation ne sont pas testées, s’il y a une anomalie dans ces données, elle ne sera pas pointée.&lt;br /&gt;
&lt;br /&gt;
: Trop d’anomalies : si nos données sont remplies d’anomalies et qu’elles sont constantes alors elles deviennent la normalité.&lt;br /&gt;
&lt;br /&gt;
: Le temps de détection : les algorithmes mettent du temps à s’exécuter donc des données peuvent être insérées dans le topic pendant. Nous avons choisi de regarder toujours le dernier message mais cela implique d’en ignorer certains.&lt;br /&gt;
&lt;br /&gt;
=Conclusion=&lt;br /&gt;
&lt;br /&gt;
On peut déduire de ce projet que l&#039;utilisation des bibliothèques de Sklearn, que sont Isolation Forest et DBSCAN, ne sont pas les plus adaptées pour la détection en temps réel d&#039;anomalies. Pour résoudre ce problème, il faudra alors explorer d&#039;autres bibliothèques disponibles ou bien la créer.&lt;/div&gt;</summary>
		<author><name>Franz-maximilien ceron</name></author>
	</entry>
</feed>