<?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=Rpajean</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=Rpajean"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Rpajean"/>
	<updated>2026-05-21T07:09:54Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12452</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12452"/>
		<updated>2020-05-17T16:24:56Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Similarité de Jaccard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenue primordiale. Aujourd&#039;hui, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent des systèmes de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifient des utilisateurs similaires et leurs recommandent des éléments susceptibles de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnelles (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientées graphe, qui reprennent la théorie des graphes en utilisant des nœuds et des arcs pour représenter et stocker les données, rendent ces bases de données très efficaces pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons aux liens entre les utilisateurs et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orientées graphe et des algorithmes de recherche de similarité. Nous allons également utiliser les bases de données orientées graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ses requêtes ce qui rend le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments importants pour pouvoir créer une base de données orientée graphe :&lt;br /&gt;
*Les Nœuds (Nodes) (Les éléments principaux)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les nœuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristiques spécifiques des nœuds et relations)&lt;br /&gt;
*Les fonctions permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des nœuds et des relations ===&lt;br /&gt;
Pour créer des nœuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un nœud est composé comme ceci : &amp;lt;code&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du nœud raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de nœud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définies comme ceci : &amp;lt;code&amp;gt;{nomParametre:valeurParametre}&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont créées ainsi : &amp;lt;code&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de nœuds et d&#039;une relation qui les relie ainsi que le résultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de données CSV et mise en place de la base de données ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de données de MovieLens qui donne la notation des films par des utilisateurs. Le format de cette base de données est CSV et à un en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de données sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de données&amp;quot; AS line&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos nœuds, relations ou propriétés.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai créé ainsi des nœuds et des relations sous la forme : &amp;lt;code&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Genre ont en paramètre le genre du film (Action, Comédie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai créé des nœuds Utilisateur en relation avec des nœuds Film sous la forme :&amp;lt;code&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mis au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peut commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensembles est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaires. (Vous pouvez cliquer sur l&#039;image pour en savoir plus]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vus par les utilisateurs, je peux regarder les utilisateurs les plus similaires par rapport aux mêmes films qu&#039;ils ont vus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de données étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouté qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouté la requête suivante : &amp;lt;code&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le résultat pour les 10 utilisateurs les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | thumb | center |1000px | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptibles d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtré les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptibles d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptibles d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orientées graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importation de la base de données sur les patients contaminés et mise en place de la base de données ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importé la base de données sous la forme : &amp;lt;code&amp;gt;(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Patient eux ont des paramètres sur l&#039;age, date d’apparition des symptômes, le sexe, si le patient a visité Wuhan, si le patient vient de Wuhan et un id.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le résultat suivant en France :&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 700px | thumb | center| On remarque qu&#039;il y a une erreur dans la base de données, ils ont mis France en tant que ville]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentielle ===&lt;br /&gt;
&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentielle entre les individus de même ville et si un individu a une date d&#039;apparition des symptômes antérieure à un autre individu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour commencer je ne me suis intéressé qu&#039;aux patients qui possèdent une date de symptôme (qui n&#039;ont pas la date &amp;quot;NA&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite il fallait trouver un moyen de convertir les chaines de caractères &amp;quot;date&amp;quot;, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 paramètres jour, mois, année en des entiers pour pouvoir comparer les dates. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci j&#039;ai utilisé la fonction split pour supprimer les &amp;quot;/&amp;quot; et les mettre dans une liste. &amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai utilisé la fonction SET pour créer les nouveaux paramètres. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai utilisé les requêtes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des mêmes villes et qui ont eu des symptômes avant un autre patient pour créer les relations de contamination potentielle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de données : ===&lt;br /&gt;
&lt;br /&gt;
Dans les résultats qui suivent j&#039;ai enlevé les nœuds qui n&#039;avaient pas de date de symptôme car ils ne fournissent pas d&#039;information. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Gansu en Chine : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_Gansu.png | frame | center | Les individus 89 et 150 ont une date d’apparition des symptômes antérieure à l&#039;individu 151. Ils ont également le même jour d’apparition des symptômes; pour cette raison il n&#039;y a pas de lien entre eux.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png | 700px | thumb | center| On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de nœuds) se sont formés sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoises comme Beijin (la capitale de la Chine), Shaanxi ou Tianjin. Bien que cette information soit évidente, cela montre que le virus se propage plus facilement dans les lieux avec une forte démographie.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayant visité Wuhan et vivant a Wuhan parmi les infectés pour voir si il y avait une relation. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai calculé le nombre de personnes ayant visité Wuhan, venant de Wuhan, ne venant pas de Wuhan et le total des individus dans la base de données, je trouve ce résultat : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png | center]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivaient à Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut donc supposer qu&#039;il y a peut être une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venaient les premiers infectés (de la base de données).&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec les résultats de requêtes j&#039;ai trouvé que 27 infectés sur 30 ont été à Wuhan parmi ces premiers infectés, ce qui montre bien que l&#039;épidémie a commencé là-bas.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays s&#039;est propagé le virus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste des Pays que j&#039;ai trouvé par ordre chronologique de contamination à partir de la base de données : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png | center]]&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
Vous pouvez voir toutes les requêtes que j&#039;ai utilisé lors de ce projet dans le fichier txt dans le lien GitHub ci-dessous : &amp;lt;br/&amp;gt;&lt;br /&gt;
[https://github.com/TheSummer1502/VISI201.git https://github.com/TheSummer1502/VISI201.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
Documentation sur le langage Cypher&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/docs/cypher-manual/4.0/ https://neo4j.com/docs/cypher-manual/4.0/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pages sur les bases de données :&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données relationelles&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données orientées graphe&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Fonctionnement de la similarité de Jaccard :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Neo4j :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/ https://neo4j.com/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Graphendb :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.graphenedb.com/ https://www.graphenedb.com/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A travers ce projet j&#039;ai pu découvrir en général l&#039;univers des bases de données que je ne connaissais pas auparavant, et voir l&#039;importance qu&#039;elles ont dans le monde actuel. Lors de ce projet j&#039;ai vu plus en détail les bases de données orientées graphe. J&#039;ai pu voir qu&#039;elles offraient beaucoup plus d&#039;avantages lors de la manipulation de relations par rapport aux bases de données relationnelles. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai appris à me servir du langage Cypher pour manipuler les bases de données avec le système de gestion de bases de données Neo4j. J&#039;ai trouvé ce langage assez simple à apprendre car le format en ASCII Art le rend très visuel et facile à comprendre.&lt;br /&gt;
&lt;br /&gt;
De plus j&#039;ai beaucoup aimé le fait que l&#039;on puisse observer facilement les résultats de nos manipulations avec l&#039;affichage des bases de données sous forme de graphes.&lt;br /&gt;
&lt;br /&gt;
Egalement j&#039;ai appris différentes manières de calculer la similarité entre des éléments notamment avec l&#039;indice de Jaccard mais j&#039;ai également découvert d&#039;autres moyens de la calculer comme la similarité cosinus, cependant je n&#039;ai pas réussi à l&#039;appliquer.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également découvert que la plupart des bases de données ne sont pas parfaites et possèdent des données manquantes ou erronées. Pour ceci, il faut fournir un travail supplémentaire pour pouvoir quand même exploiter des résultats malgré les données lacunaires.&lt;br /&gt;
&lt;br /&gt;
Au final, j&#039;ai trouvé ce projet très enrichissant et intéressant, j&#039;ai pu voir une partie de toutes les possibilités qu&#039;offrait ce type de base de données et me rendre compte que savoir les manipuler à haut niveau peut réellement apporter de nouvelles perspectives pour la recherche.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12451</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12451"/>
		<updated>2020-05-17T16:16:43Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Similarité de Jaccard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenue primordiale. Aujourd&#039;hui, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent des systèmes de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifient des utilisateurs similaires et leurs recommandent des éléments susceptibles de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnelles (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientées graphe, qui reprennent la théorie des graphes en utilisant des nœuds et des arcs pour représenter et stocker les données, rendent ces bases de données très efficaces pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons aux liens entre les utilisateurs et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orientées graphe et des algorithmes de recherche de similarité. Nous allons également utiliser les bases de données orientées graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ses requêtes ce qui rend le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments importants pour pouvoir créer une base de données orientée graphe :&lt;br /&gt;
*Les Nœuds (Nodes) (Les éléments principaux)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les nœuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristiques spécifiques des nœuds et relations)&lt;br /&gt;
*Les fonctions permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des nœuds et des relations ===&lt;br /&gt;
Pour créer des nœuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un nœud est composé comme ceci : &amp;lt;code&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du nœud raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de nœud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définies comme ceci : &amp;lt;code&amp;gt;{nomParametre:valeurParametre}&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont créées ainsi : &amp;lt;code&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de nœuds et d&#039;une relation qui les relie ainsi que le résultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de données CSV et mise en place de la base de données ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de données de MovieLens qui donne la notation des films par des utilisateurs. Le format de cette base de données est CSV et à un en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de données sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de données&amp;quot; AS line&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos nœuds, relations ou propriétés.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai créé ainsi des nœuds et des relations sous la forme : &amp;lt;code&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Genre ont en paramètre le genre du film (Action, Comédie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai créé des nœuds Utilisateur en relation avec des nœuds Film sous la forme :&amp;lt;code&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mis au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peut commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensembles est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaires. (Vous pouvez cliquer sur l&#039;image pour en savoir plus]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vus par les utilisateurs, je peux regarder les utilisateurs les plus similaires par rapport aux mêmes films qu&#039;ils ont vus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de données étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouté qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouté la requête suivante : &amp;lt;code&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le résultat pour les 10 utilisateurs les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptibles d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtré les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptibles d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptibles d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orientées graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importation de la base de données sur les patients contaminés et mise en place de la base de données ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importé la base de données sous la forme : &amp;lt;code&amp;gt;(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Patient eux ont des paramètres sur l&#039;age, date d’apparition des symptômes, le sexe, si le patient a visité Wuhan, si le patient vient de Wuhan et un id.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le résultat suivant en France :&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 700px | thumb | center| On remarque qu&#039;il y a une erreur dans la base de données, ils ont mis France en tant que ville]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentielle ===&lt;br /&gt;
&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentielle entre les individus de même ville et si un individu a une date d&#039;apparition des symptômes antérieure à un autre individu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour commencer je ne me suis intéressé qu&#039;aux patients qui possèdent une date de symptôme (qui n&#039;ont pas la date &amp;quot;NA&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite il fallait trouver un moyen de convertir les chaines de caractères &amp;quot;date&amp;quot;, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 paramètres jour, mois, année en des entiers pour pouvoir comparer les dates. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci j&#039;ai utilisé la fonction split pour supprimer les &amp;quot;/&amp;quot; et les mettre dans une liste. &amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai utilisé la fonction SET pour créer les nouveaux paramètres. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai utilisé les requêtes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des mêmes villes et qui ont eu des symptômes avant un autre patient pour créer les relations de contamination potentielle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de données : ===&lt;br /&gt;
&lt;br /&gt;
Dans les résultats qui suivent j&#039;ai enlevé les nœuds qui n&#039;avaient pas de date de symptôme car ils ne fournissent pas d&#039;information. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Gansu en Chine : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_Gansu.png | frame | center | Les individus 89 et 150 ont une date d’apparition des symptômes antérieure à l&#039;individu 151. Ils ont également le même jour d’apparition des symptômes; pour cette raison il n&#039;y a pas de lien entre eux.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png | 700px | thumb | center| On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de nœuds) se sont formés sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoises comme Beijin (la capitale de la Chine), Shaanxi ou Tianjin. Bien que cette information soit évidente, cela montre que le virus se propage plus facilement dans les lieux avec une forte démographie.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayant visité Wuhan et vivant a Wuhan parmi les infectés pour voir si il y avait une relation. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai calculé le nombre de personnes ayant visité Wuhan, venant de Wuhan, ne venant pas de Wuhan et le total des individus dans la base de données, je trouve ce résultat : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png | center]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivaient à Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut donc supposer qu&#039;il y a peut être une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venaient les premiers infectés (de la base de données).&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec les résultats de requêtes j&#039;ai trouvé que 27 infectés sur 30 ont été à Wuhan parmi ces premiers infectés, ce qui montre bien que l&#039;épidémie a commencé là-bas.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays s&#039;est propagé le virus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste des Pays que j&#039;ai trouvé par ordre chronologique de contamination à partir de la base de données : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png | center]]&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
Vous pouvez voir toutes les requêtes que j&#039;ai utilisé lors de ce projet dans le fichier txt dans le lien GitHub ci-dessous : &amp;lt;br/&amp;gt;&lt;br /&gt;
[https://github.com/TheSummer1502/VISI201.git https://github.com/TheSummer1502/VISI201.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
Documentation sur le langage Cypher&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/docs/cypher-manual/4.0/ https://neo4j.com/docs/cypher-manual/4.0/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pages sur les bases de données :&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données relationelles&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données orientées graphe&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Fonctionnement de la similarité de Jaccard :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Neo4j :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/ https://neo4j.com/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Graphendb :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.graphenedb.com/ https://www.graphenedb.com/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A travers ce projet j&#039;ai pu découvrir en général l&#039;univers des bases de données que je ne connaissais pas auparavant, et voir l&#039;importance qu&#039;elles ont dans le monde actuel. Lors de ce projet j&#039;ai vu plus en détail les bases de données orientées graphe. J&#039;ai pu voir qu&#039;elles offraient beaucoup plus d&#039;avantages lors de la manipulation de relations par rapport aux bases de données relationnelles. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai appris à me servir du langage Cypher pour manipuler les bases de données avec le système de gestion de bases de données Neo4j. J&#039;ai trouvé ce langage assez simple à apprendre car le format en ASCII Art le rend très visuel et facile à comprendre.&lt;br /&gt;
&lt;br /&gt;
De plus j&#039;ai beaucoup aimé le fait que l&#039;on puisse observer facilement les résultats de nos manipulations avec l&#039;affichage des bases de données sous forme de graphes.&lt;br /&gt;
&lt;br /&gt;
Egalement j&#039;ai appris différentes manières de calculer la similarité entre des éléments notamment avec l&#039;indice de Jaccard mais j&#039;ai également découvert d&#039;autres moyens de la calculer comme la similarité cosinus, cependant je n&#039;ai pas réussi à l&#039;appliquer.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également découvert que la plupart des bases de données ne sont pas parfaites et possèdent des données manquantes ou erronées. Pour ceci, il faut fournir un travail supplémentaire pour pouvoir quand même exploiter des résultats malgré les données lacunaires.&lt;br /&gt;
&lt;br /&gt;
Au final, j&#039;ai trouvé ce projet très enrichissant et intéressant, j&#039;ai pu voir une partie de toutes les possibilités qu&#039;offrait ce type de base de données et me rendre compte que savoir les manipuler à haut niveau peut réellement apporter de nouvelles perspectives pour la recherche.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12450</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12450"/>
		<updated>2020-05-17T16:14:24Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Exploitation de la base de données : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenue primordiale. Aujourd&#039;hui, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent des systèmes de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifient des utilisateurs similaires et leurs recommandent des éléments susceptibles de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnelles (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientées graphe, qui reprennent la théorie des graphes en utilisant des nœuds et des arcs pour représenter et stocker les données, rendent ces bases de données très efficaces pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons aux liens entre les utilisateurs et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orientées graphe et des algorithmes de recherche de similarité. Nous allons également utiliser les bases de données orientées graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ses requêtes ce qui rend le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments importants pour pouvoir créer une base de données orientée graphe :&lt;br /&gt;
*Les Nœuds (Nodes) (Les éléments principaux)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les nœuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristiques spécifiques des nœuds et relations)&lt;br /&gt;
*Les fonctions permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des nœuds et des relations ===&lt;br /&gt;
Pour créer des nœuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un nœud est composé comme ceci : &amp;lt;code&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du nœud raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de nœud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définies comme ceci : &amp;lt;code&amp;gt;{nomParametre:valeurParametre}&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont créées ainsi : &amp;lt;code&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de nœuds et d&#039;une relation qui les relie ainsi que le résultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de données CSV et mise en place de la base de données ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de données de MovieLens qui donne la notation des films par des utilisateurs. Le format de cette base de données est CSV et à un en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de données sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de données&amp;quot; AS line&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos nœuds, relations ou propriétés.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai créé ainsi des nœuds et des relations sous la forme : &amp;lt;code&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Genre ont en paramètre le genre du film (Action, Comédie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai créé des nœuds Utilisateur en relation avec des nœuds Film sous la forme :&amp;lt;code&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mis au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peut commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensembles est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaires.]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vus par les utilisateurs, je peux regarder les utilisateurs les plus similaires par rapport aux mêmes films qu&#039;ils ont vus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de données étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouté qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouté la requête suivante : &amp;lt;code&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le résultat pour les 10 utilisateurs les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptibles d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtré les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptibles d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptibles d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orientées graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importation de la base de données sur les patients contaminés et mise en place de la base de données ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importé la base de données sous la forme : &amp;lt;code&amp;gt;(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Patient eux ont des paramètres sur l&#039;age, date d’apparition des symptômes, le sexe, si le patient a visité Wuhan, si le patient vient de Wuhan et un id.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le résultat suivant en France :&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 700px | thumb | center| On remarque qu&#039;il y a une erreur dans la base de données, ils ont mis France en tant que ville]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentielle ===&lt;br /&gt;
&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentielle entre les individus de même ville et si un individu a une date d&#039;apparition des symptômes antérieure à un autre individu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour commencer je ne me suis intéressé qu&#039;aux patients qui possèdent une date de symptôme (qui n&#039;ont pas la date &amp;quot;NA&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite il fallait trouver un moyen de convertir les chaines de caractères &amp;quot;date&amp;quot;, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 paramètres jour, mois, année en des entiers pour pouvoir comparer les dates. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci j&#039;ai utilisé la fonction split pour supprimer les &amp;quot;/&amp;quot; et les mettre dans une liste. &amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai utilisé la fonction SET pour créer les nouveaux paramètres. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai utilisé les requêtes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des mêmes villes et qui ont eu des symptômes avant un autre patient pour créer les relations de contamination potentielle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de données : ===&lt;br /&gt;
&lt;br /&gt;
Dans les résultats qui suivent j&#039;ai enlevé les nœuds qui n&#039;avaient pas de date de symptôme car ils ne fournissent pas d&#039;information. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Gansu en Chine : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_Gansu.png | frame | center | Les individus 89 et 150 ont une date d’apparition des symptômes antérieure à l&#039;individu 151. Ils ont également le même jour d’apparition des symptômes; pour cette raison il n&#039;y a pas de lien entre eux.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png | 700px | thumb | center| On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de nœuds) se sont formés sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoises comme Beijin (la capitale de la Chine), Shaanxi ou Tianjin. Bien que cette information soit évidente, cela montre que le virus se propage plus facilement dans les lieux avec une forte démographie.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayant visité Wuhan et vivant a Wuhan parmi les infectés pour voir si il y avait une relation. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai calculé le nombre de personnes ayant visité Wuhan, venant de Wuhan, ne venant pas de Wuhan et le total des individus dans la base de données, je trouve ce résultat : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png | center]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivaient à Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut donc supposer qu&#039;il y a peut être une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venaient les premiers infectés (de la base de données).&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec les résultats de requêtes j&#039;ai trouvé que 27 infectés sur 30 ont été à Wuhan parmi ces premiers infectés, ce qui montre bien que l&#039;épidémie a commencé là-bas.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays s&#039;est propagé le virus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste des Pays que j&#039;ai trouvé par ordre chronologique de contamination à partir de la base de données : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png | center]]&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
Vous pouvez voir toutes les requêtes que j&#039;ai utilisé lors de ce projet dans le fichier txt dans le lien GitHub ci-dessous : &amp;lt;br/&amp;gt;&lt;br /&gt;
[https://github.com/TheSummer1502/VISI201.git https://github.com/TheSummer1502/VISI201.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
Documentation sur le langage Cypher&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/docs/cypher-manual/4.0/ https://neo4j.com/docs/cypher-manual/4.0/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pages sur les bases de données :&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données relationelles&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données orientées graphe&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Fonctionnement de la similarité de Jaccard :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Neo4j :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/ https://neo4j.com/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Graphendb :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.graphenedb.com/ https://www.graphenedb.com/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A travers ce projet j&#039;ai pu découvrir en général l&#039;univers des bases de données que je ne connaissais pas auparavant, et voir l&#039;importance qu&#039;elles ont dans le monde actuel. Lors de ce projet j&#039;ai vu plus en détail les bases de données orientées graphe. J&#039;ai pu voir qu&#039;elles offraient beaucoup plus d&#039;avantages lors de la manipulation de relations par rapport aux bases de données relationnelles. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai appris à me servir du langage Cypher pour manipuler les bases de données avec le système de gestion de bases de données Neo4j. J&#039;ai trouvé ce langage assez simple à apprendre car le format en ASCII Art le rend très visuel et facile à comprendre.&lt;br /&gt;
&lt;br /&gt;
De plus j&#039;ai beaucoup aimé le fait que l&#039;on puisse observer facilement les résultats de nos manipulations avec l&#039;affichage des bases de données sous forme de graphes.&lt;br /&gt;
&lt;br /&gt;
Egalement j&#039;ai appris différentes manières de calculer la similarité entre des éléments notamment avec l&#039;indice de Jaccard mais j&#039;ai également découvert d&#039;autres moyens de la calculer comme la similarité cosinus, cependant je n&#039;ai pas réussi à l&#039;appliquer.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également découvert que la plupart des bases de données ne sont pas parfaites et possèdent des données manquantes ou erronées. Pour ceci, il faut fournir un travail supplémentaire pour pouvoir quand même exploiter des résultats malgré les données lacunaires.&lt;br /&gt;
&lt;br /&gt;
Au final, j&#039;ai trouvé ce projet très enrichissant et intéressant, j&#039;ai pu voir une partie de toutes les possibilités qu&#039;offrait ce type de base de données et me rendre compte que savoir les manipuler à haut niveau peut réellement apporter de nouvelles perspectives pour la recherche.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12449</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12449"/>
		<updated>2020-05-17T16:08:51Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenue primordiale. Aujourd&#039;hui, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent des systèmes de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifient des utilisateurs similaires et leurs recommandent des éléments susceptibles de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnelles (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientées graphe, qui reprennent la théorie des graphes en utilisant des nœuds et des arcs pour représenter et stocker les données, rendent ces bases de données très efficaces pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons aux liens entre les utilisateurs et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orientées graphe et des algorithmes de recherche de similarité. Nous allons également utiliser les bases de données orientées graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ses requêtes ce qui rend le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments importants pour pouvoir créer une base de données orientée graphe :&lt;br /&gt;
*Les Nœuds (Nodes) (Les éléments principaux)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les nœuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristiques spécifiques des nœuds et relations)&lt;br /&gt;
*Les fonctions permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des nœuds et des relations ===&lt;br /&gt;
Pour créer des nœuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un nœud est composé comme ceci : &amp;lt;code&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du nœud raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de nœud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définies comme ceci : &amp;lt;code&amp;gt;{nomParametre:valeurParametre}&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont créées ainsi : &amp;lt;code&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de nœuds et d&#039;une relation qui les relie ainsi que le résultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de données CSV et mise en place de la base de données ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de données de MovieLens qui donne la notation des films par des utilisateurs. Le format de cette base de données est CSV et à un en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de données sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de données&amp;quot; AS line&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos nœuds, relations ou propriétés.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai créé ainsi des nœuds et des relations sous la forme : &amp;lt;code&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Genre ont en paramètre le genre du film (Action, Comédie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai créé des nœuds Utilisateur en relation avec des nœuds Film sous la forme :&amp;lt;code&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mis au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peut commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensembles est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaires.]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vus par les utilisateurs, je peux regarder les utilisateurs les plus similaires par rapport aux mêmes films qu&#039;ils ont vus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de données étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouté qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouté la requête suivante : &amp;lt;code&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le résultat pour les 10 utilisateurs les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptibles d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtré les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptibles d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptibles d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orientées graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importation de la base de données sur les patients contaminés et mise en place de la base de données ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importé la base de données sous la forme : &amp;lt;code&amp;gt;(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Patient eux ont des paramètres sur l&#039;age, date d’apparition des symptômes, le sexe, si le patient a visité Wuhan, si le patient vient de Wuhan et un id.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le résultat suivant en France :&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 700px | thumb | center| On remarque qu&#039;il y a une erreur dans la base de données, ils ont mis France en tant que ville]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentielle ===&lt;br /&gt;
&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentielle entre les individus de même ville et si un individu a une date d&#039;apparition des symptômes antérieure à un autre individu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour commencer je ne me suis intéressé qu&#039;aux patients qui possèdent une date de symptôme (qui n&#039;ont pas la date &amp;quot;NA&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite il fallait trouver un moyen de convertir les chaines de caractères &amp;quot;date&amp;quot;, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 paramètres jour, mois, année en des entiers pour pouvoir comparer les dates. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci j&#039;ai utilisé la fonction split pour supprimer les &amp;quot;/&amp;quot; et les mettre dans une liste. &amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai utilisé la fonction SET pour créer les nouveaux paramètres. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai utilisé les requêtes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des mêmes villes et qui ont eu des symptômes avant un autre patient pour créer les relations de contamination potentielle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de données : ===&lt;br /&gt;
&lt;br /&gt;
Dans les résultats qui suivent j&#039;ai enlevé les nœuds qui n&#039;avaient pas de date de symptôme car il ne fournissent pas d&#039;information. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Gansu en Chine : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_Gansu.png | frame | center | Les individus 89 et 150 ont une date d’apparition des symptômes antérieure à l&#039;individu 151. Ils ont également le même jour d’apparition des symptômes; pour cette raison il n&#039;y a pas de lien entre eux.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png | 700px | thumb | center| On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de nœuds) se sont formés sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoises comme Beijin (la capitale de la Chine), Shaanxi ou Tianjin. Bien que cette information soit évidente, cela montre que le virus se propage plus facilement dans les lieux avec une forte démographie.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayant visité Wuhan et vivant a Wuhan parmi les infectés pour voir si il y avait une relation. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai calculé le nombre de personnes ayant visité Wuhan, venant de Wuhan, ne venant pas de Wuhan et le total des individus dans la base de données, je trouve ce résultat : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png | center]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivaient à Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut donc supposer qu&#039;il y a peut être une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venaient les premiers infectés (de la base de données).&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec les résultats de requêtes j&#039;ai trouvé que 27 infectés sur 30 ont été à Wuhan parmi ces premiers infectés, ce qui montre bien que l&#039;épidémie a commencé là-bas.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays s&#039;est propagé le virus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste des Pays que j&#039;ai trouvé par ordre chronologique de contamination à partir de la base de données : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
Vous pouvez voir toutes les requêtes que j&#039;ai utilisé lors de ce projet dans le fichier txt dans le lien GitHub ci-dessous : &amp;lt;br/&amp;gt;&lt;br /&gt;
[https://github.com/TheSummer1502/VISI201.git https://github.com/TheSummer1502/VISI201.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
Documentation sur le langage Cypher&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/docs/cypher-manual/4.0/ https://neo4j.com/docs/cypher-manual/4.0/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pages sur les bases de données :&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données relationelles&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données orientées graphe&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Fonctionnement de la similarité de Jaccard :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Neo4j :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/ https://neo4j.com/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Graphendb :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.graphenedb.com/ https://www.graphenedb.com/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A travers ce projet j&#039;ai pu découvrir en général l&#039;univers des bases de données que je ne connaissais pas auparavant, et voir l&#039;importance qu&#039;elles ont dans le monde actuel. Lors de ce projet j&#039;ai vu plus en détail les bases de données orientées graphe. J&#039;ai pu voir qu&#039;elles offraient beaucoup plus d&#039;avantages lors de la manipulation de relations par rapport aux bases de données relationnelles. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai appris à me servir du langage Cypher pour manipuler les bases de données avec le système de gestion de bases de données Neo4j. J&#039;ai trouvé ce langage assez simple à apprendre car le format en ASCII Art le rend très visuel et facile à comprendre.&lt;br /&gt;
&lt;br /&gt;
De plus j&#039;ai beaucoup aimé le fait que l&#039;on puisse observer facilement les résultats de nos manipulations avec l&#039;affichage des bases de données sous forme de graphes.&lt;br /&gt;
&lt;br /&gt;
Egalement j&#039;ai appris différentes manières de calculer la similarité entre des éléments notamment avec l&#039;indice de Jaccard mais j&#039;ai également découvert d&#039;autres moyens de la calculer comme la similarité cosinus, cependant je n&#039;ai pas réussi à l&#039;appliquer.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également découvert que la plupart des bases de données ne sont pas parfaites et possèdent des données manquantes ou erronées. Pour ceci, il faut fournir un travail supplémentaire pour pouvoir quand même exploiter des résultats malgré les données lacunaires.&lt;br /&gt;
&lt;br /&gt;
Au final, j&#039;ai trouvé ce projet très enrichissant et intéressant, j&#039;ai pu voir une partie de toutes les possibilités qu&#039;offrait ce type de base de données et me rendre compte que savoir les manipuler à haut niveau peut réellement apporter de nouvelles perspectives pour la recherche.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12448</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12448"/>
		<updated>2020-05-17T15:55:29Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenue primordiale. Aujourd&#039;hui, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent des systèmes de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifient des utilisateurs similaires et leurs recommandent des éléments susceptibles de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnelles (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientées graphe, qui reprennent la théorie des graphes en utilisant des nœuds et des arcs pour représenter et stocker les données, rendent ces bases de données très efficaces pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons aux liens entre les utilisateurs et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orientées graphe et des algorithmes de recherche de similarité. Nous allons également utiliser les bases de données orientées graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ses requêtes ce qui rend le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments importants pour pouvoir créer une base de données orientée graphe :&lt;br /&gt;
*Les Nœuds (Nodes) (Les éléments principaux)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les nœuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristiques spécifiques des nœuds et relations)&lt;br /&gt;
*Les fonctions permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des nœuds et des relations ===&lt;br /&gt;
Pour créer des nœuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un nœud est composé comme ceci : &amp;lt;code&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du nœud raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de nœud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définies comme ceci : &amp;lt;code&amp;gt;{nomParametre:valeurParametre}&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont créées ainsi : &amp;lt;code&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de nœuds et d&#039;une relation qui les relie ainsi que le résultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de données CSV et mise en place de la base de données ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de données de MovieLens qui donne la notation des films par des utilisateurs. Le format de cette base de données est CSV et à un en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de données sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de données&amp;quot; AS line&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos nœuds, relations ou propriétés.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai créé ainsi des nœuds et des relations sous la forme : &amp;lt;code&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Genre ont en paramètre le genre du film (Action, Comédie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai créé des nœuds Utilisateur en relation avec des nœuds Film sous la forme :&amp;lt;code&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mis au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peut commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensembles est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaires.]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vus par les utilisateurs, je peux regarder les utilisateurs les plus similaires par rapport aux mêmes films qu&#039;ils ont vus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de données étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouté qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouté la requête suivante : &amp;lt;code&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le résultat pour les 10 utilisateurs les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptibles d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtré les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptibles d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptibles d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orientées graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importation de la base de données sur les patients contaminés et mise en place de la base de données ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importé la base de données sous la forme : &amp;lt;code&amp;gt;(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les nœuds Patient eux ont des paramètres sur l&#039;age, date d’apparition des symptômes, le sexe, si le patient a visité Wuhan, si le patient vient de Wuhan et un id.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le résultat suivant en France :&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 700px | thumb | center| On remarque qu&#039;il y a une erreur dans la base de données, ils ont mis France en tant que ville]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentiel ===&lt;br /&gt;
&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentiel entre les individus de même ville et si un individu a une date d&#039;apparition des symptôme antérieur à un autre individu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour commencer je ne me suis interéssé qu&#039;aux patients qui posède un date de sypmtome (qui non pas la date &amp;quot;NA&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite il falait trouver un moyen de convertir les chaine de caractere date, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 parametres jour, mois, annee des entiers pour pouvoir comparer les dates. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci j&#039;ai utiliser la fonction split pour suprimer les &amp;quot;/&amp;quot; et les metre dans une liste. &amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai utilisé la fonction SET pour créer les parametres nouveau paramêtres. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai utilisé les requêtes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des même ville et qui on eu des symptômes avant un autre patient pour créer les relations de contamination potentiel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de donnée : ===&lt;br /&gt;
&lt;br /&gt;
Dans les résultats qui suit j&#039;ai enlevé les noeuds qui n&#039;avait pas de date de symptôme car il ne ne fournissent pas d&#039;information. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Gansu en Chine : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_Gansu.png | frame | center | Les individus 89 et 150 ont une date d’apparition des symptôme antérieur à l&#039;individus 151. Ils ont également le même jour d’apparition des symptôme pour cette raison il n&#039;y a pas de lien entre eux.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png | 700px | thumb | center| On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de noeuds) se sont formé sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoise comme Beijin (la capitale de la Chine), Shaanxi ou Tianjin. Bien que cette information est évidente, cela montre que le virus se propage plus facilement dans les lieu avec une forte démographie.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayants visité Wuhan et vivant a Wuhan parmi les infectes pour voir si il y avait une relation. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai calculer le nombre de personne ayants visité Wuhan, venant de Wuhan, ne venant pas de Wuhan et le total des individus dans la base de données, je trouve ce résultat : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png | center]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivait a Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut donc supposer qu&#039;il y a peut être une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venait les premiers infectés (de la base de donné).&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec les résultats de requêtes j&#039;ai trouvé que 27 infecté sur 30 ont été à Wuhan parmi ces premiers infecté ce qui montre bien que l&#039;épidémie a commencé la bas.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays c&#039;est propagé le virus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste des Pays que j&#039;ai trouvé par ordre de contamination à partir de la base de donnée : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
Vous pouvez voir toutes les requêtes que j&#039;ai utilisé lors de ce projet dans le fichier txt dans le lien GitHub ci-dessous : &amp;lt;br/&amp;gt;&lt;br /&gt;
[https://github.com/TheSummer1502/VISI201.git https://github.com/TheSummer1502/VISI201.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
Documentation sur le langage Cypher&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/docs/cypher-manual/4.0/ https://neo4j.com/docs/cypher-manual/4.0/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pages sur les bases de données :&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données relationelles&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données orienté graphe&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Fonctionement de la similarité de Jaccard :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Neo4j :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/ https://neo4j.com/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Graphendb :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.graphenedb.com/ https://www.graphenedb.com/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A travers ce projet j&#039;ai pu découvrir en général l&#039;univers des bases de donnée que je ne connaissais pas auparavant et voir l&#039;importance qu&#039;elles ont dans le monde actuel. Lors de ce projet j&#039;ai vu plus en détail les bases de données orienté graphe. J&#039;ai pu voir qu&#039;elles offraient beaucoup plus d&#039;avantages lors de la manipulation de relations par rapport au base de donnée relationnelles. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai appris à me servir du langage Cypher pour manipuler les bases de donnée avec le système de gestion de base de donnée Neo4j. J&#039;ai trouvé ce langage assez simple à apprendre car le format en ASCII Art le rends très visuel et facile à comprendre.&lt;br /&gt;
&lt;br /&gt;
De plus j&#039;ai beaucoup aimé le fait que l&#039;on puisse observer facilement les résultats de nos manipulations avec l&#039;affichage des bases de données sous forme de graphes.&lt;br /&gt;
&lt;br /&gt;
Egalement j&#039;ai appris différentes manière de calculer la similarité entre des éléments notamment avec l&#039;indice de Jaccard mais j&#039;ai également découvert d&#039;autres moyen de la calculer comme la similarité cosinus, cependant je n&#039;ai pas réussi à l&#039;appliquer.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également découvert que la plupart des bases de données ne sont pas parfaite et possède des données manquantes ou erronée. Pour ceci, il faut fournir un travail supplémentaire pour pouvoir quand même exploiter des résultats malgré les donnée lacunaire.&lt;br /&gt;
&lt;br /&gt;
Au final, j&#039;ai trouvé ce projet très enrichissant et intéressant, j&#039;ai pu voir une partie de toute les possibilité qu&#039;offrait ce type de base de donnée et me rendre compte que savoir les manipuler à haut niveau peut réellement apporter des nouvelles perspective pour la recherche.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12423</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12423"/>
		<updated>2020-05-17T11:44:42Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : &amp;lt;code&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de noeud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définis comme ceci : &amp;lt;code&amp;gt;{nomParametre:valeurParametre}&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont crées ainsi : &amp;lt;code&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de noeuds et d&#039;une relation qui les relient ainsi que le résultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV et mise en place de la base de donnée ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notions de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de donnée sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de donnée&amp;quot; AS line&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos noeuds, relations ou propriété.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai crée ainsi des noeuds et des relations sous la forme : &amp;lt;code&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Genre ont en paramêtre le genre du film (Action, Comedie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai crée des noeuds Utilisateur en relation avec des noeuds Film sous la forme :&amp;lt;code&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mit au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaire.]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouter la requêtes suivante : &amp;lt;code&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le resultat pour les 10 utilisateur les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptible d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtrer les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptible d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptible d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orienté graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importation de la base de donnée sur les patients contaminés et mise en place de la base de donnée ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importer la base de donnée sous la forme : &amp;lt;code&amp;gt;(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Patient eux ont des paramètres sur l&#039;age, date d’apparition des symptômes, le sexe, si le patient a visité Wuhan, si le patient vient de Wuhan et un id.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le résultat suivant en France :&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 700px | thumb | center| On remarque qu&#039;il y a une erreur dans la base de donnée, ils ont mit France en tant que ville]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentiel ===&lt;br /&gt;
&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentiel entre les individus de même ville et si un individu a une date d&#039;apparition des symptôme antérieur à un autre individu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour commencer je ne me suis interéssé qu&#039;aux patients qui posède un date de sypmtome (qui non pas la date &amp;quot;NA&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite il falait trouver un moyen de convertir les chaine de caractere date, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 parametres jour, mois, annee des entiers pour pouvoir comparer les dates. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci j&#039;ai utiliser la fonction split pour suprimer les &amp;quot;/&amp;quot; et les metre dans une liste. &amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai utilisé la fonction SET pour créer les parametres nouveau paramêtres. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai utilisé les requêtes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des même ville et qui on eu des symptômes avant un autre patient pour créer les relations de contamination potentiel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de donnée : ===&lt;br /&gt;
&lt;br /&gt;
Dans les résultats qui suit j&#039;ai enlevé les noeuds qui n&#039;avait pas de date de symptôme car il ne ne fournissent pas d&#039;information. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Gansu en Chine : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_Gansu.png | frame | center | Les individus 89 et 150 ont une date d’apparition des symptôme antérieur à l&#039;individus 151. Ils ont également le même jour d’apparition des symptôme pour cette raison il n&#039;y a pas de lien entre eux.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png | 700px | thumb | center| On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de noeuds) se sont formé sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoise comme Beijin (la capitale de la Chine), Shaanxi ou Tianjin. Bien que cette information est évidente, cela montre que le virus se propage plus facilement dans les lieu avec une forte démographie.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayants visité Wuhan et vivant a Wuhan parmi les infectes pour voir si il y avait une relation. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai calculer le nombre de personne ayants visité Wuhan, venant de Wuhan, ne venant pas de Wuhan et le total des individus dans la base de données, je trouve ce résultat : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png | center]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivait a Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut donc supposer qu&#039;il y a peut être une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venait les premiers infectés (de la base de donné).&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec les résultats de requêtes j&#039;ai trouvé que 27 infecté sur 30 ont été à Wuhan parmi ces premiers infecté ce qui montre bien que l&#039;épidémie a commencé la bas.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays c&#039;est propagé le virus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste des Pays que j&#039;ai trouvé par ordre de contamination à partir de la base de donnée : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
Vous pouvez voir toutes les requêtes que j&#039;ai utilisé lors de ce projet dans le fichier txt dans le lien GitHub ci-dessous : &amp;lt;br/&amp;gt;&lt;br /&gt;
[https://github.com/TheSummer1502/VISI201.git https://github.com/TheSummer1502/VISI201.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
Documentation sur le langage Cypher&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/docs/cypher-manual/4.0/ https://neo4j.com/docs/cypher-manual/4.0/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pages sur les bases de données :&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données relationelles&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données orienté graphe&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Fonctionement de la similarité de Jaccard :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Neo4j :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/ https://neo4j.com/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Graphendb :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.graphenedb.com/ https://www.graphenedb.com/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A travers ce projet j&#039;ai pu découvrir en général l&#039;univers des bases de donnée que je ne connaissais pas auparavant et voir l&#039;importance qu&#039;elles ont dans le monde actuel. Lors de ce projet j&#039;ai vu plus en détail les bases de données orienté graphe. J&#039;ai pu voir qu&#039;elles offraient beaucoup plus d&#039;avantages lors de la manipulation de relations par rapport au base de donnée relationnelles. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai appris à me servir du langage Cypher pour manipuler les bases de donnée avec le système de gestion de base de donnée Neo4j. J&#039;ai trouvé ce langage assez simple à apprendre car le format en ASCII Art le rends très visuel et facile à comprendre.&lt;br /&gt;
&lt;br /&gt;
De plus j&#039;ai beaucoup aimé le fait que l&#039;on puisse observer facilement les résultats de nos manipulations avec l&#039;affichage des bases de données sous forme de graphes.&lt;br /&gt;
&lt;br /&gt;
Egalement j&#039;ai appris différentes manière de calculer la similarité entre des éléments notamment avec l&#039;indice de Jaccard mais j&#039;ai également découvert d&#039;autres moyen de la calculer comme la similarité cosinus, cependant je n&#039;ai pas réussi à l&#039;appliquer.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également découvert que la plupart des bases de données ne sont pas parfaite et possède des données manquantes ou erronée. Pour ceci, il faut fournir un travail supplémentaire pour pouvoir quand même exploiter des résultats malgré les donnée lacunaire.&lt;br /&gt;
&lt;br /&gt;
Au final, j&#039;ai trouvé ce projet très enrichissant et intéressant, j&#039;ai pu voir une partie de toute les possibilité qu&#039;offrait ce type de base de donnée et me rendre compte que savoir les manipuler à haut niveau peut réellement apporter des nouvelles perspective pour la recherche.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12422</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12422"/>
		<updated>2020-05-17T11:40:13Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : &amp;lt;code&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de noeud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définis comme ceci : &amp;lt;code&amp;gt;{nomParametre:valeurParametre}&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont crées ainsi : &amp;lt;code&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de noeuds et d&#039;une relation qui les relient ainsi que le résultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV et mise en place de la base de donnée ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notions de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de donnée sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de donnée&amp;quot; AS line&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos noeuds, relations ou propriété.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai crée ainsi des noeuds et des relations sous la forme : &amp;lt;code&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Genre ont en paramêtre le genre du film (Action, Comedie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai crée des noeuds Utilisateur en relation avec des noeuds Film sous la forme :&amp;lt;code&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mit au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaire.]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouter la requêtes suivante : &amp;lt;code&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le resultat pour les 10 utilisateur les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptible d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtrer les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptible d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptible d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orienté graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importation de la base de donnée sur les patients contaminés et mise en place de la base de donnée ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importer la base de donnée sous la forme : &amp;lt;code&amp;gt;(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Patient eux ont des paramètres sur l&#039;age, date d’apparition des symptômes, le sexe, si le patient a visité Wuhan, si le patient vient de Wuhan et un id.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le résultat suivant en France :&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 700px | thumb | center| On remarque qu&#039;il y a une erreur dans la base de donnée, ils ont mit France en tant que ville]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentiel ===&lt;br /&gt;
&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentiel entre les individus de même ville et si un individu a une date d&#039;apparition des symptôme antérieur à un autre individu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour commencer je ne me suis interéssé qu&#039;aux patients qui posède un date de sypmtome (qui non pas la date &amp;quot;NA&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite il falait trouver un moyen de convertir les chaine de caractere date, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 parametres jour, mois, annee des entiers pour pouvoir comparer les dates. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci j&#039;ai utiliser la fonction split pour suprimer les &amp;quot;/&amp;quot; et les metre dans une liste. &amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai utilisé la fonction SET pour créer les parametres nouveau paramêtres. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai utilisé les requêtes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des même ville et qui on eu des symptômes avant un autre patient pour créer les relations de contamination potentiel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de donnée : ===&lt;br /&gt;
&lt;br /&gt;
Dans les résultats qui suit j&#039;ai enlevé les noeuds qui n&#039;avait pas de date de symptôme car il ne ne fournissent pas d&#039;information. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Gansu en Chine : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_Gansu.png | frame | center | Les individus 89 et 150 ont une date d’apparition des symptôme antérieur à l&#039;individus 151. Ils ont également le même jour d’apparition des symptôme pour cette raison il n&#039;y a pas de lien entre eux.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png | 700px | thumb | center| On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de noeuds) se sont formé sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoise comme Beijin (la capitale de la Chine), Shaanxi ou Tianjin. Bien que cette information est évidente, cela montre que le virus se propage plus facilement dans les lieu avec une forte démographie.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayants visité Wuhan et vivant a Wuhan parmi les infectes pour voir si il y avait une relation. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai calculer le nombre de personne ayants visité Wuhan, venant de Wuhan, ne venant pas de Wuhan et le total des individus dans la base de données, je trouve ce résultat : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png | center]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivait a Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut donc supposer qu&#039;il y a peut être une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venait les premiers infectés (de la base de donné).&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec les résultats de requêtes j&#039;ai trouvé que 27 infecté sur 30 ont été à Wuhan parmi ces premiers infecté ce qui montre bien que l&#039;épidémie a commencé la bas.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays c&#039;est propagé le virus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste des Pays que j&#039;ai trouvé par ordre de contamination à partir de la base de donnée : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
Vous pouvez voir toutes les requêtes que j&#039;ai utilisé lors de ce projet dans le fichier txt dans le lien GitHub ci-dessous : &amp;lt;br/&amp;gt;&lt;br /&gt;
[https://github.com/TheSummer1502/VISI201.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
Documentation sur le langage Cypher&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/docs/cypher-manual/4.0/ https://neo4j.com/docs/cypher-manual/4.0/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pages sur les bases de données :&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données relationelles&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données orienté graphe&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Fonctionement de la similarité de Jaccard :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Neo4j :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/ https://neo4j.com/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Graphendb :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.graphenedb.com/ https://www.graphenedb.com/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A travers ce projet j&#039;ai pu découvrir en général l&#039;univers des bases de donnée que je ne connaissais pas auparavant et voir l&#039;importance qu&#039;elles ont dans le monde actuel. Lors de ce projet j&#039;ai vu plus en détail les bases de données orienté graphe. J&#039;ai pu voir qu&#039;elles offraient beaucoup plus d&#039;avantages lors de la manipulation de relations par rapport au base de donnée relationnelles. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai appris à me servir du langage Cypher pour manipuler les bases de donnée avec le système de gestion de base de donnée Neo4j. J&#039;ai trouvé ce langage assez simple à apprendre car le format en ASCII Art le rends très visuel et facile à comprendre.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai beaucoup aimé le fait que l&#039;on puisse observer facilement les résultats de nos manipulations avec l&#039;affichage des bases de données sous forme de graphes.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également appris différentes manière de calculer la similarité entre des éléments notamment avec l&#039;indice de Jaccard mais j&#039;ai également découvert d&#039;autres moyen de la calculer comme la similarité cosinus, cependant je n&#039;ai pas réussi à l&#039;appliquer.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également découvert que la plupart des bases de données ne sont pas parfaite et possède des données manquantes ou erronée. Pour ceci, il faut fournir un travail supplémentaire pour pouvoir quand même exploiter des résultats malgré les donnée lacunaire.&lt;br /&gt;
&lt;br /&gt;
Au final, j&#039;ai trouvé ce projet très enrichissant et intéressant, j&#039;ai pu voir une partie de toute les possibilité qu&#039;offrait ce type de base de donnée et me rendre compte que savoir les manipuler à haut niveau peut réellement apporter des nouvelles perspective pour la recherche.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12421</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12421"/>
		<updated>2020-05-17T11:37:53Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : &amp;lt;code&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de noeud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définis comme ceci : &amp;lt;code&amp;gt;{nomParametre:valeurParametre}&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont crées ainsi : &amp;lt;code&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de noeuds et d&#039;une relation qui les relient ainsi que le résultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV et mise en place de la base de donnée ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notions de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de donnée sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de donnée&amp;quot; AS line&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos noeuds, relations ou propriété.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai crée ainsi des noeuds et des relations sous la forme : &amp;lt;code&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Genre ont en paramêtre le genre du film (Action, Comedie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai crée des noeuds Utilisateur en relation avec des noeuds Film sous la forme :&amp;lt;code&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mit au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaire.]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouter la requêtes suivante : &amp;lt;code&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le resultat pour les 10 utilisateur les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptible d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtrer les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptible d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptible d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orienté graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importation de la base de donnée sur les patients contaminés et mise en place de la base de donnée ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importer la base de donnée sous la forme : &amp;lt;code&amp;gt;(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Patient eux ont des paramètres sur l&#039;age, date d’apparition des symptômes, le sexe, si le patient a visité Wuhan, si le patient vient de Wuhan et un id.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le résultat suivant en France :&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 700px | thumb | center| On remarque qu&#039;il y a une erreur dans la base de donnée, ils ont mit France en tant que ville]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentiel ===&lt;br /&gt;
&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentiel entre les individus de même ville et si un individu a une date d&#039;apparition des symptôme antérieur à un autre individu.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour commencer je ne me suis interéssé qu&#039;aux patients qui posède un date de sypmtome (qui non pas la date &amp;quot;NA&amp;quot;). &amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite il falait trouver un moyen de convertir les chaine de caractere date, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 parametres jour, mois, annee des entiers pour pouvoir comparer les dates. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci j&#039;ai utiliser la fonction split pour suprimer les &amp;quot;/&amp;quot; et les metre dans une liste. &amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai utilisé la fonction SET pour créer les parametres nouveau paramêtres. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai utilisé les requêtes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des même ville et qui on eu des symptômes avant un autre patient pour créer les relations de contamination potentiel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de donnée : ===&lt;br /&gt;
&lt;br /&gt;
Dans les résultats qui suit j&#039;ai enlevé les noeuds qui n&#039;avait pas de date de symptôme car il ne ne fournissent pas d&#039;information. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Gansu en Chine : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_Gansu.png | frame | center | Les individus 89 et 150 ont une date d’apparition des symptôme antérieur à l&#039;individus 151. Ils ont également le même jour d’apparition des symptôme pour cette raison il n&#039;y a pas de lien entre eux.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png | 700px | thumb | center| On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de noeuds) se sont formé sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoise comme Beijin (la capitale de la Chine), Shaanxi ou Tianjin. Bien que cette information est évidente, cela montre que le virus se propage plus facilement dans les lieu avec une forte démographie.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayants visité Wuhan et vivant a Wuhan parmi les infectes pour voir si il y avait une relation. &amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai calculer le nombre de personne ayants visité Wuhan, venant de Wuhan, ne venant pas de Wuhan et le total des individus dans la base de données, je trouve ce résultat : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png | center]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivait a Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut donc supposer qu&#039;il y a peut être une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venait les premiers infectés (de la base de donné).&amp;lt;br/&amp;gt;&lt;br /&gt;
Avec les résultats de requêtes j&#039;ai trouvé que 27 infecté sur 30 ont été à Wuhan parmi ces premiers infecté ce qui montre bien que l&#039;épidémie a commencé la bas.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays c&#039;est propagé le virus. &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste des Pays que j&#039;ai trouvé par ordre de contamination à partir de la base de donnée : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Code source ==&lt;br /&gt;
Vous pouvez voir toutes les requêtes que j&#039;ai utilisé lors de ce projet dans le fichier txt dans le lien GitHub ci-dessous : &amp;lt;br/&amp;gt;&lt;br /&gt;
[https://github.com/TheSummer1502/VISI201.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
Documentation sur le langage Cypher&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/docs/cypher-manual/4.0/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pages sur les bases de données :&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données relationelles&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_relationnelle]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour les bases de données orienté graphe&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_graphe]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Fonctionement de la similarité de Jaccard :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Neo4j :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://neo4j.com/]&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Site de Graphendb :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://www.graphenedb.com/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
A travers ce projet j&#039;ai pu découvrir en général l&#039;univers des bases de donnée que je ne connaissais pas auparavant et voir l&#039;importance qu&#039;elles ont dans le monde actuel. Lors de ce projet j&#039;ai vu plus en détail les bases de données orienté graphe. J&#039;ai pu voir qu&#039;elles offraient beaucoup plus d&#039;avantages lors de la manipulation de relations par rapport au base de donnée relationnelles. &lt;br /&gt;
&lt;br /&gt;
J&#039;ai appris à me servir du langage Cypher pour manipuler les bases de donnée avec le système de gestion de base de donnée Neo4j. J&#039;ai trouvé ce langage assez simple à apprendre car le format en ASCII Art le rends très visuel et facile à comprendre.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai beaucoup aimé le fait que l&#039;on puisse observer facilement les résultats de nos manipulations avec l&#039;affichage des bases de données sous forme de graphes.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également appris différentes manière de calculer la similarité entre des éléments notamment avec l&#039;indice de Jaccard mais j&#039;ai également découvert d&#039;autres moyen de la calculer comme la similarité cosinus, cependant je n&#039;ai pas réussi à l&#039;appliquer.&lt;br /&gt;
&lt;br /&gt;
J&#039;ai également découvert que la plupart des bases de données ne sont pas parfaite et possède des données manquantes ou erronée. Pour ceci, il faut fournir un travail supplémentaire pour pouvoir quand même exploiter des résultats malgré les donnée lacunaire.&lt;br /&gt;
&lt;br /&gt;
Au final, j&#039;ai trouvé ce projet très enrichissant et intéressant, j&#039;ai pu voir une partie de toute les possibilité qu&#039;offrait ce type de base de donnée et me rendre compte que savoir les manipuler à haut niveau peut réellement apporter des nouvelles perspective pour la recherche.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_liste_pays.png&amp;diff=12420</id>
		<title>Fichier:Resultat liste pays.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_liste_pays.png&amp;diff=12420"/>
		<updated>2020-05-17T11:29:00Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : Rpajean a téléversé une nouvelle version de Fichier:Resultat liste pays.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_liste_pays.png&amp;diff=12419</id>
		<title>Fichier:Resultat liste pays.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_liste_pays.png&amp;diff=12419"/>
		<updated>2020-05-17T11:28:01Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : Rpajean a téléversé une nouvelle version de Fichier:Resultat liste pays.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_Gansu.png&amp;diff=12413</id>
		<title>Fichier:Exemple Gansu.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_Gansu.png&amp;diff=12413"/>
		<updated>2020-05-17T11:12:35Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12408</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12408"/>
		<updated>2020-05-17T10:53:10Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de noeud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définis comme ceci : &lt;br /&gt;
&amp;lt;code&amp;gt;{nomParametre:valeurParametre}&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont crées ainsi : &lt;br /&gt;
&amp;lt;code&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de noeuds et d&#039;une relation qui les relient ainsi que le resultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV et mise en place de la base de donnée ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notions de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de donnée sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de donnée&amp;quot; AS line&amp;lt;/code&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos noeuds, relations ou propriété.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai crée ainsi des noeuds et des relations sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Genre ont en paramêtre le genre du film (Action, Comedie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai crée des noeuds Utilisateur en relation avec des noeuds Film sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/code&amp;gt;&lt;br /&gt;
Les noeuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mit au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaire.]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouter la requêtes suivante :&lt;br /&gt;
&amp;lt;code&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le resultat pour les 10 utilisateur les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptible d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtrer les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptible d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptible d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orienté graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importation de la base de donnée sur les patients contaminés et mise en place de la base de donnée ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importer la base de donnée sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12407</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12407"/>
		<updated>2020-05-17T10:47:03Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de noeud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définis comme ceci : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{nomParametre:valeurParametre}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont crées ainsi : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de noeuds et d&#039;une relation qui les relient ainsi que le resultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV et mise en place de la base de donnée ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notions de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de donnée sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de donnée&amp;quot; AS line&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos noeuds, relations ou propriété.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai crée ainsi des noeuds et des relations sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Genre ont en paramêtre le genre du film (Action, Comedie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai crée des noeuds Utilisateur en relation avec des noeuds Film sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Les noeuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mit au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaire.]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouter la requêtes suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le resultat pour les 10 utilisateur les plus similaires dans l&#039;ordre décroissant : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se ressemblant le plus sont ceux avec l&#039;id 162 et 117 car ce sont les utilisateurs avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recommandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont susceptible d’intéresser ces utilisateurs en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour obtenir une liste de recommandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai filtrer les résultats en prenant les films que l&#039;utilisateur 162 à vu mais pas l&#039;utilisateur 117.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici la liste de films que je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultat_recom_1.png | frame | center | Bridcage, Clerks et Rock sont donc susceptible d’intéresser l&#039;utilisateur 117.]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Dans l&#039;autre sens je trouve : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png | frame | center | Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont donc susceptible d’intéresser l&#039;utilisateur 162.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orienté graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12406</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12406"/>
		<updated>2020-05-17T10:36:16Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de noeud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définis comme ceci : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{nomParametre:valeurParametre}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont crées ainsi : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de noeuds et d&#039;une relation qui les relient ainsi que le resultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV et mise en place de la base de donnée ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notions de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de donnée sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de donnée&amp;quot; AS line&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos noeuds, relations ou propriété.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai crée ainsi des noeuds et des relations sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Genre ont en paramêtre le genre du film (Action, Comedie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai crée des noeuds Utilisateur en relation avec des noeuds Film sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Les noeuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mit au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | none | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
La base de données est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (également appelé coefficient de Jaccard ou coefficient de communauté).&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png | link=https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard | frame | center | Plus l&#039;indice de Jaccard est proche de 1 plus les ensembles sont similaire.]] &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour ceci, j&#039;ai utilisé les commandes suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter // inter est le cardinal de u1 inter u2&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter //nb_u1 est le cardinal de u1&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1 //nb_u2 est le cardinal de u2&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins vu 5 films en commun j&#039;ai ajouter la requêtes suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;WHERE inter &amp;gt;= 5&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Et voici le resultat pour les 10 utilisateur les plus similaires : &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png | frame | none | Les utilisateurs se resemblant le plus sont donc celui avec l&#039;id 162 et celui avec l&#039;id 117 car ce sont les utilisateur avec l&#039;indice de Jaccard le plus proche de 1.]]&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12405</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12405"/>
		<updated>2020-05-17T10:22:13Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de noeud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définis comme ceci : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{nomParametre:valeurParametre}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont crées ainsi : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de noeuds et d&#039;une relation qui les relient ainsi que le resultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV et mise en place de la base de donnée ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notions de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici un lien qui vous mène vers la base de donnée sur les utilisateurs : [https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?] &amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les fonctions suivantes : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LOAD CSV WITH HEADERS FROM &amp;quot;lien de la base de donnée&amp;quot; AS line&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Puis vous pouvez utiliser &amp;quot;line&amp;quot; pour récupérer les données et les utiliser dans vos noeuds, relations ou propriété.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai crée ainsi des noeuds et des relations sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(Film)-[DU_GENRE]-&amp;gt;(Genre)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds films ont en paramètre le nom du film et la date de sortie du film. &amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Genre ont en paramêtre le genre du film (Action, Comedie, Horreur...). &amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour le film Toy Story : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_genre.png | center]] &amp;lt;br/&amp;gt;&lt;br /&gt;
Par la suite j&#039;ai crée des noeuds Utilisateur en relation avec des noeuds Film sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(Utilisateur)-[:A_VU {note}]-&amp;gt;(Film)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Les noeuds Utilisateur ont en paramètre l&#039;id, l&#039;âge, le sexe et le travail de l&#039;utilisateur.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les relations A_VU ont en paramètre la note que l&#039;utilisateur a mit au film.&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour Toy Story :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_utilisateur.png | 400px | thumb | Chaque relation A_VU possède la note de l&#039;utilisateur sur le film relié]]&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_utilisateur.png&amp;diff=12404</id>
		<title>Fichier:Exemple utilisateur.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_utilisateur.png&amp;diff=12404"/>
		<updated>2020-05-17T10:13:53Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_genre.png&amp;diff=12403</id>
		<title>Fichier:Exemple genre.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_genre.png&amp;diff=12403"/>
		<updated>2020-05-17T10:07:37Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12401</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12401"/>
		<updated>2020-05-17T09:54:46Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et des relations) il faut utiliser la fonction CREATE. &amp;lt;br/&amp;gt;&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : &amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;(nomNoeudRacc:labelNoeud {propriétés})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&amp;lt;br/&amp;gt;&lt;br /&gt;
