<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Alexis ANZIEU on Medium]]></title>
        <description><![CDATA[Stories by Alexis ANZIEU on Medium]]></description>
        <link>https://medium.com/@alexis.anzieu?source=rss-2a675b8be6a6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*bjOYOO9Z4KYEp9hR35n-GA.jpeg</url>
            <title>Stories by Alexis ANZIEU on Medium</title>
            <link>https://medium.com/@alexis.anzieu?source=rss-2a675b8be6a6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 24 Jun 2026 02:23:22 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@alexis.anzieu/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[La sérendipité dans les algorithmes de recommandation.]]></title>
            <link>https://medium.com/@alexis.anzieu/la-s%C3%A9rendipit%C3%A9-dans-les-algorithmes-de-recommandation-82131cb4e079?source=rss-2a675b8be6a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/82131cb4e079</guid>
            <category><![CDATA[serendipity]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Alexis ANZIEU]]></dc:creator>
            <pubDate>Thu, 06 Jun 2019 17:49:35 GMT</pubDate>
            <atom:updated>2019-06-06T17:49:35.545Z</atom:updated>
            <content:encoded><![CDATA[<p><a href="https://medium.com/ssense-tech/introducing-serendipity-into-recommendation-algorithms-fb92af88ee0b"><em>Article original posté sur SSENSE-tech</em></a><em> (en anglais).</em></p><p>Commençons tout d’abord par définir le terme ‘sérendipité’ tel que décrite par <a href="https://www.merriam-webster.com/dictionary/serendipity">Merriam-Webster</a></p><blockquote>“la faculté ou le phénomène permettant de trouver des choses précieuses ou agréables non recherchées”.</blockquote><p>Pour citer le travail de Tammera M. Race et Stephann Makri, du livre</p><p><a href="https://books.google.ca/books?id=5m57AwAAQBAJ">‘Accidental Information Discovery’</a>:</p><blockquote><em>“</em>La sérendipité nous aide à innover, à être créatif, en nous offrant des ponts à travers et au-delà nos structures créées. Nous avons besoin de sérendipité quelque soit nos actions, “nous avons besoin d’idées dont nous ne pouvions même pas deviner le besoin”. Les découvertes accidentelles modifient notre façon de penser, nous aident à voir les problèmes différemment et à relancer les liens entre différents domaines de connaissances<em>”</em></blockquote><p>Ayant à l’esprit les découvertes accidentelles, de nombreux éléments fortuits de la vie quotidienne ont fourni des résultats percutants dans divers domaines tels que l’astronomie, la géographie, la physique, la pharmacologie et la nanotechnologie. L’un des exemples les plus remarquables reste peut-être celui d’Isaac Newton, recevant une pomme sur la tête, lui permettant ainsi de découvrir la loi de la gravitation universelle. Maintenant que la sérendipité est définie dans notre contexte, voyons son lien avec les algorithmes de recommandation.</p><h3>Le processus et le but des algorithmes de recommandation</h3><p>Les algorithmes de recommandation constituent depuis quelques années la base de nos activités en ligne. Lorsque nous regardons un film sur Netflix, écoutons de la musique sur Spotify, recherchons un sujet sur Google ou commandons une course sur Uber, nos données sont soigneusement enregistrées et stockées dans d’énormes centres de données.</p><p>Prenons l’exemple de Netflix. Les données ne sont pas simplement utilisées dans le but d’afficher votre historique. Elles sont surtout principalement utilisées par un algorithme de recommandation afin de générer… des recommandations. Grâce à l’historique du dernier week-end passé à regarder Netflix sur votre sofa, il sera en mesure de prédire le prochain film ou la prochaine émission de télévision que vous pourriez apprécier. Et ce n’est pas un secret, Netflix explique son algorithme de recommandation sur son propre <a href="https://help.netflix.com/en/node/100639">site</a>. Afin de nous pousser à continuer de payer notre abonnement, une liste de films susceptible de nous intéresser est primordiale. Un film indépendant, un péplum, un nouvel Avengers? <strong>Notre double numérique est notre meilleur conseiller.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*a0mUEoEK8gDt9d5t" /><figcaption>Page d’accueil de <a href="https://www.netflix.com">Netflix</a>, incluant une section “Recommandés pour vous”</figcaption></figure><p>Nos recommandations Google et YouTube sont non seulement influencées par nos recherches précédentes, mais nos fils d’actualité Twitter et Facebook le sont également, classés de manière à présenter des informations susceptibles de nous captiver. Plus nous restons sur les réseaux sociaux, plus ces derniers gagnent de l’argent. De manière cyclique, plus ils gagnent d’argent, plus ils optimisent leurs algorithmes de recommandation, etc. Le but principal d’Internet était à l’origine d’ouvrir la porte à un monde de découvertes, mais il se limite aujourd’hui à aider ses utilisateurs à explorer leur propre cerveau au profit d’autrui.</p><p>Les algorithmes des médias sociaux, notamment Facebook, permettent de classer en haut de votre flux ce que vous aimerez probablement le plus. De ce fait, votre fil d’actualité Facebook constitue un exemple parfait de <a href="https://www.theguardian.com/science/blog/2017/dec/04/echo-chambers-are-dangerous-we-must-try-to-break-free-of-our-online-bubbles">chambres d’écho</a>. Bien qu’en théorie, filtrer ce qui vous intéresse le plus est logique, cela a un prix.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*eydnVU4lDXIKy_aL" /><figcaption><a href="https://www.youtube.com/watch?v=Zk1o2BpC79g">Illustration d’une chambre d’écho</a></figcaption></figure><p>L’élection présidentielle américaine de 2016 est un exemple pertinent de chambre d’écho. Beaucoup ont été choqués par le résultat compte tenu des pensées et des opinions partagées en ligne au sein de leurs réseaux. Cependant, en raison des algorithmes de recommandation, ceux qui se trouvaient dans une situation similaire recevaient simplement des itérations de leurs propres idées et croyances. <strong>En fin de compte, cette régurgitation de nos propres centres d’intérêts met clairement en évidence la nécessité d’implémenter une certaine sérendipité dans les algorithmes de recommandation.</strong></p><h3>Le besoin de sérendipité</h3><p>Bien qu’il soit peut-être plus facile de rester dans sa zone de confort idéologique, il est avantageux d’embrasser la sérendipité.</p><p>Que cela nous plaise ou non, nous baignons tous les jours dans celle-ci. Par exemple, à la maison lorsque vous recherchez un objet en spécifique et que vous en retrouvez un précédemment perdu. Ou le soir lorsque l’on cherche un ami mais finissons par en trouver un autre avec qui la discussion s’avèrera être ennuyeuse. En effet, sérendipité n’est pas synonyme de découverte heureuse, mais peut produire des résultats à la fois négatifs et positifs.</p><p>Par conséquent, un algorithme de recommandation efficace devrait non seulement recommander ce que nous sommes susceptibles d’apprécier, mais également suggérer des éléments aléatoires et objectifs afin de nous aider à garder une fenêtre ouverte sur d’autres mondes et de nouveaux domaines. Bien que ce soit une solution peu commune à considérer, un algorithme de dé-recommandation pourrait faire office de recommandation ultime.</p><h3>Les recommandations chez SSENSE</h3><p>Chez SSENSE, nous nous efforçons quotidiennement à remettre en question le statu quo et à adopter de nouveaux concepts et idéaux technologiques. Bien qu’une grande partie de notre succès soit attribuée à nos données, il reste toujours une place dans nos processus pour y injecter un peu de sérendipité.</p><p>Un moyen simple pour nous d’introduire de la sérendipité porterait sur le processus d’achats en ligne, qui reposent actuellement principalement sur l’historique de l’utilisateur. Imaginez une interface inspirée par les applications de rencontres sur laquelle nous pourrions émettre un jugement binaire — aimer ou pas — des recommandations quelque peu aléatoires de vêtements ou de chaussures. Les façons dont cela pourrait être mis en œuvre sont nombreuses.</p><h3>Inviter la Sérendipité dans votre vie de tous les jours</h3><p>Les avantages d’inclure des éléments inconnus dans votre journée sont légions, n’hésitez donc pas à lire un article au hasard en ligne — <a href="https://en.wikipedia.org/wiki/Special:Random">voici un moyen facile</a> — ou à emprunter un livre au hasard dans votre bibliothèque. Introduire la sérendipité dans votre quotidien peut vous aider à mieux vous comprendre et à mieux comprendre vos motivations.</p><p>J’ai récemment lu le livre <a href="https://www.amazon.ca/Hidden-Life-Trees-Communicate-Discoveries-Secret/dp/1771642483">The Hidden Life of Trees</a> (La vie cachée des arbres) et découvert de nombreux liens entre le sujet traité et mes modèles de conception d’ingénierie logicielle. Ces découvertes accidentelles sont toutes dues à la lecture de ce livre, sans rapport explicite, sur la façon dont les arbres communiquent entre eux. “Le Biomimétisme algorithmique” pour prochain article ? Essayez donc.</p><p>Merci d’avoir lu, en vous souhaitant une journée pleine de serendipité !</p><p>Contenu éditorial révisé par <a href="https://medium.com/@lielatoure">Liela Touré</a> &amp; <a href="https://medium.com/@sanyal.prateek">Prateek Sanyal</a></p><p>À la recherche d’opportunité chez nous ? <a href="https://www.ssense.com/fr-ca/carrieres">Cliquez ici</a> pour voir tous les postes à pourvoir chez SSENSE !</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=82131cb4e079" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introducing Serendipity into Recommendation Algorithms]]></title>
            <link>https://medium.com/ssense-tech/introducing-serendipity-into-recommendation-algorithms-fb92af88ee0b?source=rss-2a675b8be6a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/fb92af88ee0b</guid>
            <category><![CDATA[serendipity]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[tech]]></category>
            <category><![CDATA[recommender-systems]]></category>
            <category><![CDATA[data]]></category>
            <dc:creator><![CDATA[Alexis ANZIEU]]></dc:creator>
            <pubDate>Thu, 06 Jun 2019 14:01:00 GMT</pubDate>
            <atom:updated>2019-08-01T21:47:26.156Z</atom:updated>
            <cc:license>http://creativecommons.org/licenses/by/4.0/</cc:license>
            <content:encoded><![CDATA[<p>Let us first unpack the term ‘serendipity’. <a href="https://www.merriam-webster.com/dictionary/serendipity">Merriam-Webster</a> defines it as</p><blockquote>“the faculty or phenomenon of finding valuable or agreeable things not sought for”.</blockquote><p>To quote the work of Tammera M. Race and Stephann Makri, from the novel <a href="https://books.google.ca/books?id=5m57AwAAQBAJ">‘Accidental Information Discovery’</a>:</p><blockquote><em>“serendipity helps us to innovate, to be creative, by offering us bridges across and beyond our created structures. We need serendipity in action, ‘we need ideas we can’t possibly guess that we need.’ Accidental discoveries shift our thinking, helping us to view issues and problems differently, and jumpstarting connections between fields of knowledge.”</em></blockquote><p>With accidental discoveries in mind, many serendipitous elements of everyday life have provided impactful findings in <a href="https://newhumanist.org.uk/articles/4852/science-and-serendipity-famous-accidental-discoveries">diverse fields</a> such as astronomy, geography, physics, pharmacology, and nanotechnology. Perhaps one of the most notable examples remains Isaac Newton being struck by a falling apple, thereby prompting his discovery of the law of universal gravitation. Now, having defined serendipity in our context, let’s explore how it intersects with recommendation algorithms.</p><h3>The Process and Purpose of Recommendation Algorithms</h3><p>For some years now, recommendation algorithms have been the basis of our online activities. When we watch a show on Netflix, listen to music on Spotify, search for something on Google or request a ride with Uber, our activity data is carefully recorded and stored within huge data-centers.</p><p>Using the example of Netflix, the data is used for much more than to simply display your viewing history. The viewing history is used by a recommendation algorithm in order to generate, well, recommendations. Thanks to the history of a weekend spent binging Netflix on the sofa, Netflix will be able to predict the next movie or tv show you might appreciate. And this is no secret, Netflix explains their recommendation algorithms in their own words <a href="https://help.netflix.com/en/node/100639">here</a>. In order for us to continue our subscription, an engaging and interesting suggested list of movies and films is paramount. An independent film, a peplum, something from the Avengers series? Who better to take a recommendation from than yourself! <strong>Our digital double is our best advisor.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*a0mUEoEK8gDt9d5t" /><figcaption><a href="https://www.netflix.com">Netflix</a> homepage, including “Top Picks for you” section</figcaption></figure><p>Our taste in almost everything has been overtaken by these recommendation engines for many years now. Not only are our Google and YouTube recommendations influenced by our previous searches, but our Twitter and Facebook newsfeeds are similarly sorted to showcase information that may captivate us. The longer we stay on social networks, the more money they earn. In a cyclical fashion, the more money they make, the more they’re able to optimize their recommendation algorithms, and so on. The Internet’s main goal was originally to open the door to a world of discovery, but today it is reduced to assisting its users to explore their own brains at the profit of someone else.</p><p>Social media’s algorithms, Facebook’s in particular, functions to sort what you will most probably ‘like’ to the top of your feed. Which leads to your Facebook newsfeed acting as a perfect example of <a href="https://www.theguardian.com/science/blog/2017/dec/04/echo-chambers-are-dangerous-we-must-try-to-break-free-of-our-online-bubbles">echo chambers</a>. While in theory, filtering what you are most likely to enjoy makes sense, it comes at a price.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*eydnVU4lDXIKy_aL" /><figcaption><a href="https://www.youtube.com/watch?v=Zk1o2BpC79g">Echo chamber illustration</a></figcaption></figure><p>One pertinent example of echo chambers that might come to mind is the 2016 US Presidential election. Many were shocked by the outcome given the thoughts and opinions shared online within their networks. However, due to recommendation algorithms, those who found themselves in a similar situation were simply being fed iterations of their own ideas and beliefs. <strong>Ultimately, this regurgitation of your own interests clearly highlights the necessity to have serendipity within recommendation algorithms.</strong></p><h3><strong>The Need for Serendipity</strong></h3><p>While it may be easier to remain in one’s ideological comfort zone, there are benefits to embracing the serendipitous in this way.</p><p>Whether we like it or not, we actually bathe in this serendipity everyday. For example, at home when looking for a specific item only to come face to face with a previously lost object instead. Or in the evening when we look for a friend, but end up finding another one with whom the discussion turns out to be boring. Indeed, serendipity is not synonymous with happy discoveries but can produce both negative and positive outcomes.</p><p>Therefore, an effective recommendation algorithm should not only recommend what we are likely to appreciate but also suggest random yet objective elements to help keep an open window to other worlds and to new discoveries. Albeit an uncommon solution to consider, but perhaps a de-recommendation algorithm may very well provide the ultimate recommendation sequence.</p><h3><strong>Recommendations at SSENSE</strong></h3><p>At SSENSE, we continuously strive to question the status quo and embrace new technological concepts and ideals. While part of our success is attributed to being highly data driven, there is always room for serendipity to be injected into the workflow.</p><p>A simple way for us to potentially introduce serendipity into our online shopping experience would be to add an element of randomness into our recommender engines which are currently based on historical user behaviour. Imagine a dating-app inspired interface where one could pass a binary judgement — like or dislike — on somewhat randomized recommendations of clothing or footwear. The ways in which this could be implemented are endless.</p><h3><strong>Introduce Serendipity into the Everyday</strong></h3><p>With the undeniable benefits of introducing this level of the unknown into your day, don’t hesitate to read a random article online — <a href="https://en.wikipedia.org/wiki/Special:Random">here’s</a> one easy way — or rent a book at random from your library. Introducing serendipity into your day-to-day might help you better understand yourself and your motivations.</p><p>I recently read the book <a href="https://www.amazon.ca/Hidden-Life-Trees-Communicate-Discoveries-Secret/dp/1771642483"><em>The Hidden Life Of Trees</em></a> and discovered multiple links between the subject matter and my software engineering design patterns. These accidental discoveries are all thanks to reading a seemingly unrelated novel on how trees communicate with one another. “Biomimicry in algorithms”<em> </em>as a new article? Just give it a try.</p><p>Thanks for reading and have a wonderfully serendipitous day!</p><p>Editorial reviews by <a href="https://medium.com/@deanna.chow">Deanna Chow</a>, <a href="https://medium.com/@lielatoure">Liela Touré</a> &amp; <a href="https://medium.com/@sanyal.prateek">Prateek Sanyal</a></p><p>Want to work with us? Click <a href="https://www.ssense.com/en-ca/careers">here</a> to see all open positions at SSENSE!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fb92af88ee0b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/ssense-tech/introducing-serendipity-into-recommendation-algorithms-fb92af88ee0b">Introducing Serendipity into Recommendation Algorithms</a> was originally published in <a href="https://medium.com/ssense-tech">SSENSE-TECH</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[S’amuser avec le Machine Learning ! Part2]]></title>
            <link>https://medium.com/@alexis.anzieu/samuser-avec-le-machine-learning-part2-41974ee1f586?source=rss-2a675b8be6a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/41974ee1f586</guid>
            <category><![CDATA[mario]]></category>
            <category><![CDATA[tensorflow]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Alexis ANZIEU]]></dc:creator>
            <pubDate>Fri, 09 Mar 2018 11:12:05 GMT</pubDate>
            <atom:updated>2018-03-09T12:55:11.330Z</atom:updated>
            <content:encoded><![CDATA[<h4>Se servir du machine learning afin de créer un niveau dans Super Mario</h4><p><em>Cet article ne nécessite pas de connaissances mathématiques &amp; informatiques.( texte original :</em><a href="https://medium.com/@ageitgey/machine-learning-is-fun-part-2-a26a10b68df3">https://medium.com/@ageitgey/machine-learning-is-fun-part-2-a26a10b68df3</a><em> )</em></p><h3>Préface</h3><p>Ayant tout d’abord voulu écrire un article sur l’Intelligence Artificielle, je me suis rendu compte qu’il en existait déjà de très bons, mais malheureusement peu accessibles à ceux ne pratiquant pas l’anglais technique. De nombreuses lectures plus tard, j’ai finalement contacté <a href="https://twitter.com/ageitgey">Adam Geitgey</a> afin de savoir si je pouvais officiellement traduire sa série de papiers. Après m’avoir envoyé une réponse positive et validé mes retouches, voici ma seconde partie (d’autres suivront). Bonne lecture !</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/0*dLFA_mD1kw9Sm71A." /><figcaption><a href="http://image.slidesharecdn.com/deepdiveinaimlventurelandscape-150831132221-lva1-app6891/95/deepdive-in-aiml-venture-landscape-by-ajit-nazre-rahul-garg-3-638.jpg?cb=1441027412">http://image.slidesharecdn.com/deepdiveinaimlventurelandscape-150831132221-lva1-app6891/95/deepdive-in-aiml-venture-landscape-by-ajit-nazre-rahul-garg-3-638.jpg?cb=1441027412</a></figcaption></figure><p>Dans la première partie, nous avions vu que le Machine Learning utilise des algorithmes génériques dans le but de transformer les données brute en un résultat concret sans avoir besoin d’écrire de code spécifique. (si vous n’avez pas encore entendu parler de <a href="https://medium.com/@alexis.anzieu/samuser-avec-le-machine-learning-a40159bb0546">la partie 1, lisez-la maintenant</a> !).</p><p>Ici, nous allons disséquer un de ces algorithmes génériques en créant un niveau de jeu vidéo aussi complet que s’il l’avait été par un humain. Nous allons développer un réseau neuronal, en le nourrissant des niveaux de Super Mario déjà existant et en regardant ce qu’il en advient !</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*pJ2mc_79M544T9mg19XIGA.gif" /><figcaption>Un des niveaux qui sera généré par notre algorithme</figcaption></figure><p>Tout comme la partie 1, ce guide s’adresse à toutes les personnes intéressées par l’apprentissage automatique qui ne savent pas par où commencer. Cet article est accessible à tous — ce qui signifie qu’il y a beaucoup de généralisations et que beaucoup de détails passent à la trappe. Mais qui s’en soucie ? Si cela permet d’intéresser plus de monde au ML, alors la mission est accomplie.</p><h3>Deviner avec plus de précision</h3><p>Dans la partie 1, nous avons créé un algorithme simple qui estimait la valeur d’une maison basée sur certains de ses attributs. Par exemple des données telles que :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*tzN3MZMnGMjAX59GGnsPMQ.png" /></figure><p>Nous en avions déduis cette fonction d’estimation basique :</p><pre>def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):<br> price = 0</pre><pre># a little pinch of this<br> price += num_of_bedrooms * <strong>0.123</strong></pre><pre># and a big pinch of that<br> price += sqft * <strong>0.41</strong></pre><pre># maybe a handful of this<br> price += neighborhood * <strong>0.57</strong></pre><pre>return price</pre><p>En d’autres termes, nous avons estimé la valeur de la maison en multipliant chacun de ses attributs par un <strong>poids</strong>. Ensuite, nous avons simplement additionné ces chiffres pour obtenir la valeur de la maison.</p><p>Au lieu d’utiliser du code, représentons la même fonction avec une image simple :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/883/1*LlTIwE6h0l1Aoln2GlAGcw.png" /><figcaption>les flèches représentent les poids de notre fonction</figcaption></figure><p>Toutefois, cet algorithme ne fonctionne qu’avec des problèmes peu complexes, dans lesquels le résultat a une relation linéaire avec les paramètres d’entrée. Et si la vérité derrière les prix de l’immobilier n’était pas si simple? Par exemple, le voisinage attache peut-être beaucoup d’importance aux grandes et aux petites maisons, mais n’en a aucune pour les maisons de taille moyenne. Comment pourrions-nous détecter ce genre de détail dans notre modèle ?</p><p>Pour être plus précis, nous pourrions exécuter cet algorithme plusieurs fois avec différents poids, déterminant ainsi à chaque fois une estimation de prix différente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hOemQF_v42KHlMyiqcQNyQ.png" /><figcaption>Essayons de résoudre notre problème de quatre manières différentes</figcaption></figure><p>Nous avons maintenant quatre estimations de prix différentes. Combinons ces quatre estimations de prix en une estimation finale. Puis ré-exécutons les dans même algorithme (mais en utilisant un autre ensemble de poids) !</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/777/1*VeS0ziSjogCQThPYZh0TIQ.png" /></figure><p>Notre nouvelle <em>Super réponse </em>combine les estimations de nos quatre tentatives précédentes afin de résoudre le problème. Grâce à cela, il peut modéliser plus de cas que nous pourrions en capturer avec un simple modèle.</p><h3>Qu’est ce qu’un réseau neuronal ?</h3><p>Combinons nos quatre tentatives en un grand diagramme:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/895/1*Lt8RZaeQ6f6B_eA1oD32JQ.png" /></figure><p>Vous voici face à un réseau de neurones ! Chaque nœud sait comment intégrer un ensemble d’entrées, lui appliquer un poids puis calculer une valeur de sortie. En enchaînant plusieurs de ces nœuds, nous pouvons modéliser des fonctions plus complexes.</p><p>Je fais abstraction de beaucoup d’explications dans le but de rester bref (y compris <a href="https://en.wikipedia.org/wiki/Feature_scaling">la mise à l’échelle</a> et la <a href="https://en.wikipedia.org/wiki/Activation_function">fonction d’activation</a>), mais le plus important sont ces idées de base :</p><ul><li>Nous avons créé une fonction d’estimation simple qui prend un ensemble d’entrées et les multiplie par des poids pour obtenir une sortie. Appelez cette fonction simple un <strong><em>neurone</em></strong>.</li><li>En enchaînant ainsi beaucoup de <strong><em>neurones</em></strong>, nous pouvons modéliser des fonctions trop complexes pour être modélisées par un seul.</li></ul><p>Cela fonctionnent comme des LEGO ! Nous ne pouvons pas construire beaucoup de chose avec un seul bloc de LEGO, en revanche nous pouvons créé n’importe quoi si nous avons suffisamment de blocs à assembler.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/623/1*AcWzHbgnmiMYyv1_IXcY0w.png" /><figcaption>Notre future faune sera t-elle en plastique? Seul le temps nous le dira …</figcaption></figure><h3>Donnons une mémoire à notre réseau neuronal</h3><p>Notre réseau neuronal précédent retourne toujours la même réponse lorsque nous lui donnons les mêmes entrées. Il n’a pas de mémoire. En programmation, cela s’appelle un <a href="https://en.wikipedia.org/wiki/State_%28computer_science%29">algorithme stateless</a> (sans état)</p><p>Dans beaucoup de cas (comme l’estimation du prix d’une maison), c’est exactement ce que l’on souhaite. Cependant, ce type de modèle ne peut pas réagir aux variations des données au fil du temps.</p><p>Imaginez que je vous ai remis un clavier et que je vous ai demandé d’écrire une histoire. Mais avant de commencer, mon travail consiste à deviner la toute première lettre que vous allez taper. Quelle lettre devrais-je choisir ?</p><p>Je peux utiliser mes connaissances en français pour augmenter mes chances de deviner la bonne. Par exemple, vous tapez probablement une lettre plus courante qu’une autre au début de vos mots. Si je lisais les histoires que vous aviez écrites dans le passé, je pourrais affiner davantage ma chance en me basant sur les mots que vous utilisez habituellement au début de vos histoires. Une fois que j’aurai toutes ces données, je pourrais l’utiliser pour construire un réseau de neurones pour modéliser la probabilité que vous commenciez avec une lettre donnée.</p><p>Notre modèle ressemblerait à ceci:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/860/1*e2YPupJVOiZj4B_nGZi5pQ.png" /></figure><p>Mais complexifions le problème. Disons que j’ai besoin de deviner la lettre suivante n’importe quelle autre, n’importe où dans votre histoire. Voici un problème bien plus intéressant.</p><p>Utilisons les premiers mots de Ernest Hemingway’s <a href="https://en.wikipedia.org/wiki/The_Sun_Also_Rises"><em>The Sun Also Rises</em></a> comme exemple:</p><blockquote>Robert Cohn était un boxeur poids moy</blockquote><p>Quelle lettre viendra après ?</p><p>Vous avez probablement deviné ’e’ — le mot va probablement être “moyen”. Nous savons cela à partir des lettres que nous avons déjà vues dans la phrase et de notre connaissance des adjectifs français. En outre, le mot «boxe» nous donne un indice supplémentaire étant donnée que le poids moyen correspond à une catégorie précise en boxe.</p><p>En d’autres termes, il est facile de deviner la lettre suivante si nous prenons en compte la séquence des lettres qui vient juste avant et que nous combinons cela avec notre connaissance des règles de français.</p><p>Pour résoudre ce problème avec un réseau de neurones, nous devons ajouter un <em>état </em>à notre modèle. Chaque fois que nous demandons une réponse à notre réseau de neurones, nous sauvegardons également un ensemble de nos calculs intermédiaires et les réutilisons la prochaine fois en entrée. De cette façon, notre modèle ajustera ses prédictions en fonction de l’entrée qu’il a vue précédemment.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/860/1*dcdVATcm0yJQxr4jGG5bFA.png" /></figure><p>Garder une trace de l’état dans notre modèle nous permet non plus seulement de prédire la <em>première </em>lettre la plus probable de l’histoire, mais également de prédire la lettre <em>suivante</em> la plus probable étant donné toutes les lettres précédentes.</p><p>C’est l’idée de base d’un Réseau Neuronal R<em>écurrent</em>. Nous mettons à jour le réseau chaque fois que nous l’utilisons. Cela lui permet de mettre à jour ses prédictions en fonction de ce qu’il a vu précédemment. Il peut même modéliser ses propres règles motifs au fur et mesure, pour peu que nous lui fournissons suffisamment de mémoire.</p><h3>A quoi bon une seule lettre ?</h3><p>Prédire la prochaine lettre d’une histoire peut sembler plutôt inutile. Quel est le vraie but ?</p><p>Une utilisation sympa serait de prédire un mot sur un clavier de smartphone:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pmDVDfrT9au3YwNiiO0FwQ.png" /><figcaption>La prochaine lettre la plus probable est “t”.</figcaption></figure><p>Mais si nous prenions cette idée à l’extrême ? Et si nous demandions au modèle de prédire le prochain personnage le plus probable encore et encore — pour toujours ? Nous lui demanderions d’écrire une histoire complète pour nous !</p><h3>Générer une histoire</h3><p>Nous avons vu comment nous pouvions deviner la lettre suivante dans la phrase d’Hemingway. Essayons de générer toute une histoire dans le style d’Hemingway.</p><p>Pour faire cela, nous allons utiliser <a href="https://github.com/karpathy/char-rnn">l’implémentation du Réseau Neuronal Récurrent</a> développé par <a href="http://karpathy.github.io/about/">Andrej Karpathy</a>. Andrej est un chercheur en Deep-Learning à Stanford qui a également écrit une <a href="http://karpathy.github.io/2015/05/21/rnn-effectiveness/">excellente introduction sur la génération de texte avec des RNN</a>.</p><p>Nous allons créer notre modèle à partir du texte complet de <em>The Sun Also Rises</em> — 362,239 caractères utilisant 84 lettres uniques (y compris la ponctuation, majuscules / minuscules, etc). Cet ensemble de données est très petit par rapport aux applications typiques du monde réel. Pour générer un très bon modèle de style Hemingway, il aurait été préférable d’avoir plusieurs textes d’exemple. Mais c’est déjà suffisant ici pour jouer avec.</p><p>Au tout début, le RNN n’est pas très bon en prédiction. Voici ce qu’il génère après 100 tours d’entraînement:</p><blockquote><em>hjCTCnhoofeoxelif edElobe negnk e iohehasenoldndAmdaI ayio pe e h’e btentmuhgehi bcgdltt. gey heho grpiahe.<br>Ddelnss.eelaishaner” cot AAfhB ht ltny<br>ehbih a”on bhnte ectrsnae abeahngy<br>amo k ns aeo?cdse nh a taei.rairrhelardr er deffijha</em></blockquote><p>Vous pouvez voir qu’il a compris que parfois les mots ont des espaces entre eux, mais c’est à peu près tout.</p><p>Après environ 1000 itérations, les choses semblent plus prometteuses:</p><blockquote><em>hing soor ither. And the caraos, and the crowebel for figttier and ale the room of me? Streat was not to him Bill-stook of the momansbed mig out ust on the bull, out here. I been soms<br>inick stalling that aid.<br> “Hon’t me and acrained on .Hw’s don’t you for the roed,” In’s pair.”<br> “Alough marith him.”</em></blockquote><p>Le modèle a commencé à identifier les modèles dans la structure de base de la phrase. Il ajoute des points à la fin des phrases et cite même des dialogues. Quelques mots sont reconnaissables, mais il y a aussi beaucoup de bêtises.</p><p>Mais après plusieurs milliers d’itérations de formation, ça semble plutôt bien:</p><blockquote><em>He went over to the gate of the café. It was like a country bed.<br> “Do you know it’s been me.”<br> “Damned us,” Bill said.<br> “I was dangerous,” I said. “You were she did it and think I would a fine cape you,” I said.<br> “I can’t look strange in the cab.”<br> “You know I was this is though,” Brett said.<br> “It’s a fights no matter?”<br> “It makes to do it.”<br> “You make it?”<br> “Sit down,” I said. “I wish I wasn’t do a little with the man.”<br> “You found it.”<br> “I don’t know.”<br> “You see, I’m sorry of chatches,” Bill said. “You think it’s a friend off back and make you really drunk.”</em></blockquote><p>À ce stade, l’algorithme a capturé le modèle de base du dialogue court et direct d’Hemingway. Quelques phrases ont même un sens.</p><p>Comparez cela avec un vrai texte du livre:</p><blockquote><em>There were a few people inside at the bar, and outside, alone, sat Harvey Stone. He had a pile of saucers in front of him, and he needed a shave.<br> “Sit down,” said Harvey, “I’ve been looking for you.”<br> “What’s the matter?”<br> “Nothing. Just looking for you.”<br> “Been out to the races?”<br> “No. Not since Sunday.”<br> “What do you hear from the States?”<br> “Nothing. Absolutely nothing.”<br> “What’s the matter?”</em></blockquote><p>Même en ne recherchant des motifs qu’un caractère à la fois, notre algorithme a reproduit une prose à l’aspect plausible avec un formatage approprié. C’est plutôt cool !</p><p>Nous n’avons pas non plus besoin de générer du texte à partir de zéro. Nous pouvons nourrir l’algorithme en lui fournissant les premières lettres et en le laissant trouver les lettres suivantes.</p><p>Pour le fun, fabriquons une fausse couverture de livre imaginaire en générant un nouveau nom d’auteur et un nouveau titre en utilisant le texte de départ de “Er”, “He”, et “The S”:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aSfo32MWRrW7LYDVJ0TghQ.png" /><figcaption>Le vrai livre est à gauche et notre étrange livre informatisé est sur la droite.</figcaption></figure><p>Pas mal !</p><p>Mais la chose vraiment hallucinante est que cet algorithme peut comprendre des modèles dans n’importe quelle séquence de données. Il peut facilement générer des recettes réalistes ou de faux discours d’Obama. Mais pourquoi nous limiter au langage humain? Nous pouvons appliquer cette même idée à n’importe quel type de données séquentielles ayant un motif.</p><h3>Faire Mario sans réellement faire Mario</h3><p>En 2015, Nintendo a sorti Super Mario Maker ™ pour la Wii U.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/779/1*F5j2M7usF53vF4stTO0Tsw.png" /><figcaption>Un rêve d’enfant !</figcaption></figure><p>Ce jeu vous permet de dessiner vos propres niveaux de Super Mario sur la console, puis de les télécharger sur Internet afin que vos amis puissent les jouer. Vous pouvez inclure dans vos niveaux tous les items classiques et les ennemis des jeux Mario originaux . C’est comme un jeu LEGO virtuel pour les gens ayant grandi en jouant à Super Mario.</p><p>Pouvons-nous utiliser le même modèle qui a généré du faux texte Hemingway afin de créer cette fois-ci de faux niveaux de Super Mario ?</p><p>Premièrement, nous avons besoin d’un ensemble de données pour la formation de notre modèle. Prenons tous les niveaux du jeu original Super Mario sorti en 1985:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hURFJf6p7dZYlpAZScKGDA.png" /><figcaption>Meilleur Noël du monde. Merci maman et papa!</figcaption></figure><p>Ce jeu a 32 niveaux et environ 70% d’entre eux ont le même style. Nous allons donc nous en tenir à ceux-là.</p><p>Afin d’obtenir la modélisation de chaque niveau, j’ai acheté une copie originale du jeu et j’ai écrit un programme permettant d’extraire tous les niveaux hors de la mémoire du jeu. Super Mario est un jeu vieux de 30 ans et il y a beaucoup de ressources en ligne qui vous aident à comprendre comment les niveaux ont été stockés dans la mémoire du jeu. Extraire des données de niveau d’un ancien jeu vidéo est un exercice de programmation amusant que vous devriez essayer un jour.</p><p>Voici le premier niveau du jeu (dont vous vous souvenez probablement si vous l’avez déjà joué):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cZddr0SxPVnr3RU9Kx2fQQ.gif" /><figcaption>Super Mario Bros. Level 1–1</figcaption></figure><p>Si vous regardez attentivement, vous remarquez que le niveau est composé d’une simple grille de cases :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*c8wiw6UsCLuJ2KJE2rTxLQ.png" /></figure><p>Nous pourrions tout aussi bien représenter cette grille comme une séquence de caractères spéciaux représentant chaque case:</p><pre>--------------------------<br>--------------------------<br>--------------------------<br>#??#----------------------<br>--------------------------<br>--------------------------<br>--------------------------<br>-##------=--=----------==-<br>--------==--==--------===-<br>-------===--===------====-<br>------====--====----=====-<br>=========================-</pre><p>Nous avons remplacé chaque case du niveau par une lettre :</p><ul><li>‘-’ est un espace vide</li><li>‘=’ est un bloc solide</li><li>‘#’ est un brique cassable</li><li>‘?’ est un bloc surprise</li></ul><p>… et ainsi de suite, en utilisant une lettre différente pour chaque type de case du niveau.</p><p>Au final, voici sa représentation sous forme d’un fichier texte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D9hjauyOBy9xGPFOiKCZuA.png" /></figure><p>En regardant le fichier texte, vous pouvez voir que les niveaux de Mario n’ont pas vraiment de motif si vous les lisez ligne par ligne:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/648/1*3Anjg6hI_iGkK1GAR8tQug.png" /><figcaption>Ligne par ligne, il n’y a pas vraiment de modèle à capturer. Beaucoup de lignes sont complètement vides.</figcaption></figure><p>Les modèles du niveau n’émergent vraiment que lorsque vous considérez le niveau comme étant une série de colonnes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/1*Y-Awqi55np9Ynxz-da73DQ.png" /><figcaption>En regardant colonne par colonne, il y a un vrai modèle. Chaque colonne se termine par un ‘=’ par exemple.</figcaption></figure><p>Donc, pour que l’algorithme trouve les modèles dans nos données, nous devons l’alimenter colonne par colonne. Déterminer la représentation la plus efficace de vos données d’entrée (appelée <a href="https://en.wikipedia.org/wiki/Feature_selection">feature selection</a>) est l’une des clés de l’utilisation des algorithmes d’apprentissage automatique.</p><p>Pour entraîner le modèle, j’ai eu besoin de faire pivoter mes fichiers texte de 90 degrés afin que les caractères soient introduits dans l’algorithme dans un ordre où un motif serait plus à même d’apparaître :</p><pre>-----------=<br>-------#---=<br>-------#---=<br>-------?---=<br>-------#---=<br>-----------=<br>-----------=<br>----------@=<br>----------@=<br>-----------=<br>-----------=<br>-----------=<br>---------PP=<br>---------PP=<br>----------==<br>---------===<br>--------====<br>-------=====<br>------======<br>-----=======<br>---=========<br>---=========</pre><h3>Entraînons notre Modèle</h3><p>Tout comme nous l’avons vu lors de la création du modèle de la prose d’Hemingway, un modèle s’améliore au et à mesure que nous l’entraînons.</p><p>Après un peu d’entrainement, notre modèle génère des déchets:</p><pre>--------------------------<br>LL+&lt;&amp;=------P-------------<br>--------<br>---------------------T--#--<br>-----<br>-=--=-=------------=-&amp;--T--------------<br>--------------------<br>--=------$-=#-=-_<br>--------------=----=&lt;----<br>-------b<br>-</pre><p>Il a en quelque sorte l’idée que ‘-’ et ‘=’ devraient apparaître beaucoup, mais c’est à peu près tout. Il n’a pas encore trouvé le modèle.</p><p>Après plusieurs milliers d’itérations, ça commence enfin à ressembler à quelque chose :</p><pre>--<br>-----------=<br>----------=<br>--------PP=<br>--------PP=<br>-----------=<br>-----------=<br>-----------=<br>-------?---=<br>-----------=<br>-----------=</pre><p>Le modèle a presque compris que chaque ligne devrait avoir la même longueur. Il a même commencé à comprendre une partie de la logique de Mario: Les tuyaux dans Mario mesurent toujours deux blocs de large et au moins deux blocs de haut, de sorte que les «P» dans les données devraient apparaître dans des groupes 2x2. Fascinant !</p><p>Avec beaucoup plus d’itérations, le modèle arrive au point où il génère des données parfaitement valides :</p><pre>--------PP=<br>--------PP=<br>----------=<br>----------=<br>----------=<br>---PPP=---=<br>---PPP=---=<br>----------=</pre><p>Faisons ainsi avec un niveau entier de données de notre modèle et retournons le horizontalement :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MSFyG2WgN_TdFPuQRIeOFA.png" /><figcaption>Un niveau entier, généré à partir de notre modèle !</figcaption></figure><p>Ces données sont impeccables ! Il y a plusieurs choses impressionnantes à remarquer :</p><ul><li>Il a placé un Lakitu (le monstre qui flotte sur un nuage) dans le ciel au début du niveau — exactement comme dans un vrai niveau de Mario.</li><li>Il sait que les tuyaux qui flottent dans l’air devraient reposer sur des blocs solides et ne pas être suspendus dans les airs.</li><li>Il place les ennemis dans des endroits logiques.</li><li>Cela ne crée rien qui empêcherait un joueur d’avancer.</li><li>Cela ressemble à un vrai niveau de Super Mario Bros. parce qu’il est basé sur le style des niveaux originaux qui existaient dans ce jeu.</li></ul><p>Enfin, prenons ce niveau et recréons-le dans Super Mario Maker :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/546/1*jrm6nO8BbKNUjOFWsITcxg.jpeg" /><figcaption>Nos données de niveau après avoir été entré dans Super Mario Maker</figcaption></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F_-Gc6diodcY%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D_-Gc6diodcY&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F_-Gc6diodcY%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/2ee2bff6356c8bd6a1e67c26e4c54819/href">https://medium.com/media/2ee2bff6356c8bd6a1e67c26e4c54819/href</a></iframe><p>À vous de jouer !</p><p>Si vous possédez Super Mario Maker, vous pouvez jouer ce niveau en le mettant en favori en ligne ou en le recherchant en utilisant le code de niveau 4AC9–0000–0157-F3C3.</p><h3>Les jouets vs. les applications du monde réel</h3><p>L’algorithme de Réseau Neuronal Récurrent que nous avons utilisé pour former notre modèle est le même type d’algorithme utilisé par les entreprises du monde réel pour résoudre des problèmes difficiles comme la détection de la parole et la traduction du langage. Ce qui fait de notre modèle un ‘jouet’ est qu’il est généré à partir de très peu de données. Il n’y a tout simplement pas assez de niveaux dans le jeu original de Super Mario pour fournir suffisamment de données pour un très bon modèle.</p><p>Si nous pouvions avoir accès aux centaines de milliers de niveaux Super Mario Maker créés par l’utilisateur que Nintendo a, nous pourrions faire un modèle incroyable. Mais nous ne pouvons pas — parce que Nintendo ne nous laissera pas les avoir. Les grandes entreprises ne donnent pas leurs données gratuitement.</p><p>Alors que l’apprentissage automatique devient plus important dans de plus en plus d’industries, la différence entre un bon programme et un mauvais programme sera défini par la quantité de données dont vous disposez pour former vos modèles. C’est pourquoi des entreprises comme Google et Facebook ont énormément besoin de vos données !</p><p>Par exemple, Google a récemment rendu opensource TensorFlow, sa boîte à outils logicielle pour la création d’applications d’apprentissage automatique à grande échelle. Cela semble incroyable que Google donne gratuitement une telle technologie. C’est sur cet outil qu’est basé Google Traduction.</p><p>Mais sans les données massive de Google dans toutes les langues, vous ne pouvez pas créer un concurrent de Google Traduction. Les données sont ce qui donne à Google son avantage. Réfléchissez à cela la prochaine fois que vous ouvrirez votre historique des positions Google Maps ou votre historique des positions Facebook et noterez qu’il stocke tous les lieux que vous avez visités.</p><h3>Pour aller plus loin</h3><p>Dans l’apprentissage automatique, il n’y a jamais un seul moyen de résoudre un problème. Vous disposez d’options illimitées pour décider comment pré-traiter vos données et quels algorithmes utiliser. Souvent, <a href="https://en.wikipedia.org/wiki/Ensemble_learning">combiner plusieurs approches</a> vous donnera de meilleurs résultats qu’une approche unique.</p><p>Les lecteurs m’ont envoyé des liens vers d’autres approches intéressantes pour générer des niveaux Super Mario:</p><ul><li><a href="http://justinmichaud.com/">Justin Michaud</a> s’est servi de mon approche afin de générer des niveaux et <a href="https://medium.com/@justin_michaud/super-mario-bros-level-generation-using-torch-rnn-726ddea7e9b7">à réussi à les importer dans sa console NES</a>. (du code écrit 30 ans en arrière !). <a href="http://justinmichaud.com/ml_level/index.html">Vous pouvez même y jouer en ligne</a>.</li><li>L’équipe d<a href="http://amykhoover.com/">’Amy K. Hoover</a> a utilisé une approche qui <a href="http://julian.togelius.com/Hoover2015Composing.pdf">représente chaque type d’objet de niveau (tuyaux, sol, plates-formes, etc.) comme s’il s’agissait d’une seule voix dans une symphonie globale. </a>En utilisant un processus appelé échafaudage fonctionnel, le système peut augmenter les niveaux avec des blocs de n’importe quel type d’objet donné. Par exemple, vous pouvez esquisser la forme de base d’un niveau et ajouter des tuyaux et des blocs de questions pour compléter votre conception.</li><li>L’équipe de <a href="http://forskning.mah.se/en/id/tsstda">Steve Dahlskog</a> a montré que la modélisation de chaque colonne de données de niveau sous la forme d’une série de «mots» n-gram permet <a href="http://julian.togelius.com/Dahlskog2014Linear.pdf">de générer des niveaux avec un algorithme beaucoup plus simple </a>qu’un grand RNN.</li></ul><p>Si vous avez aimé cet article, abonnez-vous à ma <a href="http://eepurl.com/b9fg2T"><strong>newsletter sur le Machine Learning (en anglais)</strong></a>. Je ne vous enverrai un mail que si je trouve quelque chose d’intéressant à partager.</p><p><em>Continuer à lire </em><a href="https://medium.com/@ageitgey/machine-learning-is-fun-part-3-deep-learning-and-convolutional-neural-networks-f40359318721"><em>Part 3</em></a><em>, </em><a href="https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78"><em>Part 4</em></a><em> and </em><a href="https://medium.com/@ageitgey/machine-learning-is-fun-part-5-language-translation-with-deep-learning-and-the-magic-of-sequences-2ace0acca0aa"><em>Part 5</em></a><em>! (en anglais pour le moment)</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=41974ee1f586" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Arrêtons d’auto-évaluer nos CV !]]></title>
            <link>https://medium.com/@alexis.anzieu/arr%C3%AAtons-dauto-%C3%A9valuer-nos-cv-4c7e6ef33688?source=rss-2a675b8be6a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/4c7e6ef33688</guid>
            <category><![CDATA[ressources-humaines]]></category>
            <category><![CDATA[curriculum]]></category>
            <dc:creator><![CDATA[Alexis ANZIEU]]></dc:creator>
            <pubDate>Mon, 15 Jan 2018 16:10:12 GMT</pubDate>
            <atom:updated>2018-01-15T17:08:06.937Z</atom:updated>
            <content:encoded><![CDATA[<p>Le CV, ou ce lourd résultat rédactionnel qui nous incombe afin de dénicher le stage/alternance/CDI qui nous conviendra le mieux, est une étape cruciale de notre monde moderne.</p><p>Il permet au recruteur de savoir si nos compétences sont en phases avec les attentes du poste, et de décrocher le Graal pour les plus chanceux. Notre objectif consiste donc à nous démarquer des redoutables adversaires en employant, pour la plupart d’entre nous, l’ancestrale technique du vol de maquettes de CV sur Internet.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/567/1*DbcQTLmE8r41GtzRmatSTA.png" /><figcaption><a href="https://www.behance.net/gallery/31366347/FREE-Resume-Business-card">https://www.behance.net/gallery/31366347/FREE-Resume-Business-card</a></figcaption></figure><p>C’est beau et ça sort du lot (pas tant que ça au final, vu que nous ne sommes apparemment pas seuls à faire ainsi). Hop, c’est transmis illico presto.</p><h4>NON.</h4><p>Regardez plus attentivement cet encart-ci :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/251/1*r0aSFzkz5oOtvReM2H_Kkg.png" /></figure><p>Non contents d’être incendié de notations depuis notre plus tendre enfance, voici que nous continuons à reproduire ce maudit schéma (oui, noter c’est le mal) sur nos propres compétences. Nous nous <strong>auto-évaluons</strong>, mais dans quel but ?</p><blockquote>“Mais … cela permet au RH de cerner mes skills en un coup d’œil !”</blockquote><h4>NON PLUS.</h4><p>Imaginez un instant que tous les avis d’Amazon soient écrits par le vendeur du produit lui-même. Y prêteriez-vous attention ?</p><p>Le travail du recruteur consiste justement à découvrir ce que nous sommes capables d’apporter à l’entreprise. Il ne va accorder <strong>aucune confiance</strong> à une auto-notation et va préférer nous explorer de lui-même grâce à nos différents projets et expériences professionnelles. Nous perdons donc inutilement de la place sur le CV. Rien d’autre à mettre ? Laissons blanc. Remplir pour remplir, c’est mal perçu. Même si c’est joli de loin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/247/1*O5p2H3TDK75Ydy8xBUTMyg.png" /><figcaption>Whaou, regardez-moi cette expertise de la suite Adobe !</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/162/1*k_McVLhh3Nuvjl5lwbLnrQ.png" /><figcaption>Quelle maîtrise du travail d’équipe et de la communication !</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/450/1*8P5An_wPkici4Q6c0OkDug.png" /><figcaption>3/10 sur Premiere et Effects ? Quel raté…</figcaption></figure><p>Plus sérieusement, pour commencer, sur quelles études sont basées ces échelles de notation ? Doivent-elles être sur 10 ? 7 ? 3 ? Plus les choix de notation sont élevés, moins le recruteur saura s’y retrouver.</p><p>Imaginons ensuite que vous ne maîtrisiez pas très bien Photoshop car vous venez seulement d‘assimiler les bases de l’outil. Vous souhaitez cependant très fortement poursuivre sa découverte — pour simple rappel, vous souhaitez obtenir ce poste afin de vous épanouir pleinement dedans — quelle note allez-vous lui mettre ? 1/10 ? 2/7 ? <strong>Vous voilà bloqués entre mensonge et domaines de compétences déjà acquis</strong>. Est-ce vraiment intéressant ?</p><h4>UNE SOLUTION.</h4><p>Si vous souhaitez garder cet aspect de <em>“ça, je sais bien faire” ou “ça, j’aime bien faire”</em>, tout n’est pas perdu. Limitez le choix à deux, <a href="https://www.ted.com/talks/barry_schwartz_on_the_paradox_of_choice?language=fr">ça c’est prouvé</a>. Gardez votre liste de compétences en enlevant ces notations et différenciez celles qui vous motivent le plus. Avec <strong>une petite icône</strong> par exemple, ou pour les plus austères, passez simplement <strong>la compétence en gras</strong> :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/256/1*O0sVApH4mRIrMC6VKq1hGw.png" /><figcaption>version icône</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/250/1*L7_3JPj3i_J_EZEpN-J82w.png" /><figcaption>version plus austère</figcaption></figure><p>Cela démarquera vos appétences pour les outils sans pour autant établir d’auto-notation. C’est pas sorcier, mais ça méritait d’être partagé.</p><p>J’ai choisi la fusée et vous ? Quelle icône représentative de votre motivation utiliseriez-vous ?</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4c7e6ef33688" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Vendre à coup sûr en 5 étapes.]]></title>
            <link>https://medium.com/@alexis.anzieu/vendre-%C3%A0-coup-s%C3%BBr-en-5-%C3%A9tapes-6e5f063d698f?source=rss-2a675b8be6a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/6e5f063d698f</guid>
            <category><![CDATA[powerpoint]]></category>
            <category><![CDATA[french]]></category>
            <category><![CDATA[business-strategy]]></category>
            <category><![CDATA[sell]]></category>
            <category><![CDATA[startup]]></category>
            <dc:creator><![CDATA[Alexis ANZIEU]]></dc:creator>
            <pubDate>Mon, 11 Dec 2017 21:20:37 GMT</pubDate>
            <atom:updated>2017-12-11T21:20:37.014Z</atom:updated>
            <content:encoded><![CDATA[<p><em>( Initialement publié sur </em><a href="http://blog.cremedelacreme.io/"><em>crème de la crème</em></a><em> en juin 2017 </em><a href="http://blog.cremedelacreme.io/2017/06/29/rh-vendre-powerpoint/">http://blog.cremedelacreme.io/2017/06/29/rh-vendre-powerpoint/</a><em> )</em></p><p>Au lieu de vous méfier de l’air racoleur de ce titre, essayez de vous transposer dans le corps d’un business developper (anciennement appelé commercial) censé convaincre, assis devant lui, les pontes d’une multinationale. Les mains moites, vous cherchez maladroitement vos mots avant de vous souvenir de cet article plutôt étrangement écrit. Une par une, vous exposez dans l’ordre les précieuses étapes qui y étaient divulguées. Avec sérénité, car vous savez que ce modèle a permis de conclure les plus grosses levées de fonds d’Amérique. Quelques minutes plus tard, c’est gagné. Le produit est vendu et les millions glissent sur le chèque. Vous sortez soulagé et heureux de n’avoir pour une fois pas lu en diagonale les explications de ce papier.</p><p>Cet article est illustré tout du long par les slides d’une vente de solution de digitalisation de Disneyland Paris. <a href="https://drive.google.com/file/d/0BybeYdjnTIqUejl3NmVJRjRsTWc/view?usp=sharing">Disponible ici.</a></p><p>Sans plus tarder.</p><h3>1/Citez un changement mondial majeur, pertinent et indéniable</h3><p>Il vous faut un point d’entrée capable de retenir l’attention des oreilles distraites. C’est ici que tout se joue car c’est d’ici que découlera votre présentation. Comment faire ? Comme le disait le réalisateur hollywoodien Robert McKee :</p><blockquote>… ce qui attire l’attention de l’homme est le changement. … si la température autour de vous change, si le téléphone sonne — cela attire votre attention. La façon dont une histoire commence est un événement de départ qui crée une période de changement.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2ZhzvR-oE-Zk4t69NzZc9Q.png" /></figure><p>Désolé, mais dans 99% des cas la date à laquelle notre entreprise a été fondée n’a aucun aucun intérêt. Ne l’introduisez pas. Ni votre nom. Si votre public est suffisamment intéressé à la fin de la présentation alors il se renseignera par lui-même, ne perdez pas de temps avec ça. Ce premier changement-ci introduira le votre.</p><p>Un seul objectif ici : <strong>faire absorber votre changement à l’auditoire afin qu’il réalise qu’il se situe devant un nouveau challenge important.</strong></p><p>Essayez de transposer ça comme étant l’entrée d’un tunnel. Votre but est de positionner le client devant. Ne le poussez pas dedans. Ne dites pas ce qu’il y a au bout, ni comment le traverser. Faites lui simplement comprendre qu’il y a ici quelque chose de nouveau. La prochaine étape consiste à l’empêcher de s’en détacher.</p><h3>2/Séparez les gagnants des perdants</h3><p>Malheureusement pour vous, ces potentiels acheteurs (ou investisseurs) sont atteints de “<a href="https://fr.wikipedia.org/wiki/Aversion_%C3%A0_la_perte">l’aversion à la perte</a>”. C’est à dire qu’ils évitent les pertes à tout prix en préférant rester sur leurs acquis plutôt que de miser sur un changement.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YndcwphjRNEKLlJdCuNr-Q.png" /></figure><p>Afin de combattre cette aversion vous devrez mettre les bouchées doubles. Vous devez démontrer que le changement que vous avez énoncé ci-dessus créera des gains gigantesque pour certains ET d’énormes pertes pour d’autres (exemple avec Kodak et le refus du numérique). C’est à dire que :</p><ul><li>l’adaptation au changement entraînera un avenir <strong>très positif</strong></li><li>ne pas s’adapter se traduira par un avenir <strong>inéluctablement </strong>négatif</li></ul><p>Pour en revenir à l’exemple de notre tunnel : votre client est à l’entrée (c’est déjà un bon point) mais afin qu’il ne s’en détourne pas, il est primordial d’insister sur le fait que cette simple pensée de fuite le fera courir à sa perte. Lui donner envie d’avancer sans forcément lui faire mettre un pied dedans (pour le moment) est l’objectif de de cette phase.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Clidj96OgksNox16Dn7NOw.png" /></figure><h3>3/Dévoilez la Terre Promise</h3><p>Non, il ne s’agit pas de votre produit. Même si la fin de la présentation approche et que cela est tentant de le présenter, résistez.</p><p>La Terre Promise correspond à l’état de plénitude et de prospérité que votre acheteur va éprouver une fois votre produit entre ses mains. Vous devez lui faire ressentir cet état.</p><p>Une agence de voyage va vous étaler de magnifiques paysages ensoleillés avant de vous exposer ses différentes offres de séjour. C’est exactement la même chose ici.</p><p>Gardez en tête que cette Terre Promise doit paraître inaccessible sans votre aide.</p><p>Cela correspond au bout du tunnel, une sorte d’havre de paix, d’herbe douce et de billets par milliers. Ayant envie d’avancer et discernant pleinement l’arrivée, qui ne voudrait pas s’aventurer jusqu’à son extrémité. Mais il fait sombre et le parcours est semé d’embûches. Comment faire…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dKVHLUq4LL49F2WH3izL0Q.png" /></figure><h3>4/Introduisez chaque fonctionnalité comme étant une botte secrète vers cette Terre Promise</h3><p>Défoulez-vous. C’est votre moment de gloire.</p><p>Le public est suspendu à vos lèvres et espère que votre solution suffira à atteindre les rêves qu’ils se sont créés à partir de votre présentation de la Terre Promise.</p><p>Présentez votre produit en appuyant bien le fait que chacune de ses caractéristiques, infime soit-elle, permet à l’acheteur d’atteindre cette Terre.</p><p>Vous installez donc des lumières dans ce tunnel, avec un peu de musique, vous peignez les murs avec de jolies fresques. C’est votre tunnel dont le client a maintenant envie. Le dernier objectif ne consiste plus qu’à le tenir par la main et à le faire avancer.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v05x-w-hIa-YiLHvBhatrg.png" /></figure><h3>5/Montrez avec évidence qu’ils peuvent compter sur vous pour les y emmener</h3><p>Les acheteurs sont maintenant conquis par votre produit mais sont septiques quant à votre accompagnement tout au long du périlleux projet.</p><p>Vous devez les rassurer. Pour cela, rien de mieux que de leur montrer les avis des précédents acheteurs avec lesquels vous avez déjà accompli ce périple.</p><p>Si vous n’avez pas de “précédents clients” faites une démonstration du produit en question tout gardant en tête sa relation avec la Terre Promise.</p><p>À vous de jouer !</p><h3>Pour résumer</h3><ul><li>faites comprendre à l’acheteur qu’une période s’achève</li><li>convainquez le de venir dans la nouvelle</li><li>décrivez la comme étant miraculeuse et fantastique</li><li>expliquez lui comment votre produit peut lui permettre d’y accéder</li><li>rassurez le sur votre présence et votre capacité à achever cette transition</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6e5f063d698f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[S’amuser avec le Machine Learning!]]></title>
            <link>https://medium.com/@alexis.anzieu/samuser-avec-le-machine-learning-a40159bb0546?source=rss-2a675b8be6a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/a40159bb0546</guid>
            <category><![CDATA[robots]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[intelligence-artificielle]]></category>
            <category><![CDATA[future]]></category>
            <category><![CDATA[informatique]]></category>
            <dc:creator><![CDATA[Alexis ANZIEU]]></dc:creator>
            <pubDate>Fri, 25 Nov 2016 15:42:52 GMT</pubDate>
            <atom:updated>2018-12-20T19:39:41.276Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*3xs0qtQ-iU2Hlt4F.jpg" /></figure><h4>L’introduction au Machine Learning la plus simple au monde</h4><p><em>Cet article nécessite très peu de connaissances mathématiques &amp; informatiques.( texte original : </em><a href="https://medium.com/@ageitgey/machine-learning-is-fun-80ea3ec3c471#.2do9stxaw"><em>https://medium.com/@ageitgey/machine-learning-is-fun-80ea3ec3c471#.2do9stxaw</em></a><em> )</em></p><h3>Préface</h3><p>Ayant tout d’abord voulu écrire un article sur l’Intelligence Artificielle, je me suis rendu compte qu’il en existait déjà de très bons, mais malheureusement peu accessibles à ceux ne pratiquant pas l’anglais technique. De nombreuses lectures plus tard, j’ai finalement contacté <a href="https://twitter.com/ageitgey">Adam Geitgey</a> afin de savoir si je pouvais officiellement traduire sa série de papiers. Après m’avoir envoyé une réponse positive et validé mes retouches, voici la première partie (d’autres suivront en 2017). Bonne lecture !</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/638/0*dLFA_mD1kw9Sm71A." /><figcaption><a href="http://image.slidesharecdn.com/deepdiveinaimlventurelandscape-150831132221-lva1-app6891/95/deepdive-in-aiml-venture-landscape-by-ajit-nazre-rahul-garg-3-638.jpg?cb=1441027412">http://image.slidesharecdn.com/deepdiveinaimlventurelandscape-150831132221-lva1-app6891/95/deepdive-in-aiml-venture-landscape-by-ajit-nazre-rahul-garg-3-638.jpg?cb=1441027412</a></figcaption></figure><p>Vous avez déjà entendu parler du Machine Learning mais vous n’avez qu’une vague idée de ce que cela signifie ? Vous en avez assez d’hocher machinalement la tête lors de vos discussions entre collègues ? Alors vous êtes au bon endroit !</p><p>Ce guide est dédié à toutes les personnes curieuses d’en savoir plus sur le Machine Learning mais qui ne savent pas par où commencer. J’imagine que certain d’entre vous ont déjà essayé de s’immiscer dans ce sujet à partir de <a href="http://en.wikipedia.org/wiki/Machine_learning">Wikipédia</a>, mais que vous avez aussitôt abandonné, frustré, espérant qu’un proche technophile allait pouvoir vous en donner une explication plus simple. C’est le but de cet article.</p><p>L’objectif est d’être accessible à tous — ce qui signifie qu’il y aura beaucoup de généralités. Mais on s’en fiche. Si cela permet à quiconque de s’intéresser davantage au Machine Learning, alors la mission est accomplie.</p><h3>Qu’est ce que le Machine Learning ?</h3><p>Le Machine Learning est un concept stipulant qu’il existe des algorithmes génériques pouvant nous révéler des informations intéressantes sur des données, sans avoir besoin de construire ou de développer un code spécifique. Au lieu d’écrire du code, vous nourrissez donc ces algorithmes avec des données qui leur permettront de construire leurs propres logiques.</p><p>Prenons par exemple l’algorithme de classification. Il permet de classer des données en groupes. Cet algorithme, utilisé pour la reconnaissance manuscrite des nombres, peut aussi servir à classer des mails entre spam et non-spam, cela sans changer une ligne de code. C’est le même algorithme, mais nourrit de façon différente il développe une logique de classification différente.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*YXiclXZdJQVJZ0tQHCv5zw.png" /><figcaption>Cet algorithme de Machine Learning est une boite noire pouvant être ré-utilisée pour résoudre différents problèmes de classifications</figcaption></figure><p>Le “Machine Learning” est un terme englobant un grand nombre de ces algorithmes génériques.</p><h3>Les deux types d’algorithmes de Machine Learning</h3><p>Vous pouvez diviser le Machine Learning en deux principales catégories : <strong>l’Apprentissage Supervisé</strong> et <strong>l’Apprentissage non-Supervisé</strong>. La différence est simple mais très importante.</p><h4>L’Apprentissage Supervisé</h4><p>Mettons que vous êtes un agent immobilier. Votre business est en train de grossir, vous décidez donc d’embaucher une flopée de recrues afin de vous aider dans vos tâches. Cependant il y a un soucis— un simple coup d’oeil sur une maison vous permet d’en connaître sa valeur, mais les nouveaux agents n’ont pas votre expérience et ne savent pas comment en déterminer le prix.</p><p>Afin de les aider (et de prendre des vacances par la même occasion), vous décidez de développer une petite application permettant d’estimer la valeur d’une maison en se basant sur ses caractéristiques (sa taille, son quartier etc…) et à combien des maisons similaires ont été vendues.</p><p>Pendant trois mois, vous notez minutieusement chaque vente qui s’effectue. Pour chaque maison, vous notez toutes ses caractéristiques — nombre de chambres, taille en m², quartier etc. Mais le plus important, c’est que vous notez aussi le prix final :</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*ZWYX9nwsDFaNOW4jOrHDkQ.png" /><figcaption>Ce sont nos “training data” (données d’entrainement)</figcaption></figure><p>En nous servant de ces données, nous souhaitons créer un programme permettant d’estimer la valeur de n’importe quelle autre maison.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*V0OXzLOPtpU13MVVrlZJjA.png" /><figcaption>Nous voulons utiliser les données précédentes afin de déterminer le prix des autres maisons.</figcaption></figure><p>C’est ce qu’on appelle de l’<strong>apprentissage supervisé</strong>. Vous savez combien chaque maison a été vendue, donc en d’autres termes, vous connaissez la réponse au problème et il suffit de travailler à reculons à partir de là afin de comprendre la logique s’en dégageant.</p><p>Pour construire votre application, vous nourrissez l’algorithme de Machine Learning avec les données de vente que vous aviez notées sur chaque maison. L’algorithme se charge lui de définir quelles formules mathématiques doivent être appliqués afin de trouver le meilleur résultat.</p><p>Cela revient à trouver le résultat d’un devoir de maths avec tous les signes arithmétiques effacés :</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*SihYXaJQS3T6tOwqJ6fzPw.png" /><figcaption>Oh non ! Un étudiant maladroit a effacé les symboles arithmétiques !</figcaption></figure><p>A partir de cela, pouvez-vous retrouver le type de problème mathématique auquel nous avions affaire ? Vous vous doutez seulement que vous devez “faire quelque chose” avec les nombre à gauche afin d’obtenir les résultats de droite.</p><p>En<strong> apprentissage supervisé</strong>, vous laissez l’ordinateur faire ces relations à votre place. Et une fois que vous savez quelles opérations ont été nécessaires pour résoudre ce problème, vous pourrez répondre à tous les problèmes du même type !</p><h4>L’Apprentissage non-Supervisé</h4><p>Revenons à notre agent immobilier. Que faire si vous ne connaissez pas le prix de vente final de chaque maison ? Première étape : ne paniquez pas! Même si tout ce que vous connaissez est la taille, la localisation etc de chaque maison, vous pouvez quand même faire des choses sympas grâce à l’<strong>Apprentissage non-Supervisé</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*mUJw2yL4-OBI25xUKS7_Bg.png" /><figcaption>Même si vous ne pouvez pas prédire une donnée inconnue (tel que le prix), vous pouvez faire des choses intéressantes avec le Machine Learning.</figcaption></figure><p>C’est comme si quelqu’un vous donnait une liste de nombre sur une feuille de papier et vous disait “Je ne sais pas vraiment ce que ces nombres signifient mais peut-être qu’il y a un schéma qui se répète ou des groupes ou quelque chose — bonne chance!”</p><p>Alors que faire de ces données ? Pour commencer, vous pourriez avoir un algorithme qui identifie automatiquement les différents marchés. Peut-être que vous découvrirez que les acheteurs près de l’université adorent les petites maisons avec beaucoup de chambre, alors que ceux des banlieues préfèrent les maisons 3-chambres avec beaucoup de superficie. Connaître tous ces types d’acheteurs peut vous aider fortement au niveau du marketing.</p><p>Une autre chose sympa que vous pouvez faire, c’est d’identifier automatiquement les lieux atypiques qui sont vraiment différents du reste. Peut-être que ces maisons sont de géantes villas sur lesquelles il faudrait donc envoyer vos meilleurs agents.</p><p>Dans la suite de l’article, nous nous concentrerons davantage sur l’ Apprentissage Supervisé, mais ce n’est pas parce l’Apprentissage non-Supervisé est moins important ou moins intéressant. En fait, l’objectif des méthodes d’Apprentissage non-Supervisé est de permettre une extraction de connaissances organisées à partir de données. Il ne s’agit donc pas d’une simple réponse à une question.</p><p><em>Note pour les pédants : Il existe </em><a href="https://en.wikipedia.org/wiki/Machine_learning#Algorithm_types"><em>d’autres catégories</em></a><em> de Machine Learning. Mais les deux précédentes sont un bon début pour commencer.</em></p><h3>Tout ça c’est cool, mais en quoi estimer le prix d’une maison relève vraiment de “l’apprentissage” ?</h3><p>En tant qu’humain, votre cerveau peut être confronté à de multiples situations et sait les traiter sans avoir besoin d’instructions spécifiques au préalable. Si vous vendez des maisons depuis longtemps, vous aurez certainement un instinct concernant le prix de vente, le meilleur moyen de la vendre, le type de client potentiellement intéressé etc. Le but des algorithmes d’<a href="http://www.automatesintelligents.com/echanges/2008/jui/dossieria.html">IA forte</a> est d’être capable de reproduire ce comportement sur des ordinateurs.</p><p>Mais les algorithmes de Machine Learning ne sont pas encore suffisamment développés — ils ne fonctionnent que lorsqu’ils ont affaire à des cas très spécifiques. Peut-être qu’ici une meilleure définition de l’ “apprentissage” serait “trouver une équation permettant de résoudre un cas spécifique à partir d’exemples de données”.</p><p>Malheureusement <em>“trouver une équation permettant de résoudre un cas spécifique à partir d’exemples de données” </em>n’est pas un nom très vendeur<em>. </em>Nous avons donc opté pour<em> “</em>Machine Learning<em>” </em>à la place.</p><p>Bien entendu, si vous êtes en train de lire ceci 50 ans dans le futur et que nous avons découvert un algorithme d’IA forte, alors cet article vous paraîtra quelque peu pittoresque.Arrêtez donc de le lire et demandez à votre robot-serviteur de vous faire un sandwich, humain du futur.</p><h3>Écrivons ce programme !</h3><p>Bref, revenons à nos moutons. De quelle manière allez-vous vous y prendre pour estimer la valeur de la maison ? Réfléchissez-y une seconde avant de continuer la lecture de l’article.</p><p>Si vous ne savez vraiment rien du Machine Learning, vous écrirez probablement quelques règles basiques comme celles-ci :</p><pre>def estimation_prix_vente_maison(nombre_de_chambres, superficie, quartier):<br>  prix = 0</pre><pre><em># A côté de chez moi, le prix moyen au m² est de 200€ <br></em>  prix_par_metre_carre = 200</pre><pre>if quartier == &quot;paris16&quot;:<br>   <em> # mais quelques quartiers sont plus chers...</em><br>    prix_par_metre_carre = 400</pre><pre>elif quartier== &quot;paris18&quot;:<br>   <em> # ...et d&#39;autres moins</em><br>    prix_par_metre_carre= 100</pre><pre><em># commençons avec un prix estimé à partir de la superficie du lieu<br></em> prix = prix_par_metre_carre * superficie</pre><pre><em># ajustons maintenant notre prix en fonction du nombre de chambres</em><br>  if nombre_de_chambres == 0:<br>    <em># les studios sont moins chers (moins de murs)</em><br>    prix = prix— 20000<br>  else:<br>   <em> # les lieux avec plus de chambres ont en général plus de valeurs<br></em>    prix = prix + (nombre_de_chambres * 1000)</pre><pre>return prix</pre><p>Si vous jonglez avec chaque paramètre des heures durant, vous pourriez arriver à quelque chose qui fonctionne. Mais votre programme ne sera jamais parfaitement exact et sera très compliqué à maintenir si les prix évoluent.</p><p>Ne serait-ce pas plus pratique si l’ordinateur pouvait faire ce travail à votre place ?</p><pre>def estimation_prix_vente_maison(nombre_de_chambres, superficie, quartier):<br>  prix = &lt;ordinateur, fais le travail à ma place stp&gt;</pre><pre>return prix</pre><p>Une façon de voir la chose est de comparer le prix avec un délicieux pot-au-feu dont les ingrédients seraient le nombre de chambre, la superficie et le quartier. La quantité de chaque ingrédient à mélanger impacte forcément la recette finale. Il y a donc un ratio à trouver afin d’avoir un prix final le plus proche possible de la réalité.</p><p>Cela réduirait notre fonction initiale (avec tous ces <em>if </em>et <em>else </em>) à quelque chose de vraiment simple comme cela:</p><pre>def estimation_prix_vente_maison(nombre_de_chambres, superficie, quartier):<br> prix= 0</pre><pre># une petite pincée de ceci<br> prix += nombre_de_chambres* <strong>.841231951398213</strong></pre><pre># et un gros pincée de cela<br> prix += superficie* <strong>1231.1231231</strong></pre><pre># peut-être aussi une poignée de ça<br> prix += quartier* <strong>2.3242341421</strong></pre><pre># et au final, un extra de sel pour les ajustements<br> prix += <strong>201.23432095</strong></pre><pre>return prix</pre><p>J’espère que vous avez remarqué ces nombres magiques en gras —<strong> .841231951398213</strong>,<strong> 1231.1231231</strong>, <strong>2.3242341421</strong>,<strong> </strong>et<strong> 201.23432095</strong>. Ce sont nos <strong>poids. </strong>Si nous arrivions à trouver le ratio parfait entre chacun de nos poids, notre fonction pourrait prédire le prix de toutes les maisons !</p><p>Une façon toute bête de trouver ce ratio serait de faire ceci:</p><h4>Etape 1:</h4><p>Commencez par fixer chaque poids sur <strong>1.0</strong> :</p><pre>def estimation_prix_vente_maison(nombre_de_chambres, superficie, quartier):<br> prix= 0</pre><pre># une petite pincée de ceci<br> prix += nombre_de_chambres* <strong>1.0</strong></pre><pre># et un gros pincée de cela<br> prix += superficie* <strong>1.0</strong></pre><pre># peut-être aussi une poignée de ça<br> prix += quartier* <strong>1.0</strong></pre><pre># et au final, un extra de sel pour les ajustements<br> prix += <strong>1.0</strong></pre><pre>return prix</pre><h4>Etape 2:</h4><p>Déroulez cet algorithme sur chacune des maisons dont vous connaissez le prix final et regardez si votre prédiction se rapproche du prix réel.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*Dih1jJrDpqF0NJsWkA1qgw.png" /><figcaption>Utilisez votre fonction afin de prédire le prix de chaque maison</figcaption></figure><p>Par exemple, si la première maison s’est vendue à 250 000 $ mais que la fonction a prédis 178 000 $, alors il y a un écart de 72 000 $ en moins pour cette seule maison.</p><p>Calculez ainsi chaque écart en le multipliant au carré afin de n’avoir que des nombres positifs (-72 000*-72 000 pour la première ligne donc). Mettons que vous ayez 500 maisons dans votre tableau et que la somme des carré de chaque écart fasse un grand total de 86 123 373 $. Ce nombre représentera l’“inexactitude” actuelle de votre fonction.</p><p>Maintenant, prenez ce grand total et divisez-le par 500 pour avoir une moyenne des écarts de chaque maison. Appelez cette moyenne le <strong>coût</strong> de la fonction.</p><p>Si vous arrivez à atteindre un coût de 0 en ayant jonglé avec les poids, alors votre fonction est parfaite. Cela signifie que pour chaque cas, la fonction prédit parfaitement le coût de la maison en fonction des autres maisons. Donc c’est notre objectif — trouver le coût le plus bas possible en modifiant les différents poids à notre disposition.</p><h4>Etape 3:</h4><p>Répétez l’étape 2 encore et encore avec chaque combinaison de poids possible. Quelque soit la combinaison, celle qui s’approche un peu plus du zéro est celle à utiliser ! Le processus se termine lorsque le zéro est atteint !</p><h3>Miracle!</h3><p>C’était plutôt simple, non ? Réfléchissez un peu sur ce que vous venez tout juste de faire. Vous avez pris quelques données, vous les avez jetées dans trois étapes génériques et très simples , pour au final vous retrouver avec une fonction pouvant deviner le prix de n’importe quel maison près de chez vous ! Prend garde à toi Century21 !</p><p>Mais voici quelques anecdotes supplémentaires qui vous retourneront davantage le cerveau :</p><ol><li>Les recherches dans de nombreux sujets (en linguistique comme en traduction) des 40 dernières années ont montré que ces algorithmes d’apprentissage génériques surpassent de loin l’approche des “règles” explicites. Le “bête” processus de Machine Learning bat donc l’expert humain.</li><li>La fonction finale est elle aussi complètement bête. Elle ne sait même pas ce qu’est une “chambre” ou une “superficie”. Tout ce qu’elle sait c’est qu’il faut mélanger ces nombres afin d’arriver à une réponse correcte.</li><li>Il est très probable que vous n’ayez aucune idée de <strong><em>pourquoi </em></strong>cette combinaison particulière fonctionne.<strong><em> </em></strong>Donc vous avez écrit une fonction que vous ne comprenez pas vraiment mais dont vous pouvez prouver son efficacité</li><li>Imaginez qu’au lieu de prendre des paramètres tels que “superficie” ou “nombre_de_chambres”, votre fonction prédictive utilisait un tableau de chiffres. Chacun d’entre eux représente la luminosité d’un pixel d’une image provenant d’un appareil-photo fixé sur le toit de votre voiture. Au lieu de prédire le prix d’une maison, la fonction prédis “tourner_le_volant_de_x_degrés”. <strong>Bravo ! Vous venez tout juste de créer une fonction de pilotage automatique.</strong></li></ol><p>C’est plutôt fou, hein ?</p><h3><strong>Revenons sur le “essayez toutes les combinaisons” de l’étape 3.</strong></h3><p>Bon, vous pouvez évidemment vous contenter d’essayer toutes les combinaisons de poids possibles et trouver celle qui convient le mieux. Cela vous prendrait littéralement une éternité car il y aura toujours des chiffres à tester.</p><p>Pour éviter cela, les mathématiciens ont découvert de <a href="https://en.wikipedia.org/wiki/Gradient_descent">nombreuses méthodes</a> un peu plus intelligentes permettant de trouver rapidement les bonnes valeurs des poids sans avoir à en essayer beaucoup. Voici une façon de faire :</p><p>Premièrement, écrivons une équation simple représentant l’étape 2 vu précédemment:</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*4j82aAIUGQKKUmKcHLMWJQ.png" /><figcaption>C’est notre <strong>fonction de coût</strong></figcaption></figure><p>Ré-écrivons maintenant exactement la même équation, mais en utilisant le jargon du Machine Learning (que vous pouvez ignorer pour le moment).</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*ZyboMOVQ5zOv0ZTC4a3usA.png" /><figcaption>θ représente votre poids . J(θ) correspond au coût de la fonction lié à votre choix de poids.</figcaption></figure><p>Cette équation calcule l’erreur d’estimation de notre fonction de prix en fonction des poids que nous avons choisi.</p><p>De manière graphique, si nous exprimons toutes les valeurs possibles des poids <strong>nombre_de_chambres </strong>et <strong>superficie, </strong>nous aurions quelque chose de ce type :</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*uorFgyflbSMtvfSo9hlI1A.png" /><figcaption>Le graphe de notre fonction de coût ressemble à un bol. L’axe vertical représente le coût.</figcaption></figure><p>Dans ce graphe, le point le plus bas en bleu représente notre coût le plus bas -où notre fonction est la plus représentative. Les points les plus hauts représentant les fonctions les moins représentatives. Donc si nous arrivons à trouver la valeur des poids nous permettant d’accéder au point le plus bas, nous avons notre réponse !</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*prsH6EfJmFqdmFElj1Ht8g.png" /></figure><p>Nous avons donc simplement besoin d’ajuster nos poids afin de descendre dans le graphe au point le plus bas. Si nous continuons à faire de petits ajustements permettant de nous y rapprocher au fur et à mesure, nous y arriverons éventuellement sans devoir tester trop de poids différents.</p><p>Si vous avez fait un peu de mathématiques, vous savez qu’en prenant la dérivé de la fonction vous obtiendrez la pente de la tangente de la fonction en tout point. En d’autres termes, cela vous permet de savoir quelle direction prendre pour descendre.</p><p>Donc, si nous calculons une dérivée partielle de notre fonction de coût par rapport à chacun de nos poids, nous pouvons soustraire cette valeur à chaque poids. Cela nous amènera un peu plus près de notre point. Continuez à le faire et, au final, vous l’atteindrez et aurez les meilleures valeurs possibles pour vos poids. (Si cela n’a aucun sens pour vous, ne vous inquiétez pas et continuez à lire).</p><p>Ceci est un résumé vulgarisé d’une façon de trouver les meilleurs poids pour votre fonction, appelée <strong>Algorithme du gradient stochastique</strong>. N’ayez pas peur de <a href="http://hbfs.wordpress.com/2012/04/24/introduction-to-gradient-descent/">creuser plus profondément</a> si vous souhaitez en apprendre davantage.</p><p>Lorsque vous vous servirez du Machine Learning afin de résoudre un problème, toute cette partie sera déjà automatiquement traitée pour vous. Mais c’est toujours bon d’avoir une idée concrète des opérations effectuées en amont.</p><h3>Que nous avez-vous caché d’autre ?</h3><p>L’algorithme en trois étapes que je vous ai décrit auparavant est appelé un “Modèle linéaire”. Vous estimez l’équation d’une droite correspondante à toutes vos maisons. Vous utilisez ensuite cette équation pour deviner le prix de vente des maisons que vous n’avez jamais vu avant, basé sur l’emplacement fictif que cette maison aurait sur votre droite.</p><p>En revanche, cette approche ne fonctionne qu’avec des cas simples. Cela est principalement dû au fait que les prix des maisons ne puissent pas toujours suivre une ligne continue.</p><p>Bien heureusement, il y a beaucoup de façon de régler ça. Il y a pléthore d’autres algorithmes de Machine Learning permettant de mieux appréhender les données non-linéaires (comme le <a href="https://fr.wikipedia.org/wiki/R%C3%A9seau_de_neurones_artificiels">Réseau de neurones artificiels</a> ou bien la <a href="https://fr.wikipedia.org/wiki/Machine_%C3%A0_vecteurs_de_support">Machine à vecteurs de support</a> avec des <a href="https://fr.wikipedia.org/wiki/Astuce_du_noyau">astuces du noyaux</a> ). Il est aussi possible d’utiliser plus intelligemment la régression linéaire afin de nous permettre d’explorer des données plus complexes. Dans tous les cas, c’est le même principe qui s’applique : trouver les meilleurs poids.</p><p>J’ai aussi décide d’ignorer le <strong>surapprentissage. </strong>Il est facile de trouver un ensemble de poids qui fonctionne toujours parfaitement pour prédire les prix des maisons dans vos données d’origines, mais cet ensemble ne fonctionnera jamais réellement pour les nouvelles maisons qui n’étaient pas là initialement. Là encore il y a des méthodes de résolution (comme la <a href="https://fr.wikipedia.org/wiki/R%C3%A9gularisation_(math%C3%A9matiques)">Régularisation</a> associée à la <a href="https://fr.wikipedia.org/wiki/Validation_crois%C3%A9e">validation croisée</a> des données).</p><p>En d’autres mots, Alors que le concept de base est assez simple, il faut néanmoins une certaine compétence et de l’expérience pour appliquer le Machine Learning et obtenir des résultats utiles. Mais ce sont des compétences qui sont à la portée de tous!</p><h3>Est-ce que le Machine Learning est magique ?</h3><p>Maintenant que vous commencez à percevoir la facilité avec laquelle les techniques de Machine Learning peuvent être appliquées (comme la reconnaissance d’écriture manuscrite), vous commencez à avoir le sentiment que vous pouvez utiliser le Machine Learning afin de résoudre n’importe quel problème et obtenir une réponse tant que vous avez assez de données. Il suffit juste de nourrir l’algorithme avec des données et de regarder l’ordinateur trouver l’équation qui correspond aux données par magie!</p><p>Mais il est important de se rappeler que le Machine Learning ne fonctionne que si le problème est soluble à partir des données que vous avez.</p><p>Par exemple, si vous construisez un modèle qui prédit les prix des maisons en fonction du type de plantes en pot dans chaque maison, cela ne fonctionnera jamais. Il n’y a tout simplement aucun type de relation entre les plantes en pot dans chaque maison et le prix de vente de la maison. Donc peu importe à quel point votre algorithme fonctionne, l’ordinateur n’arrivera jamais à déduire de relation entre les deux.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*N6pxRoVoEoedFELL2HdxbA.png" /><figcaption>Vous ne pouvez modéliser que les relations qui existent déjà</figcaption></figure><p>Tâchez de vous rappeler que si un expert humain ne peut pas utiliser les données pour résoudre le problème manuellement, un ordinateur ne le saura probablement pas non plus. Au lieu de cela, concentrez-vous sur les problèmes qu’un être humain pourrait résoudre , mais sur lesquels il serait bien plus avantageux et rapide d’utiliser un ordinateur.</p><h3>En apprendre davantage sur le Machine Learning</h3><p>Selon moi, le principal problème actuel du Machine Learning vient du fait qu’il ne soit présent que dans le monde académique ou dans les secteurs de R&amp;D. Il n’y a pas beaucoup de ressources accessibles pour les personnes qui souhaitent obtenir une compréhension générale sans devenir réellement des experts. Mais cela tend à s’améliorer.</p><p>Le cours de Machine Learning d’Andrew Ng sur <a href="https://www.coursera.org/course/ml">Coursera</a> est brillant. Je vous recommande fortement de commencer par là. C’est accessible à n’importe quelle personne se rappelant ses cours de maths de seconde.</p><p>Vous pouvez aussi faire joujou avec une tonne d’algorithmes de Machine Learning, en téléchargeant et en installant <a href="http://scikit-learn.org/stable/">SciKit-Learn</a>. Il s’agit d’une librairie python “boite noire”, faisant fonctionner les algorithmes standards sans connaissances poussées.</p><p>Si vous avez aimé cet article, abonnez-vous à ma <a href="http://eepurl.com/b9fg2T"><strong>newsletter sur le Machine Learning (en anglais)</strong></a>. Je ne vous enverrai un mail que si je trouve quelque chose d’intéressant à partager.</p><p><em>Continuer à lire </em><a href="https://medium.com/@alexis.anzieu/samuser-avec-le-machine-learning-part2-41974ee1f586">la Partie 2</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a40159bb0546" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Développement web — Haltevent]]></title>
            <link>https://medium.com/@alexis.anzieu/d%C3%A9veloppement-web-partie-1-718d9598d7d4?source=rss-2a675b8be6a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/718d9598d7d4</guid>
            <category><![CDATA[facebook]]></category>
            <category><![CDATA[events]]></category>
            <category><![CDATA[ionic]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[elasticsearch]]></category>
            <dc:creator><![CDATA[Alexis ANZIEU]]></dc:creator>
            <pubDate>Thu, 08 Sep 2016 16:22:24 GMT</pubDate>
            <atom:updated>2019-03-27T16:47:16.251Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AkFyxashn_0kzE6MdBcygw.png" /></figure><p>Explication du fonctionnement interne de l’application.</p><h4>EDIT: Du fait de la fermeture de l’API facebook à cause du <a href="https://fr.wikipedia.org/wiki/Scandale_Facebook-Cambridge_Analytica">Scandale Facebook-Cambridge Analytica</a>, ce projet n’a pas été maintenu mais si vous souhaitez obtenir le code source envoyez-moi un message !</h4><p><em>(Certaines notions d’informatique sont indispensables pour comprendre cet article dans son entièreté mais cela ne vous empêchera pas de visualiser le processus complet de la concrétisation d’une idée. Si vous avez la moindre question n’hésitez pas à me contacter via </em><a href="mailto:alex-freezer@hotmail.fr"><em>mail </em></a><em>ou par </em><a href="https://twitter.com/AlxFzr"><em>twitter</em></a><em>).</em></p><p><strong>Cela fait bientôt un an que je me suis acheté la dernière R</strong><a href="https://www.amazon.fr/Raspberry-Pi-Carte-M%C3%A8re-Model/dp/B01CCOXV34/ref=sr_1_2?ie=UTF8&amp;qid=1472720799&amp;sr=8-2&amp;keywords=raspberry+pi+3"><strong>aspberry</strong></a><strong> (un petit ordinateur), sans savoir réellement quoi en faire.</strong> Branchée derrière un des quatre ports Ethernet de ma box, elle ronronnait là sans prendre de place. Je l’ai tantôt <a href="http://raspbian-france.fr/media-center-raspberry-pi-osmc-xbmc/">transformée en media-center</a>, tantôt utilisée comme serveur pour les projets d’école.</p><p>En cette mi-août 2016, je me suis retrouvé confronté à cette problématique :</p><blockquote>Je ne sais pas où sortir ce soir à {complétez ici avec le nom d’une ville}, à quelle heure, à quel prix et pour quels artistes.</blockquote><p><strong>Qu’on soit en déplacement à l’étranger ou bien tout simplement un peu déconnecté des actualités événementielles du moment, il est peu aisé de trouver son bonheur</strong> sans devoir remuer les contacts ou l’Internet auparavant. Et ça prend du temps. Sans forcément y parvenir.</p><p>Alors bien entendu, il y a le site <a href="https://www.residentadvisor.net/">Residentadvisor </a>ou l’application <a href="https://itunes.apple.com/fr/app/bandsintown-concerts/id471394851?mt=8">Bandsintown</a> qui permettent d’avoir un rapide aperçu de ce qui se passe autour de soi, mais rien de bien exhaustif dans leurs entrailles. Aussi, quand on pense événement, on pense Facebook. Gratuit et fort de ses 1,7 milliards d’utilisateurs, c’est le meilleur moyen pour une organisation/club de rallier les gens à ses festivités. Malheureusement, il faut auparavant connaitre la page, aller dans ses événements, vérifier le prix, la description, le lieu et moultes informations complémentaires susceptibles de nous intéresser. Réitérer ensuite l’opération avec toutes les autres afin d’être certain de ne rien louper. Oui, c’est long et chiant.</p><p>L’idée qui a donc germée est la suivante : <strong>pourquoi ne pas centraliser tous les événements Facebook sur un site avec des choix de filtrage par localisation, par prix, par artistes, par nombre de participants, par dates etc ?</strong></p><p>Si cette idée vous semble moisie, vous avez tout à fait le droit. C’est même probable qu’elle existe déjà. Mais au delà de l’objectif final (qui sera au moins utile pour moi), c’est tout le processus de conception qui sera à même d’être le plus intéressant. Je compte aboutir ce projet courant Octobre. Afin d’être au goût du jour (et par curiosité permanente envers les nouvelles technologies), j’utiliserai les outils les plus récents à ma disposition :</p><ul><li>Raspian 8 (fork de Debian pour Raspberry)</li><li>Nginx 1.1 (le serveur sûr)</li><li>Symfony 3.1 et Php7 (pour récupérer les événements de Facebook et les afficher)</li><li>ElasticSearch 5.1( pour enregistrer les événements de Facebook sur ma Raspberry, on verra pourquoi plus tard)</li><li>Ionic2 et Angular2 (je prépare le terrain pour la suite avec la plausible création d’une application Android/iOS/Windows Phone)</li><li>API Graph 2.7 de Facebook (pour accéder aux événements de Facebook)</li></ul><p><strong>Au cours de ce projet, j’essayerai aussi d’éviter au maximum l’utilisation d’obscures libraires afin d’avoir le code le plus généraliste possible</strong> (adieu donc les classes PHP des api Facebook et Elasticsearch. Tout se jouera directement en HTTP). Ce projet devait initialement s&#39;appeler “Eventail” (petite dédicace à la commande UNIX “tail”). Mais au final, le grand fana de série <a href="http://www.allocine.fr/series/ficheserie_gen_cserie=11662.html">Halt &amp; Catch Fire </a>que je suis a décidé de le renommer “<strong>Haltevent” </strong>(pas plus mal pour le <a href="https://fr.wikipedia.org/wiki/Optimisation_pour_les_moteurs_de_recherche">SEO</a>).</p><p>Le <strong>développement d’un site/application web est divisé en au moins deux parties</strong> : ce que l’utilisateur voit sur son écran (aussi appelé “frontend”) et ce qu’il ne voit pas (“backend”). Par exemple, lorsque vous vous connectez à votre compte sur n’importe quel site, vous ne voyez pas l’algorithme qui fait en sorte de rechercher votre nom et votre mot de passe dans la base de données . Vous voyez simplement un petit message qui affiche une erreur ou un succès. En général, le frontend est confié à une armée de designers et le backend est confié à une armée de mathématiciens essayant d’optimiser les algorithmes et les processus présents sur le serveur (j’exagère et je caricature mais le principe est là). Pour résumer :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/0*YXdnc2DN-Wl9WgmG.jpg" /><figcaption><a href="https://s6.postimg.io/e8udn4qtd/Website_Frontend_and_Backend.jpg">https://s6.postimg.io/e8udn4qtd/Website_Frontend_and_Backend.jpg</a></figcaption></figure><p>Lorsqu’un dévelopeur sait gérer ces deux environnements, on dit qu’il est “fullstack”.</p><p><strong>Cette première partie va concerner le backend du site et la mise en place des différents outils cités auparavant.</strong> Voici un schéma de ce que nous allons traiter ici :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/726/1*u171K0LFldVXaqUKwIT57g.png" /></figure><p>La procédure d’installation des dernières version de Nginx et de PHP sur Raspberry est détaillée sur <a href="https://getgrav.org/blog/raspberrypi-nginx-php7-dev">ce lien</a> qui explique en détail les étapes à suivre. Ça a marché du premier coup pour moi donc je ne vais pas en parler plus ici. Le <a href="http://symfony.com/download">téléchargement de Symfony3</a> n’est pas nécessaire (une simple connaissance en PHP suffira) mais il nous permettra de structurer notre site selon le <a href="https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/organiser-son-code-selon-l-architecture-mvc">modèle MVC</a>. Nous allons le placer dans notre répertoire <em>/home/pi/sites/</em>.</p><p>Pour ce qui est de la configuration de Nginx avec Symfony, le fichier complet est <a href="http://symfony.com/doc/current/setup/web_server_configuration.html#nginx">sur le site du développeur</a>. Si vous décidez comme moi d’utiliser PHP7, pensez néanmoins à remplacer la ligne :</p><blockquote>fastcgi_pass unix:/var/run/php5-fpm.sock;</blockquote><p>par</p><blockquote>fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;</blockquote><p>Et aussi bien entendu le chemin vers notre Symfony récemment téléchargé, qui dans mon cas est :</p><blockquote>root /home/pi/sites/web;</blockquote><p>à la place de</p><blockquote>root /var/www/project/web;</blockquote><p>N’oublier pas de redémarrer ensuite le service Nginx avec la commande</p><blockquote>sudo service nginx restart</blockquote><p><strong>Le framework Symfony est maintenant fin prêt à être utilisé en localhost.</strong> Son utilisation permet d’avoir accès à différentes interface de supervision. Pour cela, commentez la structure “if” du fichier <em>/home/pi/sites/web/app_dev.php.</em> Si vous souhaitez le voir d’un ordinateur situé sur le même routeur, tapez “ifconfig” dans votre terminal raspian et copiez l’adresse de “inet addr” dans votre navigateur, suivi de /app_dev.php. Chez moi par exemple il suffirait de taper “192.168.0.11/app_dev.php” dans le navigateur. Si vous souhaitez y accéder de l’extérieur de votre réseau, renseignez-vous sur <a href="http://www.noip.com/">ce lien</a> et n’oubliez pas d’ouvrir le port 80 tcp/udp de votre box.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*i5eYQ5XHSRPHZD09moQpbA.png" /><figcaption>Capture d’écran du backend Symfony3</figcaption></figure><p><strong>Je ne vais pas passer en revue le fonctionnement de Symfony car c’est déjà </strong><a href="https://www.youtube.com/results?search_query=symfony"><strong>fait et refait</strong></a><strong>.</strong> Sachez juste qu’il apporte des outils qui peuvent se révéler être très intéressants pour la suite et que c’est un framework PHP. Si vous savez vous en servir c’est un plus. Sinon la <a href="http://symfony.com/doc/current/index.html">documentation</a> est facilement compréhensible pour un développeur.</p><p>Tous nos outils sont en place, exceptée notre base de données Nosql Elasticsearch. Afin de récapituler le tout, voici un aperçu de ce que nous avons accompli jusqu’ici :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/549/1*_HeaNcOAL4LhXpigDFwARQ.png" /><figcaption>Les poupées russes du web</figcaption></figure><p>Le Système d’Exploitation (= Operating System ou OS en anglais) permet de lancer le programme Nginx qui n’est autre que le serveur qui permettra au langage PHP de s’exécuter. Langage utilisé par Symfony qui n’est autre qu’un squelette d’application (ou framework) dans lequel nous allons coder ! Il est important de savoir que seul le framework n’est pas obligatoire pour un projet web.</p><p><strong>Essayons maintenant de réfléchir à ce dont nous avons besoin pour atteindre notre objectif.</strong> Nous voulons capturer les événements de Facebook de certaines pages et les afficher sur notre site selon quelques filtres et quelques recherches. Il faut tout d’abord savoir que ça ne dérange absolument pas Facebook que vous piochez dans ses données (c’est d’ailleurs le principe de <a href="https://fr.wikipedia.org/wiki/Interface_de_programmation">l’API</a>). La liste entière de ce que vous pouvez lui soutirer est <a href="https://developers.facebook.com/docs/graph-api/reference/">disponible ici</a>. Cependant ce qui nous intéresse se <a href="https://developers.facebook.com/docs/graph-api/reference/event/">situe là</a>. Grâce à <a href="https://developers.facebook.com/tools/explorer/145634995501895/">ce petit outil</a>, je vous fais confiance pour tester un peu tout ce qui vous passe par la tête. Pas trop non plus cependant car il faut savoir que pour limiter le nombre de demandes faites par les usagers de ce service, Facebook donne un jeton (ou token) à chacun permettant de l’identifier afin de limiter son accès. En théorie, un jeton est limité à 200 appels vers ses données, par heure. Si vous êtes seul à l’utiliser, le danger devrait être écarté. Mais concernant un projet comme celui-ci, c’est loin d’être le cas, il faut donc trouver une parade. C’est là qu’ElasticSearch interviendra.</p><p>Mais mettons tout d’abord l’API de Facebook en pratique !</p><p>Afin de récupérer les événements d’une page, il nous en faut tout d’abord une : <a href="https://www.facebook.com/SndMtn/">https://www.facebook.com/SndMtn/</a>. Son nom est ici “SndMtn”. Si nous l’injectons dans l’API de Facebook cela nous donne (attention, le token est peut-être expiré donc le lien sera mort mais le principe reste le même) :</p><p><a href="https://graph.facebook.com/v2.7/SndMtn/events?access_token=EAACEdEose0cBAO7pgk7ZBZBekz2fzm4fbi2tdLEGUdb4ZBlE9ybN8yhMlr0a2FYpr00W2Gfrnq2V4zkug5qXJFIEVDJFbVBqzatnyF0ha5evsmYEmzDEAgcuczj5zpE5S1DeowdMcigwFZBUdtlOhf06TyMye0ePXWrkCtokDwZDZD">https://graph.facebook.com/v2.7/SndMtn/events?access_token=EAACEdEose0cBAO7pgk7ZBZBekz2fzm4fbi2tdLEGUdb4ZBlE9ybN8yhMlr0a2FYpr00W2Gfrnq2V4zkug5qXJFIEVDJFbVBqzatnyF0ha5evsmYEmzDEAgcuczj5zpE5S1DeowdMcigwFZBUdtlOhf06TyMye0ePXWrkCtokDwZDZD</a></p><p>Cet url est de la forme <a href="https://graph.facebook.com/v2.7/SndMtn/events?access_token=EAACEdEose0cBAO7pgk7ZBZBekz2fzm4fbi2tdLEGUdb4ZBlE9ybN8yhMlr0a2FYpr00W2Gfrnq2V4zkug5qXJFIEVDJFbVBqzatnyF0ha5evsmYEmzDEAgcuczj5zpE5S1DeowdMcigwFZBUdtlOhf06TyMye0ePXWrkCtokDwZDZD">https://graph.facebook.com/</a>{version de l’api}/{nom de la page}/events/access_token={notre jeton personnel}. Le résultat est le suivant :</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_3sC424AFsfBs746pTOMSg.png" /></figure><p>Nous recevons tous les événements de la page SndMtn, hurra ! Néanmoins, c’est illisible pour l’instant, mais ce format appelé <a href="https://fr.wikipedia.org/wiki/JavaScript_Object_Notation">JSON </a>est très facile à retravailler en PHP pour être affiché en frontend ensuite.</p><p>Imaginons maintenant que la page décide de changer de nom, nous serions bien embêté car notre url ne fonctionnerait plus ! C’est pour cela que nous devons nous rabattre sur un attribut bien plus fiable : l’ID de la page. Un outil est disponible <a href="http://findmyfbid.com/">ici</a> et permet cette conversion. A la place de https://graph.facebook.com/v2.7/SndMtn/events nous avons donc maintenant https://graph.facebook.com/v2.7/ 343457565765698/events. C’est moche mais plus stable.</p><p>Le début du code va donc consister à initialiser une liste d’ID des clubs/pages qui nous intéressent (cette étape sera manuelle dans un premier temps mais pourquoi pas permettre aux utilisateurs d’ajouter à terme leurs propres lieux fétiches):</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5934483052b11766cdac330e1e5743a7/href">https://medium.com/media/5934483052b11766cdac330e1e5743a7/href</a></iframe><p><strong>Une fois cette dernière créée, nous allons nous attarder au plus gros de la tâche : tout insérer dans Elasticsearch.</strong> Téléchargez le tout d’abord <a href="https://www.elastic.co/downloads/elasticsearch">ici</a>. Et suivez les consignes d’installation disponibles <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html">là</a>. Contrairement aux bases de données relationnels, il y a aucun schéma à configurer donc vous êtes déjà prêts ! Je vous conseille en revanche d’installer le plugin <a href="https://mobz.github.io/elasticsearch-head/">Head</a> qui vous permettra de visualiser votre base ElasticSearch afin de déceler d’éventuelles modifications/ajouts. Enfin, si vous êtes sous Chrome, <a href="https://www.elastic.co/blog/found-sense-a-cool-json-aware-interface-to-elasticsearch">prenez le plugin Sense</a> qui vous permettra de faire des tests avec la base sans avoir besoin de passer par PHP.</p><p>Il n’y a pas de schéma ici, en revanche il va falloir réfléchir à la façon dont on va enregistrer nos événements. En effet, Elasticsearch nous permet de classer un minimum nos données afin de ne pas devoir chercher partout à chaque fois pour accélérer le processus.</p><blockquote>http://192.168.0.11:9200/{index}/{type}/</blockquote><p>Nous avons donc la possibilité de choisir le nom de l’index et du type. J’ai décidé de mettre “events” pour l’index car cela regroupera tous les événements. En type, j’ai mis l’ID du club. En effet, tous les événements appartenant au même club seront donc sous le même type.</p><blockquote>http://192.168.0.11:9200/events/{ID_CLUB}/</blockquote><p>N’oublions pas que les utilisateurs voudront aussi certainement avoir de plus amples informations concernant le club. Nous allons donc ajouter un second index “club” et nous allons tous les classer par ville (c’est un choix personnel) :</p><blockquote>http://192.168.0.11:9200/clubs/{VILLE_CLUB}/</blockquote><p>Il y a donc 2 étapes : enregistrer les clubs dans un index puis les événements dans un autre.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a97c534f6ff150d8bdb76395db5d519c/href">https://medium.com/media/a97c534f6ff150d8bdb76395db5d519c/href</a></iframe><p>Puis à la suite pour chacun de ces clubs, vérifier ses événements :</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c5f11717a225891d82c6e71428d79ace/href">https://medium.com/media/c5f11717a225891d82c6e71428d79ace/href</a></iframe><p>Le premier passage sera douloureux car nous allons devoir enregistrer TOUS les événements et les pages. Par la suite, nous n’enregistrerons que ceux dont nous n’avons pas l’ID (car oui, tout comme les pages, les événements possèdent aussi des ID qui permettent de les identifier de façon unique).</p><p><strong>Et voilà ! Nous avons capturé 8200 événements au total !</strong> Il n’y a plus qu’à faire une belle l’interface et à filtrer les recherches des utilisateurs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JMxvu9T0XHEgACcB5spy5A.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=718d9598d7d4" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>