labelNoeud est le nom d&#039;un &amp;quot;type&amp;quot; de noeud.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Les propriétés sont définis comme ceci : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{nomParametre:valeurParametre}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enfin les relations sont crées ainsi : &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-[:NOMRELATION {propriétés}]-&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici un exemple de création de noeuds et d&#039;une relation qui les relient ainsi que le resultat obtenu :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le resultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png | center]]&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12386</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12386"/>
		<updated>2020-05-16T19:45:47Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=12385</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=12385"/>
		<updated>2020-05-16T19:17:31Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Sujets réalisés (2019-2020) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2019--2020: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2018--2019: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2017--2018: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2016--2017: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (1 fois par mois, les jeudi après-midi). [[http://www.lama.univ-savoie.fr/index.php?use=seminaires&amp;amp;&amp;amp;lang=fr&amp;amp;equipe=cmi&amp;amp;annee=1&amp;amp;lang=fr Planning des séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé.&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2019-2020) =&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler, Simon Léonard (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Backtracking, Simon Pichenot (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Transfert de couleur (version 2), Florian Dufaure (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* [[Génération fractale de terrains]], Hugo Rey (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Architectures Orientées Micro-Services, Romain Negro (David Télisson)&lt;br /&gt;
* Apprentissage automatique, Evan L&#039;Huissier (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier, Juliette Neyrat (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Base de données orientées Graphe et similarité]], Romain Pajean (Gérald Cavallini)&lt;br /&gt;
* Modèles d&#039;évolution de populations, Théo Guesdon (Tuteur : Jimmy Garnier)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2019-2020) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
== Compression et transformée de Burrow-Wheeler ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
== Transfert de couleur (version 2) ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération fractale de terrains ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
== Architectures Orientées Micro-Services ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Apprentissage automatique ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Base de données orientées Graphe, similarité et modèles prédictifs ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] (Lucas CHARDONNET)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] (Romain THEODET)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] (Ewan RAKOTOANOSY)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] (Yohann THEPAUT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] (Loïc DORNET)&lt;br /&gt;
* [[Dilemme du prisonnier]] (Christophe CARMAGNAC)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
== Transport optimal par coupe 1D et transfert de couleurs entre images ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération et résolution de labyrinthes II ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== REST + Pub/Sub : protocole hybride pour l’IoT ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
== Dilemme du prisonnier ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]]&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] (Nils Ruet, 2018)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] (Rémi Bouvier, 2018)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] (Robin Wagner, 2018)&lt;br /&gt;
* [[Pavages de Penrose]] (Brunelle Cordier-Pierre-Bès, 2018)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
== [[Pavages de Penrose]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Algorithmes d&#039;analyse syntaxique]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]]&lt;br /&gt;
* [[Traitement d&#039;image]]&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]]&lt;br /&gt;
* [[Calculabilité et modèles de calcul]]&lt;br /&gt;
* [[Génération et résolution de labyrinthes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
== [[Algorithme de rendu de scène 3D par Z-buffer]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
== [[Traitement d&#039;image]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Nim et la théorie des jeux impartiaux]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== Initiation à la démonstration sur ordinateur et certification de logiciel ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Calculabilité et modèles de calcul]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
== [[Génération et résolution de labyrinthes]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== Pavages par polyomino ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12384</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12384"/>
		<updated>2020-05-16T19:16:47Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l’hébergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | none | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage cypher il y a quatre éléments important pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
*Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
*Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
*Les propriétés (Properties) (Les caractéristique spécifique des noeuds et relations)&lt;br /&gt;
*Les fonction permettant de gérer ces objets&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12383</id>
		<title>Base de données orientées Graphe et similarité</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe_et_similarit%C3%A9&amp;diff=12383"/>
		<updated>2020-05-16T19:00:16Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : Page créée avec « Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&amp;#039;utilisation des bases de données est de... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet nous n&#039;allons pas utiliser des bases de données relationnels (qui sont les bases de données les plus courantes) car contrairement à ce qu&#039;indique leur nom, elles ne sont pas efficaces pour gérer les relations. A l&#039;inverse, les bases de données orientés graphe, qui reprennent la théorie des graphes en utilisant de noeuds et des arcs pour représenter et stocker les données, rends ces bases de données très efficace pour traiter les relations. Nous allons utiliser ce type de base de donnée car nous nous intéressons au liens entre les utilisateur et les « produits ». &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité. Nous allons également faire une application des bases de données orienté graphe avec des données sur la contamination de la maladie du COVID-19.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creation de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
[[Fichier:Exemple_requete_ascii.png | frame | Exemple d&#039;une requête sous forme d&#039;ASCII Art en Cypher]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_requete_ascii.png&amp;diff=12382</id>
		<title>Fichier:Exemple requete ascii.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_requete_ascii.png&amp;diff=12382"/>
		<updated>2020-05-16T18:52:45Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=12270</id>
		<title>VISI201 CMI : visite de laboratoire</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=VISI201_CMI_:_visite_de_laboratoire&amp;diff=12270"/>
		<updated>2020-05-12T19:27:37Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Sujets réalisés (2019-2020) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Cours du semestre 2 du parcours CMI Informatique (licence INFO).&lt;br /&gt;
&lt;br /&gt;
* Responsable pour 2019--2020: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2018--2019: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2017--2018: Jacques-Olivier Lachaud&lt;br /&gt;
* Responsable pour 2016--2017: Jacques-Olivier Lachaud&lt;br /&gt;
&lt;br /&gt;
= Descriptif =&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif du module est de faire découvrir les laboratoires, le monde de la recherche et les enseignants-chercheurs et chercheurs, ainsi que la réflexion scientifique. Cela se fait de deux manières. &lt;br /&gt;
&lt;br /&gt;
D&#039;abord, une partie de ce module consiste à assister à des séminaires dédiés aux étudiants CMI Informatique et Mathématique (1 fois par mois, les jeudi après-midi). [[http://www.lama.univ-savoie.fr/index.php?use=seminaires&amp;amp;&amp;amp;lang=fr&amp;amp;equipe=cmi&amp;amp;annee=1&amp;amp;lang=fr Planning des séminaires CMI]]&lt;br /&gt;
&lt;br /&gt;
Ces séminaires &amp;quot;grand public&amp;quot; portent sur des sujets variées en informatique et mathématiques.&lt;br /&gt;
&lt;br /&gt;
Les étudiants choisissent ensuite d&#039;approfondir un sujet proposé par les enseignants, ou un sujet motivé de leur choix (en accord avec le responsable du module). Ce travail se fait en interaction avec un tuteur académique (5-6 contacts au moins). Ce travail personnel tuteuré donne lieu à la rédaction d&#039;une synthèse sur le sujet sous forme d&#039;une page wiki/web, ainsi que d&#039;un mini-exposé.&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2019-2020) =&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler, Simon Léonard (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Backtracking, Simon Pichenot (Tuteur : Pierre Hyvernat)&lt;br /&gt;
* Transfert de couleur (version 2), Florian Dufaure (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* [[Génération fractale de terrains]], Hugo Rey (Tuteur : Jacques-Olivier Lachaud)&lt;br /&gt;
* Architectures Orientées Micro-Services, Romain Negro (David Télisson)&lt;br /&gt;
* Apprentissage automatique, Evan L&#039;Huissier (Tuteur : Tom Hirschowitz)&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier, Juliette Neyrat (Tuteur : Sébastien Tavenas)&lt;br /&gt;
* [[Base de données orientées Graphe, similarité et modèles prédictifs]], Romain Pajean (Gérald Cavallini)&lt;br /&gt;
* Modèles d&#039;évolution de populations, Théo Guesdon (Tuteur : Jimmy Garnier)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2019-2020) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Compression et transformée de Burrow-Wheeler&lt;br /&gt;
* Backtracking &lt;br /&gt;
* Transfert de couleur (version 2)&lt;br /&gt;
* Génération fractale de terrains&lt;br /&gt;
* Architectures Orientées Micro-Services&lt;br /&gt;
* Apprentissage automatique&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier &lt;br /&gt;
* Base de données orientées Graphe, similarité et modèles prédictifs&lt;br /&gt;
&lt;br /&gt;
== Compression et transformée de Burrow-Wheeler ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : La transformée de Burrow-Wheeler est l&#039;étape clé de l&#039;algorithme de compression bzip2. C&#039;est une transformation de texte (suite d&#039;octet) qui ne modifie pas la taille, mais ajoute suffisamment de motifs redondants pour améliorer un autre algorithme de compression (algorithme de Huffman dans le cas de bzip2)&lt;br /&gt;
* Objectif : L&#039;objectif est de comprendre le fonctionnement de cette transformation (et de son inverse) et d&#039;implémenter une version naïve de l&#039;algorithme de compression / décompression et de tester sur quelques exemples. Les améliorations de l&#039;algorithme seront ensuite abordées.&lt;br /&gt;
* Liens : Burrows, Michael; Wheeler, David J. (1994), A block sorting lossless  data compression algorithm, Technical Report 124, Digital Equipment  Corporation [[https://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé et objectif : La notion de &amp;quot;backtracking&amp;quot; est fondamentale en algorithmique : il s&#039;agit essentiellement de tester des solutions partielles à un problème, en revenant en arrière dès qu&#039;une incohérence est découverte. Le point de départ sera le fascicule 4.5b de D. Knuth &amp;quot;Introduction to backtracking&amp;quot; et permettra de se familiariser avec les concepts, la terminology et des exemples, qu&#039;il faudra implémenter. Une suite possible sera la notion de réduction de problèmes et l&#039;algorithme-X qui permet de &amp;quot;factoriser&amp;quot; de nombreux problèmes de backtracking en un seul algorithme.&lt;br /&gt;
* Liens : D. Knuth, &amp;quot;the art of computer programming introduction to  backtracking&amp;quot; [[https://www-cs-faculty.stanford.edu/~knuth/fasc5b.ps.gz PS]]&lt;br /&gt;
&lt;br /&gt;
== Transfert de couleur (version 2) ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous étudierons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Transfert de couleur&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Input !! scope=&amp;quot;col&amp;quot; | Output&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:horseshoe.jpg|200px]] || [[Fichier:horseshoe-fjord-n40.jpg|200px]]&lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:fjord.jpg|200px]] || [[Fichier:fjord-horseshoe-n40.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre la version 1 fait par [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]], comprendre les qualités et limites de l&#039;approche (sur quelle type d&#039;image ça marche assez bien par exemple)&lt;br /&gt;
*# Adapter l&#039;algorithme pour qu&#039;il puisse traiter des images de tailles différentes&lt;br /&gt;
*# Réécrire le code en utilisant la bibliothèque python NUMPY pour accélérer les calculs&lt;br /&gt;
*# Changer les espaces de couleurs utilisés: RGB ne convient pas très bien pour mesurer le coût du transport. Transformer le code pour qu&#039;il puisse utiliser plutôt l&#039;espace [[https://fr.wikipedia.org/wiki/L*a*b*_CIE_1976 L*a*b*]] mieux adapté pour calculer des distances entre couleurs.&lt;br /&gt;
* Liens:&lt;br /&gt;
** la page de [[https://www.lama.univ-savoie.fr/mediawiki/index.php/Transport_optimal_par_coupe_1D_et_transfert_de_couleurs_entre_images Lucas Chardonnet]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération fractale de terrains ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La génération procédurale de terrain est très utilisée en modélisation 3D et dans les jeux vidéos, afin de générer rapidement des paysages pseudo-réalistes que l&#039;on étoffera ensuite de façon plus manuelle. On propose d&#039;étudier et d&#039;implémenter un algorithme classique, dit &amp;quot;algorithme Diamant-Carré&amp;quot;. Cet algorithme récursif permet de générer une carte d&#039;élévation. Selon les paramètres données, le résultat peut ressembler aux cartes d&#039;altitude de haute montagne ou des collines plus douces.&lt;br /&gt;
{| class=&amp;quot;wikitable alternance center&amp;quot;&lt;br /&gt;
 |+ Génération fractale de terrain par algorithme diamand carré&lt;br /&gt;
 |----&lt;br /&gt;
 ! scope=&amp;quot;col&amp;quot; | Elévations générées !! scope=&amp;quot;col&amp;quot; | Colorisation !! scope=&amp;quot;col&amp;quot; | Visualisation 3D &lt;br /&gt;
 |----&lt;br /&gt;
 | [[Fichier:Diamond-Square_texture.png|200px]] || [[Fichier:Diamond-Square_heightmap.png|200px]] || [[Fichier:Terragen.jpg|200px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre et implémenter l&#039;algorithme Diamant-Carré&lt;br /&gt;
*# Comprendre comment paramétrer cet algorithme pour qu&#039;il génère des montagnes bien abrupte à haute altitude ou des collines à basse altitude.&lt;br /&gt;
*# Fabriquer une image de couleur/texture qui va associer des couleurs aux altitudes générées (e.g. forcer du bleu sous l&#039;altitude zero, ajouter de la neige, des lacs, de la forêt)&lt;br /&gt;
*# Générer un fichier 3D (par exemple OBJ) à partir de ces deux images (l&#039;image des hauteurs et l&#039;image des couleurs) pour pouvoir faire de beau rendu 3D (sous blender par exemple)&lt;br /&gt;
* Liens:&lt;br /&gt;
** La page [[https://fr.wikipedia.org/wiki/Algorithme_Diamant-Carr%C3%A9 Wikipedia]] de l&#039;algorithme&lt;br /&gt;
** La page [[https://en.wikipedia.org/wiki/Wavefront_.obj_file Wikipedia]] du format OBJ&lt;br /&gt;
&lt;br /&gt;
== Architectures Orientées Micro-Services ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : David Télisson&lt;br /&gt;
* Résumé : Les architectures des applications logicielles distribuées de grandes envergures ont évolué à partir du début des années 2000, d’une application molithique déployée sur un serveur d’application (JEE, TomCat, etc.)  vers des solutions fortement répartis déployées sous formes de services. On parle alors d’architectures orientées services qui se traduisent par le développement et le déploiement de services logiciels interrogeables via des protocoles dédiés (par exemple SOAP) et des API (REST). Cette tendance, corrélée aux nouvelles méthodes de management des projets informatiques (méthodes agiles, intégration continue, DevOps1), s’est accentué ces dernières années et a fait émergé un « nouveau » paradigme : le micro-service. Plusieurs aspects caractérisent un micro-service :&lt;br /&gt;
** fonctionnalité unique&lt;br /&gt;
** flexibilité technologie&lt;br /&gt;
** équipe de développement réduite&lt;br /&gt;
** déploiement ciblé&lt;br /&gt;
** support de la montée en charge (scalabilité)&lt;br /&gt;
** tests facilités et intégrés au processus de développement (TDD2)&lt;br /&gt;
* Objectifs du projet :&lt;br /&gt;
*# Etudier et comprendre les concepts liés aux micro-services (API, conteneurisation, framework, etc.)&lt;br /&gt;
*# Implémentez un PoC (proof of concept) qui démontre qu’une application peut se construire dynamiquement par agrégation de micro-services développés avec des langages différents (Python, JS et Java), déployés sur des plateformes différentes (Django, Node et Glassfish) et disponibles sous formes de conteneurs dans le cloud (Azure)&lt;br /&gt;
*# Livrable attendu : un tutoriel « à la OpenClassRooms » &lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://mbaron.developpez.com/cours/microservices/introduction-generalites&lt;br /&gt;
** https://openclassrooms.com/fr/courses/4668056-construisez-des-microservices&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Apprentissage automatique ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Tom Hirschowitz&lt;br /&gt;
* Résumé : L&#039;apprentissage automatique est un ensemble de techniques algorithmiques visant à écrire des programmes qui améliorent leurs performances au cours du temps. Le sujet consiste en une initiation à cette idée par l&#039;exemple, à base de ressources telles que https://colah.github.io/posts/2015-08-Backprop et http://neuralnetworksanddeeplearning.com .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Base de données orientées Graphe, similarité et modèles prédictifs ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Gérald Cavallini&lt;br /&gt;
* Résumé : Avec l’avènement du BigDatas, dans bien des cas le choix d’un produit, d’un média, d’un voyage ... ne peut plus être direct. Il s’appuie sur des systèmes de recommandations. L’importance financière de ces systèmes est énorme Amazon estime à 30% les ventes supplémentaires dues à son système de recommandation. Ces systèmes s’appuient sur des calculs statistiques et des algorithmes de recherche de similarité. Ces algorithmes expriment la distance entre des objets, ce qui permet par exemple d’identifier des utilisateurs(consommateurs, électeur ...) similaire et de recommander leurs choix.&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Mettre en œuvre différents algorithmes de recherche de similarité ( similarité de Jaquard, similarité cosinus...) dans une base de donnée orientées Graphe Neo4j. &lt;br /&gt;
*# Proposer un système de recommandation de film à partir de la base MovieLens (Notation de films par des utilisateurs).&lt;br /&gt;
*# Proposer un une validation du modèle prédictif.&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Indice_et_distance_de_Jaccard&lt;br /&gt;
** https://www.machinelearningplus.com/nlp/cosine-similarity/&lt;br /&gt;
** https://neo4j.com/&lt;br /&gt;
** https://movielens.org/&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Neo4j.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* [[Transport optimal par coupe 1D et transfert de couleurs entre images]] (Lucas CHARDONNET)&lt;br /&gt;
* [[Génération et résolution de labyrinthes II]] (Romain THEODET)&lt;br /&gt;
* [[Rest &amp;amp; Pub-Sub : protocole hybride pour l&#039;IoT]] (Ewan RAKOTOANOSY)&lt;br /&gt;
* [[La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;]] (Yohann THEPAUT)&lt;br /&gt;
* [[Initiation à la démonstration sur ordinateur et certification de logiciel]] (Loïc DORNET)&lt;br /&gt;
* [[Dilemme du prisonnier]] (Christophe CARMAGNAC)&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2018-2019) =&lt;br /&gt;
&lt;br /&gt;
* Transport optimal par coupe 1D et transfert de couleurs entre images&lt;br /&gt;
* Génération et résolution de labyrinthes II&lt;br /&gt;
* REST + Pub/Sub : protocole hybride pour l’IoT&lt;br /&gt;
* La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier&lt;br /&gt;
* Dilemme du prisonnier&lt;br /&gt;
&lt;br /&gt;
== Transport optimal par coupe 1D et transfert de couleurs entre images ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le transfert de couleurs de l&#039;image Y vers l&#039;image X consiste à repeindre &amp;quot;au mieux&amp;quot; l&#039;image X avec la palette de couleurs de l&#039;image Y. L&#039;image repeinte X&#039; a alors les mêmes couleurs que l&#039;image Y (mais les pixels ne sont pas répartis pareils). Voir l&#039;exemple de transfert ci-dessous. Il existe plusieurs techniques de transfert de couleurs, mais nous étudierons une technique basée sur le transport optimal. Comme c&#039;est un problème assez difficile dans le cas général, nous verrons une variante dite par coupe 1D, qui simplifiera considérablement le problème de transport.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ex-transfert-couleur-OT.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux couleur, et ce qu&#039;on appelle le transfert de couleurs.&lt;br /&gt;
*# comprendre le principe du transport optimal (discret).&lt;br /&gt;
*# comprendre et décrire le principe du transport optimal par coupe 1D, et comment se fait le calcul du meilleur transport dans ce cas.&lt;br /&gt;
*# Coder un programme de transfert de couleur, qui prend deux images couleurs et réalise le transfert de couleurs.&lt;br /&gt;
*# On pourra ensuite réfléchir à quelques améliorations simples (espace couleur YUV, grouper les pixels).&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** Le vrai &amp;quot;Transport Optimal&amp;quot; est vite très mathématique (ce sont des mesures qui sont transportées), mais on peut l&#039;aborder beaucoup plus simplement dans le cas discret (un nombre fini de valeurs) comme une simple assignation entre deux ensembles.&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Color_mapping Transfert de couleur Wikipedia]]&lt;br /&gt;
** [[https://hal.archives-ouvertes.fr/tel-01246096/file/hdr_hal2.pdf Habilitation de N. Papadakis]] (regardez les images plutôt).&lt;br /&gt;
&lt;br /&gt;
== Génération et résolution de labyrinthes II ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: François Boussion&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter un labyrinthe avec une structure de données simple&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
*# introduire des poids pour varier le labyrinthe&lt;br /&gt;
*# comment faire un labyrinthe sur grille hexagonale avec des tableaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== REST + Pub/Sub : protocole hybride pour l’IoT ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: David Télisson&lt;br /&gt;
* Résumé: L’avènement de l’Internet des Objets (IoT) depuis une dizaine d’années a fait apparaitre des problématiques propres aux protocoles de communications liées à ces objets. En effet, l’échange de données dans ce contexte nécessite de tenir compte (au moins) des paramètres suivant : &lt;br /&gt;
*# Autonomie énergétique souvent limitée&lt;br /&gt;
*# Faible puissance des processeurs et taille réduite de la mémoire &lt;br /&gt;
*# Disponibilité « aléatoire » de l’accès aux réseaux de communication &lt;br /&gt;
&lt;br /&gt;
De nombreux protocoles cohabitent et la littérature du domaine foisonne d’exemples autour des réseaux dédiées (LORA, Sigfox, etc.) et des protocoles applicatifs (OPC-UA, MQTT, CoaP, XMPP) mais force est de constater que dans la réalité, ces solutions ne répondent pas toujours aux besoins des concepteurs qui leurs préfèrent encore le protocole HTTP. Celui-ci offre l’avantage d’implémenter un protocole applicatif (REST) en même temps qu’un protocole de transport de haut niveau (TCP/IP) permettant de passer les pare-feu. Cependant, la version actuel d’HTTP ne répond pas vraiment aux critères énoncés précédemment.&lt;br /&gt;
Depuis quelques années émerge donc l’idée d’enrichir HTTP pour créer un protocole hybride qui mêlerait les avantages de REST avec ceux proposés par les mécanismes de type Publish/Subscribe (MQTT, AMQP, JMS, etc.). En attendant cette éventuelle évolution, peut-on envisager de mettre en place un mécanisme de type Pub/Sub avec le protocole Websocket au-dessus d’HTTP ?&lt;br /&gt;
&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Etudier et faire une synthèse des deux approches : REST et Pub/Sub &lt;br /&gt;
*# Implémentez un PoC (proof of concept) d’une solution hybride qui met en œuvre un mécanisme de Pub/Sub sur Websocket. .&lt;br /&gt;
*# Présenter un protocole de test pour valider ou invalider cette solution&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** https://nsrc.org/workshops/2018/apricot/iot/presentations/mqttvsrest_v4.pdf&lt;br /&gt;
** http://www.tigli.fr/lib/exe/fetch.php?media=cours:tutorial_mqtt_mit_2015_2016.pdf&lt;br /&gt;
** https://openclassrooms.com/fr/courses/3449001-utilisez-des-api-rest-dans-vos-projets-web&lt;br /&gt;
** http://www.lirmm.fr/~tibermacin/ens/ws/expose.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== Algorithmes probabilistes/déterministes pour tester la primalité d&#039;un entier  ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Sébastien Tavenas&lt;br /&gt;
* Pouvoir tester si un entier est un nombre premier semble être une brique de base si l&#039;on souhaite faire de l&#039;arithmétique sur un ordinateur. Le crible d&#039;Érathostène enseigné dans les petites classes se montre beaucoup trop lent en pratique. L&#039;algorithme probabiliste utilisé le plus rapide est le test de Fermat. Or, si on regarde les algorithmes des librairies &amp;quot;génériques&amp;quot;, on peut s&#039;apercevoir que la fonction &#039;mpz_probab_prime_p&#039; de la librairie &#039;gmp&#039; sur c++ utilise un test probabiliste de Miller-Rabin, la fonction &#039;isPrime&#039; de la classe &#039;Prime&#039; dans java utilise aussi un test de Miller-Rabin mais qui est déterminisé, alors que la fonction &#039;isprime&#039; de la librairie &#039;sympy&#039; dans python effectue un test de Miller-Rabin si l&#039;entier est plus petit que 2^64 et un test BPSW fort si l&#039;entier est plus grand. Ainsi, une fonction déjà implémentée de test de primalité peut se tromper ou non, être instantanée ou moins. Que dire alors de l&#039;algorithme polynomial déterministe et toujours correct proposé par AKS?                                                                                                                                                &lt;br /&gt;
* Objectifs :                                                                                                                                                                                                             &lt;br /&gt;
*# Comprendre quelques tests de primalité et comment l&#039;aléatoire est utilisé dans ces algorithmes&lt;br /&gt;
*# Comprendre la notion de nombre pseudopremier qui explique, entre autre, quand il vaut mieux utiliser le test de Fermat ou celui de Miller-Rabin                     &lt;br /&gt;
*# Programmer quelques uns des ces tests et les comparer&lt;br /&gt;
*# Essayer de dérandomiser ces tests à l&#039;aide de hitting-sets précalculés&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Primality_test Tests de primalité]]&lt;br /&gt;
&lt;br /&gt;
== Dilemme du prisonnier ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Gerald Cavallini&lt;br /&gt;
* Résumé: Le dilemme du prisonnier caractérise en théorie des jeux une situation où deux joueurs auraient&lt;br /&gt;
intérêt à coopérer, mais où, en l’absence de communication entre les deux joueurs, chacun choisira&lt;br /&gt;
de trahir l&#039;autre si le jeu n&#039;est joué qu&#039;une fois.&lt;br /&gt;
&lt;br /&gt;
On peut informatiquement modéliser ce dilemme à l’aide de matrices de gains et conserver la&lt;br /&gt;
mémoire des choix de l’adversaire. Ce modèle appliqué à un grand nombre d’individus peut être&lt;br /&gt;
utilisé pour comprendre l’émergence de stratégies stables dans l’économie, l’écologie, l’évolution&lt;br /&gt;
des espèces ...&lt;br /&gt;
&lt;br /&gt;
On peut visualiser spatialement les interactions entre individus en les représentants par des pixels et&lt;br /&gt;
en leurs associant une couleur en fonction de leurs stratégies.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Dilemme.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# Comprendre le dilemme du prisonnier&lt;br /&gt;
*# Comprendre la notion de stratégie&lt;br /&gt;
*# Penser un modèle spatiale pour « opposer » des individus qui appliquent des stratégies différentes&lt;br /&gt;
*# Développer une interface pour visualiser dans le temps l’évolution d’une population d’individus adoptants des stratégies différentes.&lt;br /&gt;
&lt;br /&gt;
* Lien :&lt;br /&gt;
*# [https://fr.wikipedia.org/wiki/Dilemme_du_prisonnier Dilemme du prisonnier Wikipedia]&lt;br /&gt;
*# [http://cormas.cirad.fr/fr/applica/dps.htm Site spécifique]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* [[VISI201 Analyse syntaxique (Tristan Porteries, 2018)]]&lt;br /&gt;
* [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] (Nils Ruet, 2018)&lt;br /&gt;
* [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] (Rémi Bouvier, 2018)&lt;br /&gt;
* [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] (Robin Wagner, 2018)&lt;br /&gt;
* [[Pavages de Penrose]] (Brunelle Cordier-Pierre-Bès, 2018)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2017-2018) =&lt;br /&gt;
&lt;br /&gt;
* Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;&lt;br /&gt;
* Initiation à la démonstration sur ordinateur et certification de logiciel&lt;br /&gt;
* Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau&lt;br /&gt;
* Transformées en distance, diagramme de Voronoi et applications en geometry processing&lt;br /&gt;
* Pavages de Penrose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Segmentation d&#039;image par détection de contours et algorithme &amp;quot;ligne de partage des eaux&amp;quot;]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: La segmentation d&#039;image vise à identifier les régions d&#039;intérêt dans une image. Typiquement, une région d&#039;intérêt est une zone de l&#039;image plutôt homogène (les pixels ont des valeurs proches) et le contour entre deux régions d&#039;intérêt est tracé là où les valeurs subissent de fortes variations. La méthode de segmentation proposée ici suit ce principe en enchaînant deux calculs: (1) un premier traitement calcule une image &amp;quot;gradient&amp;quot; et fabrique une image dont les valeurs élevées correspondent à des zones de fortes variations, (2) le deuxième algorithme voit cette image comme un relief 3D et identifie ses bassins hydrographiques. Cette identification des lignes de partage des eaux permet de découper l&#039;image en ses zones d&#039;intérêt.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# comprendre ce qu&#039;est une image niveaux de gris ou couleur, ce qu&#039;est le gradient d&#039;une image et ce qu&#039;on appelle segmentation d&#039;image.&lt;br /&gt;
*# décrire un algorithme de calcul du gradient d&#039;une image, e.g. le filtre de Sobel, voire les convolutions par dérivées de Gaussienne.&lt;br /&gt;
*# décrire le principe de ligne de partage des eaux (&amp;quot;watershed&amp;quot; en anglais), ses différentes définitions équivalentes, et les différents types d&#039;algorithmes pour la calculer.&lt;br /&gt;
*# Coder un programme de segmentation d&#039;image, qui prend une image (niveaux de gris) en entrée, calcule son gradient, et extrait les bassins de sa ligne de partage des eaux.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Watershed_(image_processing) Watershed Wikipedia]]&lt;br /&gt;
** Luc Vincent and Pierre Soille. Watersheds in digital spaces: an efficient algorithm based on immersion simulations. In IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 13, Num. 6 (1991), pages 583–598 [[https://pdfs.semanticscholar.org/a381/9dda9a5f00dbb8cd3413ca7422e37a0d5794.pdf PDF]]&lt;br /&gt;
&lt;br /&gt;
== [[Initiation à la démonstration sur ordinateur et certification de logiciel]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Laurent Vuillon&lt;br /&gt;
* Résumé: L&#039;idée de ce projet est de se familiariser avec les techniques de fouille de données textuelles à partir des &amp;quot;Exercices de style&amp;quot; de R. Queneau (https://fr.wikipedia.org/wiki/Exercices_de_style). On cherchera à comprendre la structure du vocabulaire du corpus de textes, à utiliser les techniques de TF/IDF pour extraire les mots significatifs du corpus puis à tester les techniques de LDA (Allocation de Dirichlet latente) pour extraire automatiquement les thématiques du corpus afin de construire des regroupements par thème. On pourra également proposer des visualisations des résultats afin de rendre accessible visuellement l&#039;analyse de données produite sur le corpus de documents.&lt;br /&gt;
* Objectifs: Introduction à la fouille de données au travers d&#039;un cas pratique&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
** http://blogperso.univ-rennes1.fr/stephane.tuffery/&lt;br /&gt;
** http://www.editionstechnip.com/en/catalogue-detail/1005/data-mining-et-statistique-decisionnelle.html&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Exploration_de_donn%C3%A9es&lt;br /&gt;
** https://fr.wikipedia.org/wiki/TF-IDF&lt;br /&gt;
** &amp;quot;Recherche d&#039;information : applications, modèles et algorithmes; Data mining, décisionnel et big data&amp;quot; de Amini et Gaussier aux éditions Eyrolles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Transformées en distance, diagramme de Voronoi et applications en geometry processing]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Les nuages de points constituent une source de données géométriques importantes (cf LIDAR scanner, 3D scanner) et qui permet de construire des modèles géométriques 3D d&#039;objets réels. La difficulté est de transformer ces nuages de points en des surfaces (souvent des surfaces triangulées, c&#039;est-à-dire des triangles collés entre eux). Un outil essentiel dans ce processus est la transformée en distance, le diagramme de Voronoi (et son dual la triangulation de Delaunay). A partir de ces outils, des algorithmes existent pour reconstruire les surfaces, estimer la géométrie du nuage de point (sa normale par exemple), etc.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# Comprendre ce qu&#039;est une distance, une transformée en distance, et un diagramme de Voronoi. Comprendre ce qu&#039;est la stabilité d&#039;une fonction.&lt;br /&gt;
*# Identifier les propriétés des diagrammes de Voronoi, de leur dual la triangulation de Delaunay, et comprendre leurs variantes comme les diagrammes de puissance&lt;br /&gt;
*# Identifier le lien avec l&#039;axe médian et les squelettes&lt;br /&gt;
*# Décrire les principaux algorithmes de calcul des transformées en distance et du diagramme de Voronoi, pour des nuages de point quelconques ou pour des nuages de points à coordonnées entières.&lt;br /&gt;
*# Présenter un algorithme de reconstruction de surface utilisant le diagramme de Voronoi&lt;br /&gt;
*# Coder un algorithme de calcul du diagramme de Voronoi et, si le temps le permet, un algorithme de reconstruction de surface.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Voronoi_diagram Diagramme de Voronoi Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Distance_transform Transformée en distance Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Topological_skeleton Squelette Wikipedia]]&lt;br /&gt;
** [[http://dgtal.org/doc/nightly/moduleVolumetric.html Transformées discrètes en distance DGtal]]&lt;br /&gt;
&lt;br /&gt;
== [[Pavages de Penrose]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* Résumé : le &amp;quot;cerf-volant&amp;quot; et la &amp;quot;fléchette&amp;quot; de Penrose sont deux tuiles qui permettent de recouvrir le plan, mais uniquement de manière non-périodique. Autrement dit, les pavages correspondants ne sont pas obtenus en répétant un même motif de     manière régulière. A cause de ceci, il n&#039;est pas évident de générer un tel      pavage. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:P2.png]]&lt;br /&gt;
&lt;br /&gt;
* Objectifs&lt;br /&gt;
*# comprendre les notion de pavage périodique, non périodique et apériodique,&lt;br /&gt;
*# comprendre la méthode &amp;quot;inflation / déflation&amp;quot; pour générer des pavages de    Penrose des différents types,                                                   &lt;br /&gt;
*# comprendre le lien entre les 2 (ou 3) types de pavage de Penrose             &lt;br /&gt;
*# écrire un programme permettant de générer de tels pavages : avec la méthode  &amp;quot;inflation / déflation&amp;quot; et avec la méthode &amp;quot;grille de de Bruijn&amp;quot;&lt;br /&gt;
*# utiliser ces méthodes pour générer d&#039;autres types de pavages apériodique.&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_de_Penrose pavage de Penrose (wikipedia]]&lt;br /&gt;
** [[https://www.maa.org/sites/default/files/pdf/pubs/focus/Gardner_PenroseTilings1-1977.pdf Penrose Tiling (Marting Gardner, en anglais)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Algorithmes d&#039;analyse syntaxique]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Résumé : le code source d&#039;un programme, d&#039;un fichier de configuration d&#039;un serveur de base de données ou le code d&#039;une page web sont des données &#039;&#039;textuelles&#039;&#039; et &#039;&#039;structurées&#039;&#039;. Il est possible de définir exactement quelles données sont correctes, et quelle est leur signification. (Cela est beaucoup plus difficile pour des textes en langue naturelle par exemple.) En ce sens, il est possible de lire, d&#039;interpréter ces données à l&#039;aide d&#039;un programme. On parle &#039;&#039;d&#039;analyseur syntaxique&#039;&#039; ou de &#039;&#039;parseur&#039;&#039;. Il existe de nombreux outils pour faire ça automatiquement, mais il est parfois important (et toujours intéressant) de comprendre les mécanismes correspondant. C&#039;est ce que ce stage propose de faire.&lt;br /&gt;
&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# étudier la formalisation du problème à travers la notion de &#039;&#039;langage&#039;&#039; et les premiers étages de la hiérachie de Chomsky (langages réguliers et grammaires hors contexte).&lt;br /&gt;
*# comprendre le lien entre les langages et les automates (automates finis / automates à pile)&lt;br /&gt;
*# implémenter un parseur &amp;quot;from scratch&amp;quot; et le tester sur des petits exemples simples, &amp;quot;à la main&amp;quot;, soit en calculant &amp;quot;à la volée&amp;quot; la sémantique d&#039;un langage, soit en produisant des &amp;quot;arbres de syntaxe abstraits&amp;quot;, qui pourront être analysés par la suite,&lt;br /&gt;
*# comprendre les restrictions souvent imposées sur les grammaires afin d&#039;améliorer l&#039;efficacité du parseur (&#039;&#039;LL*(k)&#039;&#039;, &#039;&#039;LR&#039;&#039;, etc.)&lt;br /&gt;
*# à partir de là, de nombreuses pistes sont ouvertes :&lt;br /&gt;
*#* essayer d&#039;écrire un petit outils qui puisse lire une grammaire, et générer un parseur pour cette grammaire,&lt;br /&gt;
*#* comparer l&#039;approche &amp;quot;automate&amp;quot; avec l&#039;approche &amp;quot;combinateurs&amp;quot; et &amp;quot;parseur récursifs&amp;quot;&lt;br /&gt;
*#* améliorer l&#039;efficacité des parseurs produits&lt;br /&gt;
*#* ajouter des fonctionnalités,&lt;br /&gt;
*#* ...&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer :&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Parsing page wikipedia &amp;quot;parsing&amp;quot;]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Recursive_descent_parser page wikipedia &amp;quot;recursive descent parser&amp;quot;]]&lt;br /&gt;
** Le livre référence sur le parsing est probablement &amp;quot;Compilers: Principles, Techniques, and Tools&amp;quot; de Aho, Sethi et Ullman (le &amp;quot;dragon book&amp;quot;)&lt;br /&gt;
** [[https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/ exemples de notes cours de compilation]]&lt;br /&gt;
&lt;br /&gt;
= Sujets réalisés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
* [[Algorithme de rendu de scène 3D par Z-buffer]]&lt;br /&gt;
* [[Traitement d&#039;image]]&lt;br /&gt;
* [[Nim et la théorie des jeux impartiaux]]&lt;br /&gt;
* [[Calculabilité et modèles de calcul]]&lt;br /&gt;
* [[Génération et résolution de labyrinthes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sujets proposés (2016-2017) =&lt;br /&gt;
&lt;br /&gt;
== [[Algorithme de rendu de scène 3D par Z-buffer]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le Z-buffer est un algorithme classique de rendu de scène 3D. C&#039;est celui (avec quelques variantes) qui est implémenté dans nos cartes graphiques 3D et qui permet de visualiser des scènes extrêmement complexes en temps réel (typiquement 24 image/s).&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# décrire le principe de la projection 3D vers 2D&lt;br /&gt;
*# décrire la rastérisation des triangles sur une image en pixel&lt;br /&gt;
*# expliquer le principe du Z-buffer qui permet de gérer le fait que certains objets sont cachés par d&#039;autres&lt;br /&gt;
*# expliquer comment les couleurs sont calculées par pixel&lt;br /&gt;
*# indiquer les qualités et limitations de l&#039;algorithme&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# mettre du code démo (WebGL) avec quelques explications sur le pipeline graphique OpenGL&lt;br /&gt;
*# expliquer comment on peut utiliser cet algorithme pour calculer des ombres (shadow map)&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Z-buffer Wikipedia]]&lt;br /&gt;
** [[https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm Scratch a pixel]]&lt;br /&gt;
&lt;br /&gt;
== [[Traitement d&#039;image]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Jacques-Olivier Lachaud&lt;br /&gt;
* Résumé: Le traitement d&#039;image rassemble tous les algorithmes utilisés pour transformer les images, les améliorer, éliminer certaines perturbations, augmenter ou diminuer le contraste, changer les couleurs vers d&#039;autres couleurs, éliminer le flou ou les yeux rouges, faire du cartooning pour un rendu moins photo-réaliste, etc.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# identifier les grandes familles de traitement: restauration, égalisation, élimination du flou de déplacement, segmentation, etc&lt;br /&gt;
*# identifier les grandes familles de techniques: filtrage spatial, filtrage fréquentiel, optimisation, etc&lt;br /&gt;
*# comprendre les points communs et différences entre le traitement des images noir et blanc et le traitement des images couleurs.&lt;br /&gt;
*# choisir un ou deux algorithmes de traitement et les expliquer en détails&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# Coder un algorithme de traitement d&#039;image simple (e.g, un filtrage médian, ou un algo qui transporte les couleurs d&#039;une photo vers une autre photo)&lt;br /&gt;
&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Traitement_d%27images Wikipedia]]&lt;br /&gt;
** [[http://www.ipol.im/ Image Processing on line]] (permet de tester en ligne des algorithmes sur vos images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[Nim et la théorie des jeux impartiaux]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Pierre Hyvernat&lt;br /&gt;
&lt;br /&gt;
* Étudiant : Luca Chapelle&lt;br /&gt;
&lt;br /&gt;
* Le jeu de Nim (aussi appelé jeu des allumettes) est l&#039;un des premiers jeux ayant été analysé mathématiquement (par Charles Bouton en 1901). Les stratégies gagnantes peuvent être calculées en utilisant le développement en base 2 des nombres, et l&#039;opération d&#039;&amp;quot;addition de Nim&amp;quot; (XOR). La théorie de ce type de jeux (jeux &amp;quot;impartiaux&amp;quot;) est assez simple, mais de nombreuses instances de jeux sont encore non résolues.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la théorie du jeu de Nim (et la programmer)&lt;br /&gt;
*# comprendre le théorème de Sprague Grundy qui montre que tout jeu impartial est équivalent à un jeu de nim&lt;br /&gt;
*# regarder quelques autres exemples de tels jeux : jeu de Nim déguisés, ou jeux véritablement différents&lt;br /&gt;
*# programmer une version naịve de recherche de stratégie basée sur le théorème de Sprague-Grundy pour quelques jeux&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeux_de_Nim jeu de Nim]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Sprague-Grundy théorème de Sprague Grundy]&lt;br /&gt;
** [https://fr.wikipedia.org/wiki/Jeu_de_Grundy jeu de Grundy]&lt;br /&gt;
&lt;br /&gt;
== La suite de Conway et la classification périodique des &amp;quot;éléments&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur : Pierre Hyvernat&lt;br /&gt;
* La suite de Conway est la suite suivante : 1 ; 11 ; 21 ; 1211 ; 111221 ; ... Chaque terme est obtenu en &amp;quot;lisant&amp;quot; le terme précédent.                                                                                                                                                            &lt;br /&gt;
** &amp;quot;1&amp;quot; : un &amp;quot;1&amp;quot; -&amp;gt; 11&lt;br /&gt;
** &amp;quot;11&amp;quot; : deux &amp;quot;1&amp;quot; -&amp;gt; 21&lt;br /&gt;
** &amp;quot;21&amp;quot; : un &amp;quot;2&amp;quot;, un &amp;quot;1&amp;quot; -&amp;gt; 1211&lt;br /&gt;
** &amp;quot;1211&amp;quot; : un &amp;quot;1&amp;quot;, un &amp;quot;2&amp;quot;, deux &amp;quot;1&amp;quot; -&amp;gt; 111221&lt;br /&gt;
** etc.&lt;br /&gt;
Cette suite possède des propriétés étonantes données par le théorème &amp;quot;chimique&amp;quot;, le théorème &amp;quot;arithmétique&amp;quot; et le théorème &amp;quot;cosmologique&amp;quot;.&lt;br /&gt;
* Objectifs :                                                                                                                                                                                                                  &lt;br /&gt;
*# comprendre les énoncés de ces théorèmes, et l&#039;idée de la preuve du premier.                    &lt;br /&gt;
*# programmer la suite de Conway pour retrouver la classification des &amp;quot;atomes&amp;quot;&lt;br /&gt;
*# écrire un programme pour calculer expérimentalement une approximation de la constante &amp;quot;lambda&amp;quot; ainsi que des fréquences respectives des différents atomes.&lt;br /&gt;
*# écrire un programme pour calculer la suite de Robinson, une variante plus simple de la suite de Conway&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Conway suite de Conway]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Suite_de_Robinson suite de Robinson]]&lt;br /&gt;
&lt;br /&gt;
== Initiation à la démonstration sur ordinateur et certification de logiciel ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Tom Hirschowitz&lt;br /&gt;
* Résumé: [[https://coq.inria.fr Coq]] est un logiciel de mathématiques sur ordinateur, grâce auquel des programmes élaborés ont pu être certifiés ces dernières années.&lt;br /&gt;
* Objectifs: &lt;br /&gt;
*# prendre en main le logiciel [[https://coq.inria.fr Coq]] de démonstration sur ordinateur,&lt;br /&gt;
*# programmer certaines démonstrations basiques en Coq,&lt;br /&gt;
*# suivre le début du cours [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]],&lt;br /&gt;
* Pour aller plus loin : Software Foundations est un cours assez long et très bien fait, il y aura suffisamment à faire. Eventuellement, selon l&#039;intérêt de l&#039;étudiant, étude des fondements mathématiques de Coq.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://www.cis.upenn.edu/~bcpierce/sf Software Foundations]]&lt;br /&gt;
** [[https://coq.inria.fr Coq]]&lt;br /&gt;
&lt;br /&gt;
== [[Calculabilité et modèles de calcul]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Rodolphe Lepigre&lt;br /&gt;
* Résumé: Une fonction f sur l&#039;ensemble des entiers naturels est dite calculable s&#039;il existe une procedure effective (ou un algorithme) qui permet, étant donné un entier n, de calculer f(n) en temps fini. Il existe divers modèles de calcul qui permettent de représenter toutes les fonctions calculables : machines de Turing, λ-calcul, automates cellulaires, ...&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# comprendre la notion de fonction calculable,&lt;br /&gt;
*# comparer l&#039;ensemble des fonctions à l&#039;ensemble des fonctions calculables,&lt;br /&gt;
*# regarder et comparer quelque modèles de calcul,&lt;br /&gt;
*# programmer un modèle de calcul et comprendre les limitations pratiques.&lt;br /&gt;
&lt;br /&gt;
* Liens pour commencer:&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Calculabilité&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Machine_de_Turing&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Lambda-calcul&lt;br /&gt;
** https://fr.wikipedia.org/wiki/Jeu_de_la_vie&lt;br /&gt;
&lt;br /&gt;
== [[Génération et résolution de labyrinthes]] ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: &amp;lt;strike&amp;gt;Jacques-Olivier Lachaud&amp;lt;/strike&amp;gt; Xavier Provençal&lt;br /&gt;
* Résumé: On veut générer des labyrinthes aussi grands et complexes que possible, avec des murs dans une grille carré voire d&#039;autres domaines. Comment faire pour qu&#039;il y ait toujours un chemin de l&#039;entrée à la sortie ? Comment faire pour qu&#039;il n&#039;y ait qu&#039;un chemin ? Ensuite, comment trouver la sortie quand on est perdu dans le labyrinthe.&lt;br /&gt;
* Objectifs:&lt;br /&gt;
*# Comprendre comment représenter avec une structure de données un labyrinthe&lt;br /&gt;
*# Voir le lien avec la théorie des graphes et voir que le problème se résout de la même façon pour des grilles carrées, hexagonales ou autres.&lt;br /&gt;
*# Comprendre l&#039;algorithme d&#039;arbre couvrant minimum&lt;br /&gt;
*# Comprendre le principe du parcours en profondeur et de la récursivité&lt;br /&gt;
* Pour aller plus loin&lt;br /&gt;
*# coder la génération d&#039;un labyrinthe et sa visualisation&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Mod%C3%A9lisation_math%C3%A9matique_d%27un_labyrinthe Wikipedia]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Maze_generation_algorithm Version anglaise plus complète]]&lt;br /&gt;
&lt;br /&gt;
== Pavages par polyomino ==&lt;br /&gt;
&lt;br /&gt;
* Tuteur: Xavier Provençal&lt;br /&gt;
* Résumé : On s&#039;intéresse aux pavages du plan par des tuiles formées de petits carrés collés les uns aux autres, appelé &amp;quot;polyominos&amp;quot;. Étant donné une tuile, peut-on paver le plan ? Si oui, avec quelles opérations (translation et/ou rotations et/ou réflexions) Une fois un pavage réalisé, on observe ses propriétés. Quelles symétries ? Le pavage est-il identique du point de vue de chacune des tuiles ? Si ce n&#039;est pas le cas, en combien de classes peut-on diviser ces tuiles ?&lt;br /&gt;
On s&#039;intéressera aussi à des propriétés connexes. Au lieu de paver tout le plan, on peut essayer de paver une région finie donnée. Plus localement, peut-on encercler complètement une tuile avec des copies d&#039;elle-même, sans former de trous ? Si oui, peut-on faire de même avec la proto-tuile formée par la tuile de départ et toutes ses copies ? Si oui, combien de fois peut-on répéter l&#039;opération ?&lt;br /&gt;
* Objectifs :&lt;br /&gt;
*# Comprendre les différentes classes de pavages (isohédral, k-isohédral, anisohédral).&lt;br /&gt;
*# Pour chacun des sept types de pavages &amp;quot;isohédraux&amp;quot;, comprendre le lien entre les symétries du pavages et la caractérisation des tuiles qui le réalisent.&lt;br /&gt;
*# Pour un pavage k-isohédral, identifier les &amp;quot;classes d&#039;équivalences&amp;quot; et le &amp;quot;domaine fondamental&amp;quot;.&lt;br /&gt;
* Pour aller plus loin :&lt;br /&gt;
*# Coder la génération de tuiles capables de paver le plan en fonction pour une classe de pavages donnée.&lt;br /&gt;
*# Étudier et implémenter certains algorithmes pour le pavages d&#039;un domaine fini.&lt;br /&gt;
* Liens pour démarrer&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Polyomino Polyomino]]&lt;br /&gt;
** [[https://en.wikipedia.org/wiki/Polyomino Polyomino (en)]]&lt;br /&gt;
** [[https://fr.wikipedia.org/wiki/Pavage_par_des_polygones_r%C3%A9guliers Pavages]]&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12269</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12269"/>
		<updated>2020-05-12T19:24:24Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Graph_films_genres.png | 800x800px]]&lt;br /&gt;
&lt;br /&gt;
On crée des noeuds Utilisateur avec des paramètres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 CREATE (u:Utilisateur)&lt;br /&gt;
SET u.age = toInteger(line.age),&lt;br /&gt;
u.sexe = line.gender,&lt;br /&gt;
u.travail = line.occupation,&lt;br /&gt;
u.idUtilisateur = toInteger(line.id)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir, on ajoute les relations entre les utilisateurs et les films avec comme paramètre la note qu&#039;ils ont donné au film :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/vt28mlhaz129mcb/u.data.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 8000&lt;br /&gt;
MATCH (u:Utilisateur)&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
WHERE u.idUtilisateur = toInteger(line.userid) AND f.idFilm = toInteger(line.itemid)&lt;br /&gt;
CREATE (u)-[:A_VU {note:toInteger(line.rating)}]-&amp;gt;(f)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La base de donée est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (ou coefficient de Jaccard).&lt;br /&gt;
&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png]]&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. Pour ceci, j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film.&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins 5 films en commun ce qui me donne la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, count(distinct f) as inter, u2&lt;br /&gt;
WHERE inter &amp;gt;= 5&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jacard ORDER BY jacard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Et voici le resultat :&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Les utilisateurs se resemblant le plus sont donc celui avec l&#039;id 162 et celui avec l&#039;id 117.&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recomandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont suseptible d&#039;intérerser un des deux utilisateur en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
Pour obtenir une liste de recomandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai utiliser la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f1:Film), (u2)-[:A_VU]-&amp;gt;(f2:Film)&lt;br /&gt;
WHERE u1.idUtilisateur = 162 AND u2.idUtilisateur = 117&lt;br /&gt;
WITH collect(distinct f1.titre) AS l1, collect(distinct f2.titre) AS l2&lt;br /&gt;
RETURN filter(film IN l1 WHERE NOT film IN l2) AS recomandationPrU2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
J&#039;obtient les films suivants :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_1.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Donc Bridcage, Clerks et Rock sont susceptible d&#039;intéresser l&#039;utilisateur 117.&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;autre sens je trouve :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Donc Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont susceptible d&#039;intéresser l&#039;utilisateur 162.&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orienté graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
=== Importation de la base de donnée sur les patients contaminés ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importer la base de donnée sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&lt;br /&gt;
&lt;br /&gt;
J&#039;ai obtenu ceci avec les commandes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/po34ry4oil634yg/COVID19_line_list_data.csv?dl=1&amp;quot; as line &lt;br /&gt;
WITH line LIMIT 800&lt;br /&gt;
MERGE (p:Pays {nom:line.country})&lt;br /&gt;
MERGE (v:Ville {nom:line.location})&lt;br /&gt;
CREATE (pa:Patient)&lt;br /&gt;
SET&lt;br /&gt;
pa.date_symptome = line.symptom_onset,&lt;br /&gt;
pa.age = toInteger(line.age),&lt;br /&gt;
pa.sexe = line.gender,&lt;br /&gt;
pa.a_visite_wuhan = toInteger(line.`visiting Wuhan`),&lt;br /&gt;
pa.id = toInteger(line.id)&lt;br /&gt;
CREATE (pa)-[:RESIDE]-&amp;gt;(v)&lt;br /&gt;
MERGE (v)-[:LOCALISE]-&amp;gt;(p)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les noeuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Patient eux ont des parametres sur l&#039;age, date d&#039;aparition des symptomes, le sexe, si le patient a visité Wuhan et un id.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le resultat suivant en France par exemple : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 1000x1000px]]&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentiel ===&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentiel entre les individus de même ville et selon la date des symptômes.&lt;br /&gt;
&lt;br /&gt;
Pour commencer j&#039;ai regarder tout les patient qui possède un date de symptôme (qui non pas la date &amp;quot;NA&amp;quot;).&lt;br /&gt;
Ensuite il fallait trouver un moyen de convertir les chaîne de caractères date, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 paramètres jour, mois, annee des entiers pour pouvoir comparer les dates.&lt;br /&gt;
Pour ceci j&#039;ai utiliser la fonction split pour supprimer les &amp;quot;/&amp;quot; et les mettre dans une liste. Puis j&#039;ai utilisé la fonction SET pour créer les paramètres. J&#039;ai utilisé les requêtes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des même ville et qui on eu des symptômes avant un autre patient. J&#039;ai utiliser les requêtes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p1:Patient)-[]-&amp;gt;(v:Ville)&amp;lt;-[]-(p2:Patient)&lt;br /&gt;
WHERE (p1.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;) AND (p2.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;) AND ((p2.annee &amp;lt; p1.annee) OR (p2.annee = p1.annee AND p2.mois &amp;lt; p1.mois) OR (p2.annee = p1.annee AND p2.mois = p1.mois AND p2.jour &amp;lt; p1.jour))&lt;br /&gt;
CREATE (p2)-[r:CONTAMINATION_POTENTIEL]-&amp;gt;(p1)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de donnée : ===&lt;br /&gt;
Voici le résultat pour la ville de Sichuan en Chine :&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière. On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de noeuds) se sont formé sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoise comme Beijing (la capitale de la Chine), Shaanxi ou Tianjin. Cela montre que le virus se propage plus facilement dans les lieu avec une forte démographie.&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayants visité Wuhan et vivant a Wuhan parmi les infectés pour voir si il y avait une relation.&lt;br /&gt;
J&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p1:Patient)&lt;br /&gt;
WHERE p1.a_visite_wuhan = 1 AND (p1.vient_de_wuhan = 0 OR p1.vient_de_wuhan IS NULL) //Il y a 1 cas ou a visité wuhan et vient de wuhan = 1&lt;br /&gt;
WITH count(p1) AS nbrWuhan&lt;br /&gt;
MATCH (p2:Patient)&lt;br /&gt;
WHERE (p2.a_visite_wuhan = 0 AND p2.vient_de_wuhan = 0) OR (p2.vient_de_wuhan IS NULL AND p2.a_visite_wuhan = 0) //Il ya 4 cas ou il n&#039;y a pas d&#039;infos sur vient de wuhan&lt;br /&gt;
WITH nbrWuhan, count(p2) AS nbrNonWuhan&lt;br /&gt;
MATCH (p3:Patient)&lt;br /&gt;
WHERE p3.vient_de_wuhan = 1&lt;br /&gt;
WITH nbrWuhan, nbrNonWuhan, count(p3) AS nbrVientDeWuhan&lt;br /&gt;
RETURN nbrWuhan, nbrVientDeWuhan, nbrNonWuhan, nbrWuhan+nbrVientDeWuhan AS totalWuhan, nbrWuhan+nbrNonWuhan+nbrVientDeWuhan AS total&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Le resultat est :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivait a Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan. On peut donc supposer qu&#039;il y a une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venait les premiers infectés (de la base de donné).&lt;br /&gt;
Je peux voir les 30 premiers infectés avec les commandes suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p:Patient)-[r]-&amp;gt;(v:Ville)-[]-&amp;gt;(py)&lt;br /&gt;
WHERE p.date_symptome IS NOT NULL AND p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH v, r, py, p AS liste ORDER BY p.annee,p.mois,p.jour&lt;br /&gt;
RETURN v, py, liste LIMIT 30&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On remarque que 28 infecté sur 30 ont été à Wuhan parmis ces premiers infecté ce qui montre bien que l&#039;épidémie a commencé la bas.&lt;br /&gt;
&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays s&#039;est propagé le virus.&lt;br /&gt;
J&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (pa:Patient)-[]-&amp;gt;(:Ville)-[]-&amp;gt;(p:Pays)&lt;br /&gt;
WHERE pa.date_symptome IS NOT NULL AND pa.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH p AS listePays ORDER BY pa.annee,pa.mois,pa.jour&lt;br /&gt;
RETURN DISTINCT listePays&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Et voici le resultat :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png | center]]&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12268</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12268"/>
		<updated>2020-05-12T19:24:06Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Graph_films_genres.png | 800x800px]]&lt;br /&gt;
&lt;br /&gt;
On crée des noeuds Utilisateur avec des paramètres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 CREATE (u:Utilisateur)&lt;br /&gt;
SET u.age = toInteger(line.age),&lt;br /&gt;
u.sexe = line.gender,&lt;br /&gt;
u.travail = line.occupation,&lt;br /&gt;
u.idUtilisateur = toInteger(line.id)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir, on ajoute les relations entre les utilisateurs et les films avec comme paramètre la note qu&#039;ils ont donné au film :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/vt28mlhaz129mcb/u.data.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 8000&lt;br /&gt;
MATCH (u:Utilisateur)&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
WHERE u.idUtilisateur = toInteger(line.userid) AND f.idFilm = toInteger(line.itemid)&lt;br /&gt;
CREATE (u)-[:A_VU {note:toInteger(line.rating)}]-&amp;gt;(f)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La base de donée est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (ou coefficient de Jaccard).&lt;br /&gt;
&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png]]&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. Pour ceci, j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film.&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins 5 films en commun ce qui me donne la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, count(distinct f) as inter, u2&lt;br /&gt;
WHERE inter &amp;gt;= 5&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jacard ORDER BY jacard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Et voici le resultat :&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Les utilisateurs se resemblant le plus sont donc celui avec l&#039;id 162 et celui avec l&#039;id 117.&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recomandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont suseptible d&#039;intérerser un des deux utilisateur en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
Pour obtenir une liste de recomandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai utiliser la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f1:Film), (u2)-[:A_VU]-&amp;gt;(f2:Film)&lt;br /&gt;
WHERE u1.idUtilisateur = 162 AND u2.idUtilisateur = 117&lt;br /&gt;
WITH collect(distinct f1.titre) AS l1, collect(distinct f2.titre) AS l2&lt;br /&gt;
RETURN filter(film IN l1 WHERE NOT film IN l2) AS recomandationPrU2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
J&#039;obtient les films suivants :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_1.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Donc Bridcage, Clerks et Rock sont susceptible d&#039;intéresser l&#039;utilisateur 117.&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;autre sens je trouve :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Donc Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont susceptible d&#039;intéresser l&#039;utilisateur 162.&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orienté graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
=== Importation de la base de donnée sur les patients contaminés ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importer la base de donnée sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&lt;br /&gt;
&lt;br /&gt;
J&#039;ai obtenu ceci avec les commandes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/po34ry4oil634yg/COVID19_line_list_data.csv?dl=1&amp;quot; as line &lt;br /&gt;
WITH line LIMIT 800&lt;br /&gt;
MERGE (p:Pays {nom:line.country})&lt;br /&gt;
MERGE (v:Ville {nom:line.location})&lt;br /&gt;
CREATE (pa:Patient)&lt;br /&gt;
SET&lt;br /&gt;
pa.date_symptome = line.symptom_onset,&lt;br /&gt;
pa.age = toInteger(line.age),&lt;br /&gt;
pa.sexe = line.gender,&lt;br /&gt;
pa.a_visite_wuhan = toInteger(line.`visiting Wuhan`),&lt;br /&gt;
pa.id = toInteger(line.id)&lt;br /&gt;
CREATE (pa)-[:RESIDE]-&amp;gt;(v)&lt;br /&gt;
MERGE (v)-[:LOCALISE]-&amp;gt;(p)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les noeuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Patient eux ont des parametres sur l&#039;age, date d&#039;aparition des symptomes, le sexe, si le patient a visité Wuhan et un id.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le resultat suivant en France par exemple : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 1000x1000px]]&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentiel ===&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentiel entre les individus de même ville et selon la date des symptômes.&lt;br /&gt;
&lt;br /&gt;
Pour commencer j&#039;ai regarder tout les patient qui possède un date de symptôme (qui non pas la date &amp;quot;NA&amp;quot;).&lt;br /&gt;
Ensuite il fallait trouver un moyen de convertir les chaîne de caractères date, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 paramètres jour, mois, annee des entiers pour pouvoir comparer les dates.&lt;br /&gt;
Pour ceci j&#039;ai utiliser la fonction split pour supprimer les &amp;quot;/&amp;quot; et les mettre dans une liste. Puis j&#039;ai utilisé la fonction SET pour créer les paramètres. J&#039;ai utilisé les requêtes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des même ville et qui on eu des symptômes avant un autre patient. J&#039;ai utiliser les requêtes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p1:Patient)-[]-&amp;gt;(v:Ville)&amp;lt;-[]-(p2:Patient)&lt;br /&gt;
WHERE (p1.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;) AND (p2.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;) AND ((p2.annee &amp;lt; p1.annee) OR (p2.annee = p1.annee AND p2.mois &amp;lt; p1.mois) OR (p2.annee = p1.annee AND p2.mois = p1.mois AND p2.jour &amp;lt; p1.jour))&lt;br /&gt;
CREATE (p2)-[r:CONTAMINATION_POTENTIEL]-&amp;gt;(p1)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exploitation de la base de donnée : ===&lt;br /&gt;
Voici le résultat pour la ville de Sichuan en Chine :&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière. On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de noeuds) se sont formé sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoise comme Beijing (la capitale de la Chine), Shaanxi ou Tianjin. Cela montre que le virus se propage plus facilement dans les lieu avec une forte démographie.&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayants visité Wuhan et vivant a Wuhan parmi les infectés pour voir si il y avait une relation.&lt;br /&gt;
J&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p1:Patient)&lt;br /&gt;
WHERE p1.a_visite_wuhan = 1 AND (p1.vient_de_wuhan = 0 OR p1.vient_de_wuhan IS NULL) //Il y a 1 cas ou a visité wuhan et vient de wuhan = 1&lt;br /&gt;
WITH count(p1) AS nbrWuhan&lt;br /&gt;
MATCH (p2:Patient)&lt;br /&gt;
WHERE (p2.a_visite_wuhan = 0 AND p2.vient_de_wuhan = 0) OR (p2.vient_de_wuhan IS NULL AND p2.a_visite_wuhan = 0) //Il ya 4 cas ou il n&#039;y a pas d&#039;infos sur vient de wuhan&lt;br /&gt;
WITH nbrWuhan, count(p2) AS nbrNonWuhan&lt;br /&gt;
MATCH (p3:Patient)&lt;br /&gt;
WHERE p3.vient_de_wuhan = 1&lt;br /&gt;
WITH nbrWuhan, nbrNonWuhan, count(p3) AS nbrVientDeWuhan&lt;br /&gt;
RETURN nbrWuhan, nbrVientDeWuhan, nbrNonWuhan, nbrWuhan+nbrVientDeWuhan AS totalWuhan, nbrWuhan+nbrNonWuhan+nbrVientDeWuhan AS total&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Le resultat est :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivait a Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan. On peut donc supposer qu&#039;il y a une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venait les premiers infectés (de la base de donné).&lt;br /&gt;
Je peux voir les 30 premiers infectés avec les commandes suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p:Patient)-[r]-&amp;gt;(v:Ville)-[]-&amp;gt;(py)&lt;br /&gt;
WHERE p.date_symptome IS NOT NULL AND p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH v, r, py, p AS liste ORDER BY p.annee,p.mois,p.jour&lt;br /&gt;
RETURN v, py, liste LIMIT 30&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On remarque que 28 infecté sur 30 ont été à Wuhan parmis ces premiers infecté ce qui montre bien que l&#039;épidémie a commencé la bas.&lt;br /&gt;
&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays s&#039;est propagé le virus.&lt;br /&gt;
J&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (pa:Patient)-[]-&amp;gt;(:Ville)-[]-&amp;gt;(p:Pays)&lt;br /&gt;
WHERE pa.date_symptome IS NOT NULL AND pa.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH p AS listePays ORDER BY pa.annee,pa.mois,pa.jour&lt;br /&gt;
RETURN DISTINCT listePays&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Et voici le resultat :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png]]&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12267</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12267"/>
		<updated>2020-05-12T19:22:34Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Graph_films_genres.png | 800x800px]]&lt;br /&gt;
&lt;br /&gt;
On crée des noeuds Utilisateur avec des paramètres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 CREATE (u:Utilisateur)&lt;br /&gt;
SET u.age = toInteger(line.age),&lt;br /&gt;
u.sexe = line.gender,&lt;br /&gt;
u.travail = line.occupation,&lt;br /&gt;
u.idUtilisateur = toInteger(line.id)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir, on ajoute les relations entre les utilisateurs et les films avec comme paramètre la note qu&#039;ils ont donné au film :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/vt28mlhaz129mcb/u.data.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 8000&lt;br /&gt;
MATCH (u:Utilisateur)&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
WHERE u.idUtilisateur = toInteger(line.userid) AND f.idFilm = toInteger(line.itemid)&lt;br /&gt;
CREATE (u)-[:A_VU {note:toInteger(line.rating)}]-&amp;gt;(f)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La base de donée est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (ou coefficient de Jaccard).&lt;br /&gt;
&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png]]&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. Pour ceci, j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film.&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins 5 films en commun ce qui me donne la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, count(distinct f) as inter, u2&lt;br /&gt;
WHERE inter &amp;gt;= 5&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jacard ORDER BY jacard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Et voici le resultat :&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Les utilisateurs se resemblant le plus sont donc celui avec l&#039;id 162 et celui avec l&#039;id 117.&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recomandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont suseptible d&#039;intérerser un des deux utilisateur en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
Pour obtenir une liste de recomandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai utiliser la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f1:Film), (u2)-[:A_VU]-&amp;gt;(f2:Film)&lt;br /&gt;
WHERE u1.idUtilisateur = 162 AND u2.idUtilisateur = 117&lt;br /&gt;
WITH collect(distinct f1.titre) AS l1, collect(distinct f2.titre) AS l2&lt;br /&gt;
RETURN filter(film IN l1 WHERE NOT film IN l2) AS recomandationPrU2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
J&#039;obtient les films suivants :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_1.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Donc Bridcage, Clerks et Rock sont susceptible d&#039;intéresser l&#039;utilisateur 117.&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;autre sens je trouve :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Donc Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont susceptible d&#039;intéresser l&#039;utilisateur 162.&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orienté graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
=== Importation de la base de donnée sur les patients contaminés ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importer la base de donnée sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&lt;br /&gt;
&lt;br /&gt;
J&#039;ai obtenu ceci avec les commandes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/po34ry4oil634yg/COVID19_line_list_data.csv?dl=1&amp;quot; as line &lt;br /&gt;
WITH line LIMIT 800&lt;br /&gt;
MERGE (p:Pays {nom:line.country})&lt;br /&gt;
MERGE (v:Ville {nom:line.location})&lt;br /&gt;
CREATE (pa:Patient)&lt;br /&gt;
SET&lt;br /&gt;
pa.date_symptome = line.symptom_onset,&lt;br /&gt;
pa.age = toInteger(line.age),&lt;br /&gt;
pa.sexe = line.gender,&lt;br /&gt;
pa.a_visite_wuhan = toInteger(line.`visiting Wuhan`),&lt;br /&gt;
pa.id = toInteger(line.id)&lt;br /&gt;
CREATE (pa)-[:RESIDE]-&amp;gt;(v)&lt;br /&gt;
MERGE (v)-[:LOCALISE]-&amp;gt;(p)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les noeuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Patient eux ont des parametres sur l&#039;age, date d&#039;aparition des symptomes, le sexe, si le patient a visité Wuhan et un id.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le resultat suivant en France par exemple : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 1000x1000px]]&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentiel ===&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentiel entre les individus de même ville et selon la date des symptômes.&lt;br /&gt;
&lt;br /&gt;
Pour commencer j&#039;ai regarder tout les patient qui possède un date de symptôme (qui non pas la date &amp;quot;NA&amp;quot;).&lt;br /&gt;
Ensuite il fallait trouver un moyen de convertir les chaîne de caractères date, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 paramètres jour, mois, annee des entiers pour pouvoir comparer les dates.&lt;br /&gt;
Pour ceci j&#039;ai utiliser la fonction split pour supprimer les &amp;quot;/&amp;quot; et les mettre dans une liste. Puis j&#039;ai utilisé la fonction SET pour créer les paramètres. J&#039;ai utilisé les requêtes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des même ville et qui on eu des symptômes avant un autre patient. J&#039;ai utiliser les requêtes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p1:Patient)-[]-&amp;gt;(v:Ville)&amp;lt;-[]-(p2:Patient)&lt;br /&gt;
WHERE (p1.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;) AND (p2.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;) AND ((p2.annee &amp;lt; p1.annee) OR (p2.annee = p1.annee AND p2.mois &amp;lt; p1.mois) OR (p2.annee = p1.annee AND p2.mois = p1.mois AND p2.jour &amp;lt; p1.jour))&lt;br /&gt;
CREATE (p2)-[r:CONTAMINATION_POTENTIEL]-&amp;gt;(p1)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Sichuan en Chine :&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Voici le résultat pour la Chine entière. On remarque que des &amp;quot;Clusters&amp;quot; (regroupements de noeuds) se sont formé sur Wuhan (le foyer de l&#039;épidémie) et sur les plus grosses métropoles chinoise comme Beijing (la capitale de la Chine), Shaanxi ou Tianjin. Cela montre que le virus se propage plus facilement dans les lieu avec une forte démographie.&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel_Chine.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite j&#039;ai décidé de regarder le nombre de personnes ayants visité Wuhan et vivant a Wuhan parmi les infectés pour voir si il y avait une relation.&lt;br /&gt;
J&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p1:Patient)&lt;br /&gt;
WHERE p1.a_visite_wuhan = 1 AND (p1.vient_de_wuhan = 0 OR p1.vient_de_wuhan IS NULL) //Il y a 1 cas ou a visité wuhan et vient de wuhan = 1&lt;br /&gt;
WITH count(p1) AS nbrWuhan&lt;br /&gt;
MATCH (p2:Patient)&lt;br /&gt;
WHERE (p2.a_visite_wuhan = 0 AND p2.vient_de_wuhan = 0) OR (p2.vient_de_wuhan IS NULL AND p2.a_visite_wuhan = 0) //Il ya 4 cas ou il n&#039;y a pas d&#039;infos sur vient de wuhan&lt;br /&gt;
WITH nbrWuhan, count(p2) AS nbrNonWuhan&lt;br /&gt;
MATCH (p3:Patient)&lt;br /&gt;
WHERE p3.vient_de_wuhan = 1&lt;br /&gt;
WITH nbrWuhan, nbrNonWuhan, count(p3) AS nbrVientDeWuhan&lt;br /&gt;
RETURN nbrWuhan, nbrVientDeWuhan, nbrNonWuhan, nbrWuhan+nbrVientDeWuhan AS totalWuhan, nbrWuhan+nbrNonWuhan+nbrVientDeWuhan AS total&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Le resultat est :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_nbr_Wuhan.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On remarque que sur les 800 contaminés, 170 personnes ont visité Wuhan et 143 vivait a Wuhan. Cela nous donne un pourcentage de (313/800)*100 = 39,125% il y a donc plus d&#039;un contaminé sur 3 qui a été à Wuhan. On peut donc supposer qu&#039;il y a une relation entre le fait d&#039;avoir visité ou vécu a Wuhan et d&#039;être contaminé.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
J&#039;ai voulu ensuite regarder d&#039;ou venait les premiers infectés (de la base de donné).&lt;br /&gt;
Je peux voir les 30 premiers infectés avec les commandes suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p:Patient)-[r]-&amp;gt;(v:Ville)-[]-&amp;gt;(py)&lt;br /&gt;
WHERE p.date_symptome IS NOT NULL AND p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH v, r, py, p AS liste ORDER BY p.annee,p.mois,p.jour&lt;br /&gt;
RETURN v, py, liste LIMIT 30&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On remarque que 28 infecté sur 30 ont été à Wuhan parmis ces premiers infecté ce qui montre bien que l&#039;épidémie a commencé la bas.&lt;br /&gt;
&lt;br /&gt;
Enfin j&#039;ai voulu voir dans quel ordre de pays s&#039;est propagé le virus.&lt;br /&gt;
J&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (pa:Patient)-[]-&amp;gt;(:Ville)-[]-&amp;gt;(p:Pays)&lt;br /&gt;
WHERE pa.date_symptome IS NOT NULL AND pa.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH p AS listePays ORDER BY pa.annee,pa.mois,pa.jour&lt;br /&gt;
RETURN DISTINCT listePays&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Et voici le resultat :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_liste_pays.png]]&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_liste_pays.png&amp;diff=12266</id>
		<title>Fichier:Resultat liste pays.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_liste_pays.png&amp;diff=12266"/>
		<updated>2020-05-12T19:22:06Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_nbr_Wuhan.png&amp;diff=12265</id>
		<title>Fichier:Resultat nbr Wuhan.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_nbr_Wuhan.png&amp;diff=12265"/>
		<updated>2020-05-12T19:15:34Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Graphe_contamination_potentiel_Chine.png&amp;diff=12264</id>
		<title>Fichier:Graphe contamination potentiel Chine.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Graphe_contamination_potentiel_Chine.png&amp;diff=12264"/>
		<updated>2020-05-12T19:11:53Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12263</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12263"/>
		<updated>2020-05-12T16:39:16Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Graph_films_genres.png | 800x800px]]&lt;br /&gt;
&lt;br /&gt;
On crée des noeuds Utilisateur avec des paramètres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 CREATE (u:Utilisateur)&lt;br /&gt;
SET u.age = toInteger(line.age),&lt;br /&gt;
u.sexe = line.gender,&lt;br /&gt;
u.travail = line.occupation,&lt;br /&gt;
u.idUtilisateur = toInteger(line.id)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir, on ajoute les relations entre les utilisateurs et les films avec comme paramètre la note qu&#039;ils ont donné au film :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/vt28mlhaz129mcb/u.data.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 8000&lt;br /&gt;
MATCH (u:Utilisateur)&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
WHERE u.idUtilisateur = toInteger(line.userid) AND f.idFilm = toInteger(line.itemid)&lt;br /&gt;
CREATE (u)-[:A_VU {note:toInteger(line.rating)}]-&amp;gt;(f)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La base de donée est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (ou coefficient de Jaccard).&lt;br /&gt;
&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png]]&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. Pour ceci, j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film.&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins 5 films en commun ce qui me donne la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, count(distinct f) as inter, u2&lt;br /&gt;
WHERE inter &amp;gt;= 5&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jacard ORDER BY jacard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Et voici le resultat :&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Les utilisateurs se resemblant le plus sont donc celui avec l&#039;id 162 et celui avec l&#039;id 117.&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recomandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont suseptible d&#039;intérerser un des deux utilisateur en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
Pour obtenir une liste de recomandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai utiliser la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f1:Film), (u2)-[:A_VU]-&amp;gt;(f2:Film)&lt;br /&gt;
WHERE u1.idUtilisateur = 162 AND u2.idUtilisateur = 117&lt;br /&gt;
WITH collect(distinct f1.titre) AS l1, collect(distinct f2.titre) AS l2&lt;br /&gt;
RETURN filter(film IN l1 WHERE NOT film IN l2) AS recomandationPrU2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
J&#039;obtient les films suivants :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_1.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Donc Bridcage, Clerks et Rock sont susceptible d&#039;intéresser l&#039;utilisateur 117.&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;autre sens je trouve :&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Resultat_recom_2.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Donc Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont susceptible d&#039;intéresser l&#039;utilisateur 162.&lt;br /&gt;
&lt;br /&gt;
== Application des bases de données orienté graphes et recherche de similarité sur la contamination du COVID-19 ==&lt;br /&gt;
=== Importation de la base de donnée sur les patients contaminés ===&lt;br /&gt;
Pour étudier les données de la base j&#039;ai importer la base de donnée sous la forme : &amp;lt;br/&amp;gt;&lt;br /&gt;
(Patient)-[:RESIDE]-&amp;gt;(Ville)-[:LOCALISE]-&amp;gt;(Pays)&lt;br /&gt;
&lt;br /&gt;
J&#039;ai obtenu ceci avec les commandes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/po34ry4oil634yg/COVID19_line_list_data.csv?dl=1&amp;quot; as line &lt;br /&gt;
WITH line LIMIT 800&lt;br /&gt;
MERGE (p:Pays {nom:line.country})&lt;br /&gt;
MERGE (v:Ville {nom:line.location})&lt;br /&gt;
CREATE (pa:Patient)&lt;br /&gt;
SET&lt;br /&gt;
pa.date_symptome = line.symptom_onset,&lt;br /&gt;
pa.age = toInteger(line.age),&lt;br /&gt;
pa.sexe = line.gender,&lt;br /&gt;
pa.a_visite_wuhan = toInteger(line.`visiting Wuhan`),&lt;br /&gt;
pa.id = toInteger(line.id)&lt;br /&gt;
CREATE (pa)-[:RESIDE]-&amp;gt;(v)&lt;br /&gt;
MERGE (v)-[:LOCALISE]-&amp;gt;(p)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les noeuds Pays et Villes possède l&#039;unique paramètre &amp;quot;nom&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Les noeuds Patient eux ont des parametres sur l&#039;age, date d&#039;aparition des symptomes, le sexe, si le patient a visité Wuhan et un id.&amp;lt;br/&amp;gt;&lt;br /&gt;
On peut voir le resultat suivant en France par exemple : &amp;lt;br/&amp;gt;&lt;br /&gt;
[[Fichier:Graphe_pays_ville.png | 1000x1000px]]&lt;br /&gt;
&lt;br /&gt;
=== Création de relations de contamination potentiel ===&lt;br /&gt;
J&#039;ai par la suite ajouté des relations de contamination potentiel entre les individus de même ville et selon la date des symptômes.&lt;br /&gt;
&lt;br /&gt;
Pour commencer j&#039;ai regarder tout les patient qui possède un date de symptôme (qui non pas la date &amp;quot;NA&amp;quot;).&lt;br /&gt;
Ensuite il fallait trouver un moyen de convertir les chaîne de caractères date, qui sont sous la forme &amp;quot;mois/jour/année&amp;quot;, en 3 paramètres jour, mois, annee des entiers pour pouvoir comparer les dates.&lt;br /&gt;
Pour ceci j&#039;ai utiliser la fonction split pour supprimer les &amp;quot;/&amp;quot; et les mettre dans une liste. Puis j&#039;ai utilisé la fonction SET pour créer les paramètres. J&#039;ai utilisé les requêtes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p:Patient)&lt;br /&gt;
WHERE p.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;&lt;br /&gt;
WITH split(p.date_symptome, &#039;/&#039;) AS liste,p&lt;br /&gt;
SET p.mois = toInteger(liste[0]), p.jour = toInteger(liste[1]), p.annee = toInteger(liste[2])&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis j&#039;ai comparé les personnes venant des même ville et qui on eu des symptômes avant un autre patient. J&#039;ai utiliser les requêtes suivantes :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (p1:Patient)-[]-&amp;gt;(v:Ville)&amp;lt;-[]-(p2:Patient)&lt;br /&gt;
WHERE (p1.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;) AND (p2.date_symptome &amp;lt;&amp;gt; &amp;quot;NA&amp;quot;) AND ((p2.annee &amp;lt; p1.annee) OR (p2.annee = p1.annee AND p2.mois &amp;lt; p1.mois) OR (p2.annee = p1.annee AND p2.mois = p1.mois AND p2.jour &amp;lt; p1.jour))&lt;br /&gt;
CREATE (p2)-[r:CONTAMINATION_POTENTIEL]-&amp;gt;(p1)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici le résultat pour la ville de Sichuan en Chine :&lt;br /&gt;
[[Fichier:Graphe_contamination_potentiel.png]]&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Graphe_contamination_potentiel.png&amp;diff=12262</id>
		<title>Fichier:Graphe contamination potentiel.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Graphe_contamination_potentiel.png&amp;diff=12262"/>
		<updated>2020-05-12T16:37:25Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Graphe_pays_ville.png&amp;diff=12260</id>
		<title>Fichier:Graphe pays ville.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Graphe_pays_ville.png&amp;diff=12260"/>
		<updated>2020-05-12T16:32:23Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12253</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12253"/>
		<updated>2020-05-12T15:59:34Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Graph_films_genres.png | 800x800px]]&lt;br /&gt;
&lt;br /&gt;
On crée des noeuds Utilisateur avec des paramètres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 CREATE (u:Utilisateur)&lt;br /&gt;
SET u.age = toInteger(line.age),&lt;br /&gt;
u.sexe = line.gender,&lt;br /&gt;
u.travail = line.occupation,&lt;br /&gt;
u.idUtilisateur = toInteger(line.id)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir, on ajoute les relations entre les utilisateurs et les films avec comme paramètre la note qu&#039;ils ont donné au film :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/vt28mlhaz129mcb/u.data.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 8000&lt;br /&gt;
MATCH (u:Utilisateur)&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
WHERE u.idUtilisateur = toInteger(line.userid) AND f.idFilm = toInteger(line.itemid)&lt;br /&gt;
CREATE (u)-[:A_VU {note:toInteger(line.rating)}]-&amp;gt;(f)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La base de donée est prête on peux commencer à créer un système de recommandation.&lt;br /&gt;
&lt;br /&gt;
== Utilisation d&#039;algorithmes de recherche de similarité et système de recommandation ==&lt;br /&gt;
=== Similarité de Jaccard ===&lt;br /&gt;
Une manière de mesurer la similarité entre deux ensemble est de calculer l&#039;indice de Jaccard (ou coefficient de Jaccard).&lt;br /&gt;
&lt;br /&gt;
Pour calculer l&#039;indice de Jaccard on calcule le rapport entre le cardinal (la taille) de l&#039;intersection des ensembles considérés et le cardinal de l&#039;union des ensembles, soit la formule suivante :&lt;br /&gt;
[[Fichier:Formule_sim_jaccard.png]]&lt;br /&gt;
&lt;br /&gt;
En appliquant cette formule aux films vu par les utilisateur, je peux regarder les utilisateurs les plus similaire par rapport au même films qu&#039;ils ont vu. Pour ceci, j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, u2, count(distinct f) as inter&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jaccard ORDER BY jaccard DESC LIMIT 10 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cependant ma base de donnée étant &amp;quot;petite&amp;quot; je trouve que les utilisateurs qui se ressemblent le plus sont ceux ayant vu un même unique film.&lt;br /&gt;
Pour contrer ce problème j&#039;ai ajouter qu&#039;il fallait que les utilisateurs aient au moins 5 films en commun ce qui me donne la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&amp;lt;-[:A_VU]-(u2)&lt;br /&gt;
WITH u1, count(distinct f) as inter, u2&lt;br /&gt;
WHERE inter &amp;gt;= 5&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u1, count(distinct f) as nb_u1, u2,inter&lt;br /&gt;
MATCH (u2)-[:A_VU]-&amp;gt;(f:Film)&lt;br /&gt;
WITH u2, count(distinct f) as nb_u2, u1, inter, nb_u1&lt;br /&gt;
RETURN u1.idUtilisateur, u2.idUtilisateur, inter, nb_u1, nb_u2, inter*1.0/(nb_u1+nb_u2-inter) as jacard ORDER BY jacard DESC LIMIT 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Et voici le resultat :&lt;br /&gt;
[[Fichier:Resultats_sim_jaccard.png]]&lt;br /&gt;
Les utilisateurs se resemblant le plus sont donc celui avec l&#039;id 162 et celui avec l&#039;id 117.&lt;br /&gt;
&lt;br /&gt;
=== Création de liste de recomandation : ===&lt;br /&gt;
Maintenant que j&#039;ai deux utilisateurs similaires je peux trouver des films qui sont suseptible d&#039;intérerser un des deux utilisateur en regardant les films qu&#039;un utilisateur a regardé mais pas l&#039;autre.&lt;br /&gt;
Pour obtenir une liste de recomandation pour l&#039;utilisateur avec l&#039;id 117 j&#039;ai utiliser la requête suivante :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (u1)-[:A_VU]-&amp;gt;(f1:Film), (u2)-[:A_VU]-&amp;gt;(f2:Film)&lt;br /&gt;
WHERE u1.idUtilisateur = 162 AND u2.idUtilisateur = 117&lt;br /&gt;
WITH collect(distinct f1.titre) AS l1, collect(distinct f2.titre) AS l2&lt;br /&gt;
RETURN filter(film IN l1 WHERE NOT film IN l2) AS recomandationPrU2&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
J&#039;obtient les films suivants :&lt;br /&gt;
[[Fichier:Resultat_recom_1.png]]&lt;br /&gt;
Donc Bridcage, Clerks et Rock sont susceptible d&#039;intéresser l&#039;utilisateur 117.&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;autre sens je trouve :&lt;br /&gt;
[[Fichier:Resultat_recom_2.png]]&lt;br /&gt;
Donc Toy Story, Usual Suspect, Mr. Holland&#039;s Opus, Sacré Grall et Aliens sont susceptible d&#039;intéresser l&#039;utilisateur 162.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_recom_2.png&amp;diff=12252</id>
		<title>Fichier:Resultat recom 2.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_recom_2.png&amp;diff=12252"/>
		<updated>2020-05-12T15:58:52Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_recom_1.png&amp;diff=12248</id>
		<title>Fichier:Resultat recom 1.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultat_recom_1.png&amp;diff=12248"/>
		<updated>2020-05-12T15:57:08Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultats_sim_jaccard.png&amp;diff=12247</id>
		<title>Fichier:Resultats sim jaccard.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Resultats_sim_jaccard.png&amp;diff=12247"/>
		<updated>2020-05-12T15:54:29Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Formule_sim_jaccard.png&amp;diff=12246</id>
		<title>Fichier:Formule sim jaccard.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Formule_sim_jaccard.png&amp;diff=12246"/>
		<updated>2020-05-12T15:51:07Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12245</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12245"/>
		<updated>2020-05-12T15:48:06Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Graph_films_genres.png | 800x800px]]&lt;br /&gt;
&lt;br /&gt;
On crée des noeuds Utilisateur avec des paramètres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/piz58gre87s9miu/u.user.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 CREATE (u:Utilisateur)&lt;br /&gt;
SET u.age = toInteger(line.age),&lt;br /&gt;
u.sexe = line.gender,&lt;br /&gt;
u.travail = line.occupation,&lt;br /&gt;
u.idUtilisateur = toInteger(line.id)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir, on ajoute les relations entre les utilisateurs et les films avec comme paramètre la note qu&#039;ils ont donné au film :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/vt28mlhaz129mcb/u.data.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 8000&lt;br /&gt;
MATCH (u:Utilisateur)&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
WHERE u.idUtilisateur = toInteger(line.userid) AND f.idFilm = toInteger(line.itemid)&lt;br /&gt;
CREATE (u)-[:A_VU {note:toInteger(line.rating)}]-&amp;gt;(f)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La base de donée est prête on peux commencer à créer un système de recommandation.&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12244</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12244"/>
		<updated>2020-05-12T15:44:14Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Importer une base de donnée CSV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Graph_films_genres.png | 800x800px]]&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12243</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12243"/>
		<updated>2020-05-12T15:42:04Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Importer une base de donnée CSV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Graph_films_genres.png | 500x500px]]&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12242</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12242"/>
		<updated>2020-05-12T15:40:33Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple_noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Graph_films_genres.png]]&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Graph_films_genres.png&amp;diff=12241</id>
		<title>Fichier:Graph films genres.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Graph_films_genres.png&amp;diff=12241"/>
		<updated>2020-05-12T15:39:08Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : Résultat du graphe des films et leur genres&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Résultat du graphe des films et leur genres&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12240</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12240"/>
		<updated>2020-05-12T15:37:23Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Importer une base de donnée CSV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12239</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12239"/>
		<updated>2020-05-12T15:36:18Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Importer une base de donnée CSV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&amp;lt;br/&amp;gt;&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12238</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12238"/>
		<updated>2020-05-12T15:33:54Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : /* Importer une base de donnée CSV */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notation de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12237</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12237"/>
		<updated>2020-05-12T15:33:12Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notions de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12236</id>
		<title>Base de données orientées Graphe, similarité et modèles prédictifs</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Base_de_donn%C3%A9es_orient%C3%A9es_Graphe,_similarit%C3%A9_et_mod%C3%A8les_pr%C3%A9dictifs&amp;diff=12236"/>
		<updated>2020-05-12T15:30:23Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : Cette page wiki est le résumé de mon travail pour le projet de VISI201 sur les bases de données orienté graphe&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Il y a de nos jours énormément de données a traiter (Big Data) avec internet, et pour pouvoir gérer et analyser ces données l&#039;utilisation des bases de données est devenu primordial. De nos jours, les utilisateurs ne peuvent plus faire directement le choix d&#039;un produit, d’un média... &lt;br /&gt;
Pour cela, la plupart des entreprises utilisent un système de recommandations. Ces systèmes de recommandations utilisent des algorithmes qui identifie des utilisateurs similaires et leurs recommande des éléments susceptible de les intéresser. Ces algorithmes utilisent des base de données orientées graphe et non des bases de données relationnels traditionnels car elles sont beaucoup plus appropriée lorsqu&#039;il s&#039;agit d&#039;exploiter les relations entre les données ce qui est notre cas car nous nous intéressons au liens entre les utilisateur et les « produits ».&lt;br /&gt;
&lt;br /&gt;
L&#039;objectif final de ce projet va être de créer un système de recommandation de film en utilisant les bases de données orienté graphes et des algorithmes de recherche de similarité.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Création de bases de données orienté graphe : ==&lt;br /&gt;
Pour réaliser ce projet, j&#039;ai du créer des bases de données orientées graphe. Pour ce faire, j&#039;ai utilisé le système de gestion de base de données (SGBD) orienté graphe Neo4j. Ce SGBD utilise le langage de requête Cypher qui a la particularité d&#039;être basé sur de l&#039;art ASCII (ASCII Art) pour créer ces requêtes ce qui rends le langage visuel et facile à lire. Pour héberger les bases de données Neo4j , j&#039;ai utilisé l&#039;hebergeur Graphendb.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Exemple_graphe.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Apprentissage du langage Cypher ==&lt;br /&gt;
Dans le langage Cypher il y a quatre éléments importants pour pouvoir créer une base de données orienté graphe :&lt;br /&gt;
-Les Noeuds (Nodes) (Les principales instances)&lt;br /&gt;
-Les relations (Relationships) (Qui relient les noeuds entre eux)&lt;br /&gt;
-Les propriétés (Properties) (Les caracteristique specifique des noeuds et relations)&lt;br /&gt;
-Les fonction permettant de gérer ces objets&lt;br /&gt;
&lt;br /&gt;
=== Créer des noeuds et des relations ===&lt;br /&gt;
Pour créer des noeuds (et les relations) il faut utiliser la fonction CREATE.&lt;br /&gt;
Dans cypher un noeud est composé comme ceci : (nomNoeudRacc:labelNoeud {propriétés})&lt;br /&gt;
nomNoeudRacc est un nom du noeuds raccourci pour le manipuler plus rapidement et facilement dans les requêtes.&lt;br /&gt;
Les propriétés sont definis comme ceci : {nomParametre:valeurParametre}&lt;br /&gt;
Enfin les relations sont crées ainsi : -[:NOMRELATION {propriétés}]-&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Exemple :&lt;br /&gt;
// Création des noeuds&lt;br /&gt;
CREATE (f:Film {titre:&amp;quot;Jurassic Park&amp;quot;})&lt;br /&gt;
CREATE (r:Realisateur {prenom:&amp;quot;Steven&amp;quot;, nom:&amp;quot;Spielberg&amp;quot;, metier:&amp;quot;Realisateur&amp;quot;})&lt;br /&gt;
// Création de la relation&lt;br /&gt;
MATCH (r:Realisateur) WHERE r.nom = &amp;quot;Spielberg&amp;quot;&lt;br /&gt;
MATCH (f:Film) WHERE f.titre = &amp;quot;Jurassic Park&amp;quot;&lt;br /&gt;
CREATE (r)-[rel:REALISE {annee:1993}]-&amp;gt;(f)&lt;br /&gt;
RETURN r,rel,f //Affiche le résultat&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Fichier:Exemple noeuds.png]]&lt;br /&gt;
&lt;br /&gt;
=== Importer une base de donnée CSV ===&lt;br /&gt;
Nous voulons dans ce projet utiliser la base de donnée de MovieLens qui donne la notions de films par des utilisateurs. Le format de cette base de donnée est CSV et à une en-tête (header).&lt;br /&gt;
Pour importer cette base dans Neo4j j&#039;ai utilisé les commandes suivantes :&lt;br /&gt;
On commence par créer des noeuds films avec des paramètres:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 200 &lt;br /&gt;
CREATE (f:Film)&lt;br /&gt;
SET f.titre = line.title,&lt;br /&gt;
f.idFilm = toInteger(line.id),&lt;br /&gt;
f.date = line.release&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on crée des noeuds Genre avec des paramètres:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250 &lt;br /&gt;
WHERE line.action = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Action&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
LOAD CSV WITH HEADERS FROM &amp;quot;https://www.dropbox.com/s/fq44x3m11y9yozs/u.item.csv?dl=1&amp;quot; as line&lt;br /&gt;
fieldterminator &#039;|&#039; WITH line LIMIT 250  &lt;br /&gt;
WHERE line.adventure = &amp;quot;1&amp;quot;&lt;br /&gt;
CREATE (:Genre{genre:&amp;quot;Aventure&amp;quot;, idGenre:toInteger(line.id)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
On utilise cette requête pour chaque genre&lt;br /&gt;
&lt;br /&gt;
On crée les relations entre les Films et les Genres :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
MATCH (f:Film)&lt;br /&gt;
MATCH (g:Genre)&lt;br /&gt;
WHERE f.idFilm = g.idGenre&lt;br /&gt;
CREATE (f)-[:DU_GENRE]-&amp;gt;(g)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peux observer le résultat avec la commande :&lt;br /&gt;
MATCH (f:Film)-[r]-&amp;gt;(g:Genre)&lt;br /&gt;
RETURN f,r,g LIMIT 50&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_noeuds.png&amp;diff=12235</id>
		<title>Fichier:Exemple noeuds.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_noeuds.png&amp;diff=12235"/>
		<updated>2020-05-12T15:23:06Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : Exemple d&amp;#039;un noeud et d&amp;#039;une relation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Exemple d&#039;un noeud et d&#039;une relation&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_graphe.jpg&amp;diff=12234</id>
		<title>Fichier:Exemple graphe.jpg</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Exemple_graphe.jpg&amp;diff=12234"/>
		<updated>2020-05-12T15:08:18Z</updated>

		<summary type="html">&lt;p&gt;Rpajean : Un exemple de graphe sous Neo4j&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Un exemple de graphe sous Neo4j&lt;/div&gt;</summary>
		<author><name>Rpajean</name></author>
	</entry>
</feed>