{"id":347,"date":"2012-07-12T18:12:01","date_gmt":"2012-07-12T16:12:01","guid":{"rendered":"http:\/\/blog.khaledtannir.net\/?p=347"},"modified":"2012-07-12T18:12:01","modified_gmt":"2012-07-12T16:12:01","slug":"lalgorithme-fp-growth-les-bases-13","status":"publish","type":"post","link":"https:\/\/khaledtannir.net\/en\/2012\/07\/12\/lalgorithme-fp-growth-les-bases-13\/","title":{"rendered":"L&#8217;algorithme FP-Growth &#8211; Les bases (1\/3)"},"content":{"rendered":"<p>Nous avons vu que l\u2019algorithme <a title=\"L\u2019algorithme A-priori\" href=\"https:\/\/khaledtannir.net\/blog\/2011\/05\/03\/apriori\/\">Apriori<\/a> effectue plusieurs passes (scans) de la base de donn\u00e9es. Ceci peut \u00eatre tr\u00e8s p\u00e9nalisant lorsqu&#8217;il s&#8217;agit de donn\u00e9es volumineuses.<\/p>\n<p><!--more--><\/p>\n<p>Afin d&#8217;\u00e9viter les parcours r\u00e9p\u00e9t\u00e9s de la base de donn\u00e9es, <span style=\"color: #ff0000\"><span style=\"color: #000000\"><em>Han et al.<\/em> [1]<\/span> <span style=\"color: #000000\">ont propos\u00e9<\/span><\/span><span style=\"color: #000000\">\u00a0<\/span> une m\u00e9thode diff\u00e9rente des approches par niveaux permettant d&#8217;extraire des itemsets fr\u00e9quents sans g\u00e9n\u00e9ration de candidats.<br \/>\nCette m\u00e9thode s&#8217;appelle <span style=\"color: #0000ff;font-family: CMTI10;font-size: medium\"><span style=\"font-family: CMTI10;font-size: medium\"><strong>FP-growth<\/strong> <\/span><\/span><span style=\"font-family: CMR10;font-size: medium\"><span style=\"font-family: CMR10;font-size: medium\">(<em><span style=\"color: #3366ff\">Frequent<\/span> <\/em><\/span><\/span><span style=\"color: #3366ff\"><em>Pattern growth<\/em><\/span>). Elle consiste d&#8217;abord \u00e0 compresser la base de donn\u00e9es en une structure compacte appel\u00e9e <span style=\"color: #0000ff;font-family: CMTI10;font-size: medium\"><span style=\"font-family: CMTI10;font-size: medium\"><strong>FP-tree<\/strong> <\/span><\/span><span style=\"font-family: CMR10;font-size: medium\"><span style=\"font-family: CMR10;font-size: medium\">(<em><span style=\"color: #3366ff\">Frequent Pattern tree<\/span><\/em>), puis \u00e0 diviser la base de donn\u00e9es ainsi <\/span><\/span>compress\u00e9e en sous projections de la base de donn\u00e9es appel\u00e9es <span style=\"font-family: CMTI10;font-size: medium\"><span style=\"font-family: CMTI10;font-size: medium\">bases conditionnelles<\/span><\/span><span style=\"font-family: CMR10;font-size: medium\"><span style=\"font-family: CMR10;font-size: medium\">.<\/span><\/span><br \/>\n<span style=\"font-family: CMR10;font-size: medium\"><span style=\"font-family: CMR10;font-size: medium\">Chacune <\/span><\/span>de ces projections est associ\u00e9e \u00e0 un item fr\u00e9quent. L&#8217;extraction des itemsets fr\u00e9quents se fera sur chacune des projections s\u00e9par\u00e9ment.<\/p>\n<p align=\"LEFT\">L&#8217;algorithme <strong>FP-growth\u00a0<\/strong>apporte ainsi une solution au probl\u00e8me de la fouille de motifs fr\u00e9quents dans une grande base de donn\u00e9es transactionnelle. En stockant l\u2019ensemble des \u00e9l\u00e9ments fr\u00e9quents de la base de transactions dans une structure compacte, on supprimer la n\u00e9cessit\u00e9 de devoir scanner de fa\u00e7on r\u00e9p\u00e9t\u00e9e la base de transactions. De plus, en triant les \u00e9l\u00e9ments dans la structure compacte, on acc\u00e9l\u00e8re la recherche des motifs.<\/p>\n<h2><\/h2>\n<h2><span style=\"text-decoration: underline\"><span style=\"color: #008000;text-decoration: underline\">Structure d&#8217;un FP-tree :<\/span><\/span><\/h2>\n<p align=\"LEFT\">Deux \u00e9l\u00e9ments essentiels constituent la\u00a0structure d&#8217;un <span style=\"font-family: NimbusRomNo9L-ReguItal;font-size: medium\"><span style=\"font-family: NimbusRomNo9L-ReguItal;font-size: medium\">FP-tree. Ainsi les deux \u00e9l\u00e9ments qui composent cette structure sont :<\/span><\/span><\/p>\n<ol>\n<li style=\"text-align: left\"><span style=\"font-family: NimbusRomNo9L-ReguItal;font-size: medium\"><span style=\"font-family: NimbusRomNo9L-ReguItal;font-size: medium\">Une structure sous forme d&#8217;un\u00a0arbre avec une racine \u00e9tiquet\u00e9e <span style=\"color: #ff6600\"><em>&#8216;null&#8217;<\/em><\/span>.<\/span><\/span><\/li>\n<li style=\"text-align: left\"><span style=\"font-family: NimbusRomNo9L-ReguItal;font-size: medium\"><span style=\"font-family: NimbusRomNo9L-ReguItal;font-size: medium\">Un index (une table des pointeurs des items fr\u00e9quents).<\/span><\/span><\/li>\n<\/ol>\n<p align=\"LEFT\"><span style=\"font-family: NimbusRomNo9L-ReguItal;font-size: medium\"><span style=\"font-family: NimbusRomNo9L-ReguItal;font-size: medium\">&#8211; L&#8217;arbre quant \u00e0 lui\u00a0<\/span><\/span><span style=\"font-family: NimbusRomNo9L-Regu;font-size: medium\"><span style=\"font-family: NimbusRomNo9L-Regu;font-size: medium\">est compos\u00e9, comme indiqu\u00e9, d&#8217;une racine <span style=\"color: #ff6600\">&#8216;null&#8217;<\/span> et d&#8217;un ensemble de n\u0153uds<\/span><\/span> de n\u0153uds pr\u00e9fix\u00e9 par l\u2019\u00e9l\u00e9ment repr\u00e9sent\u00e9.<\/p>\n<p align=\"LEFT\">Un n\u0153ud de l&#8217;arbre est compos\u00e9 par :<\/p>\n<ul>\n<li>\n<div align=\"LEFT\">Le nom de l&#8217;item (nom-item). Il s&#8217;agit de l&#8217;item que repr\u00e9sente le n\u0153ud.<\/div>\n<\/li>\n<li>\n<div align=\"LEFT\">Le nombre d\u2019occurrence (count) de transaction o\u00f9 figure la portion de chemin jusqu\u2019\u00e0 ce n\u0153ud.<\/div>\n<\/li>\n<li>\n<div align=\"LEFT\">Un lien vers le n\u0153ud suivant dans l&#8217;arbre (node-link). Il s&#8217;agit d&#8217;un lien inter-n\u0153ud vers les autres occurrences du m\u00eame \u00e9l\u00e9ment (ayant le m^me nom-item) figurant dans d\u2019autres s\u00e9quences de transactions. Cette valeur prend la valeur <strong><em>null<\/em> <\/strong>s&#8217;il n&#8217;y a pas un tel n\u0153ud.<\/div>\n<\/li>\n<\/ul>\n<p align=\"LEFT\">&#8211; L&#8217;Index est une table d\u2019en-t\u00eate qui contient la liste des items fr\u00e9quents et qui pointe sur la premi\u00e8re occurrence de chaque \u00e9l\u00e9ment. Chaque entr\u00e9e dans cette table contient :<\/p>\n<ul>\n<li>\n<div align=\"LEFT\">Le nom de l&#8217;\u00e9l\u00e9ment (nom-item).<\/div>\n<\/li>\n<li>\n<div align=\"LEFT\">Le pointeur t\u00eate de la s\u00e9quence des n\u0153uds ayant ce m\u00eame nom-item.<\/div>\n<\/li>\n<\/ul>\n<p align=\"LEFT\">L\u2019avantage de cette repr\u00e9sentation des donn\u00e9es est qu\u2019il suffit de suivre les liens inter-n\u0153uds pour conna\u00eetre toutes les associations fr\u00e9quentes o\u00f9 figure l\u2019\u00e9l\u00e9ment fr\u00e9quent.<\/p>\n<h2 align=\"LEFT\"><\/h2>\n<h2 align=\"LEFT\"><span style=\"text-decoration: underline\"><span style=\"color: #008000;text-decoration: underline\">Construction d&#8217;un FP-Tree :<\/span><\/span><\/h2>\n<p align=\"LEFT\">La construction du <span style=\"font-family: CMTI10;font-size: medium\"><span style=\"font-family: CMTI10;font-size: medium\">FP-tree <\/span><\/span><span style=\"font-family: CMR10;font-size: medium\"><span style=\"font-family: CMR10;font-size: medium\">n\u00e9cessite deux parcours de la base des transactions (T) <\/span><\/span><span style=\"font-family: CMR10;font-size: medium\"><span style=\"font-family: CMR10;font-size: medium\">et se fait de la mani\u00e8re suivante <\/span><\/span>:<\/p>\n<ol>\n<li>\n<div align=\"LEFT\">On effectue un premier parcours de la base T pour d\u00e9terminer les items fr\u00e9quents en fonction du support minimum fourni.\u00a0 Ces items seront tri\u00e9s par la suite par ordre d\u00e9croissant de support dans une liste (L). Les items ainsi tri\u00e9s seront trait\u00e9s dans cet ordre.<\/div>\n<\/li>\n<li>\n<div align=\"LEFT\">Un second parcours de T\u00a0<span style=\"font-family: CMR10;font-size: medium\"><span style=\"font-family: CMR10;font-size: medium\">est alors effectu\u00e9.\u00a0Chaque transaction est alors tri\u00e9e selon <\/span><\/span>l&#8217;ordre des items dans L. <span style=\"font-family: CMR10;font-size: medium\"><span style=\"font-family: CMR10;font-size: medium\">Le n\u0153ud racine de l&#8217;arbre {<\/span><\/span>null} <span style=\"font-family: CMR10;font-size: medium\"><span style=\"font-family: CMR10;font-size: medium\">est d&#8217;abord cr\u00e9e. Durant ce m\u00eame parcours, une branche sera cr\u00e9\u00e9e pour chaque <\/span><\/span>transaction, mais des transactions ayant un m\u00eame pr\u00e9fixe partageront le m\u00eame d\u00e9but d&#8217;une branche de l&#8217;arbre, ainsi deux transactions identiques seront repr\u00e9sent\u00e9es par une seule et m\u00eame branche.<\/div>\n<\/li>\n<\/ol>\n<p align=\"LEFT\">La raison pour laquelle les items sont trait\u00e9s du plus fr\u00e9quent au moins fr\u00e9quent est que les items fr\u00e9quents seront proches de la racine et seront mieux partag\u00e9s par les transactions. Ceci fait du FP-tree une bonne structure compacte pour repr\u00e9senter les bases transactionnelles.<\/p>\n<div id=\"attachment_362\" style=\"width: 421px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/khaledtannir.net\/en\/wp-content\/uploads\/sites\/2\/2020\/05\/ExempleFPtreeConstruit.jpg\"><img aria-describedby=\"caption-attachment-362\" loading=\"lazy\" class=\"wp-image-362\" title=\"Exemple dun FP-tree construit\" src=\"http:\/\/blog.khaledtannir.net\/wp-content\/uploads\/2012\/07\/ExempleFPtreeConstruit-300x257.jpg\" alt=\"Exemple dun FP-tree construit\" width=\"411\" height=\"352\" \/><\/a><p id=\"caption-attachment-362\" class=\"wp-caption-text\">Exemple d&#8217;un FP-tree construit \u00e0 partir d&#8217;une base de transactions<\/p><\/div>\n<h2 align=\"LEFT\"><\/h2>\n<h2 align=\"LEFT\"><\/h2>\n<h2 align=\"LEFT\"><span style=\"text-decoration: underline\"><span style=\"color: #008000;text-decoration: underline\">R\u00e9capitulatif de l&#8217;algorithme FP-tree :<\/span><\/span><\/h2>\n<p align=\"LEFT\"><span style=\"color: #000000\">Les diff\u00e9rentes \u00e9tapes de l&#8217;algorithme Fp-growth peuvent \u00eatre r\u00e9sum\u00e9es comme indiqu\u00e9 dans cette illustration.<\/span><\/p>\n<div id=\"attachment_366\" style=\"width: 596px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/khaledtannir.net\/en\/wp-content\/uploads\/sites\/2\/2020\/05\/AlgorithmeFPgrowth-1024x765-1.png\"><img aria-describedby=\"caption-attachment-366\" loading=\"lazy\" class=\"wp-image-366\" title=\"Algorithme FP-growth\" src=\"http:\/\/blog.khaledtannir.net\/wp-content\/uploads\/2012\/07\/AlgorithmeFPgrowth-300x224.png\" alt=\"Algorithme FP-growth\" width=\"586\" height=\"438\" \/><\/a><p id=\"caption-attachment-366\" class=\"wp-caption-text\">Algorithme FP-growth<\/p><\/div>\n<h2 align=\"LEFT\"><\/h2>\n<h2 align=\"LEFT\"><\/h2>\n<h2 align=\"LEFT\"><\/h2>\n<h2 align=\"LEFT\"><span style=\"text-decoration: underline\"><span style=\"color: #008000;text-decoration: underline\">Avantages et inconv\u00e9nients :<\/span><\/span><\/h2>\n<p align=\"LEFT\">L&#8217;avantage majeur de l&#8217;algorithme est qu&#8217;il ne fait que deux balayages de la base des transactions. Le premier balayage \u00e9tant pour trouver les k-itemset puis trier le r\u00e9sultat pour construire la liste des items fr\u00e9quents dans T en ordre de fr\u00e9quence. Le deuxi\u00e8me balayage\u00a0ayant pour but la construction de la structure FP-tree. Aussi il peut \u00eatre qualifi\u00e9 de :<\/p>\n<ul>\n<li>\n<div align=\"LEFT\">Complet :<\/div>\n<ul>\n<li>\n<div align=\"LEFT\">puisqu&#8217;il contient toutes les informations sur les \u00e9l\u00e9ments fr\u00e9quents<\/div>\n<\/li>\n<li>\n<div align=\"LEFT\">\u00e0 chaque \u00e9l\u00e9ments fr\u00e9quent correspond un chemin dans l&#8217;arbre.<\/div>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<div align=\"LEFT\">Concis :<\/div>\n<ul>\n<li>\n<div align=\"LEFT\">puisqu&#8217;il ne contient que les \u00e9l\u00e9ments fr\u00e9quents. les items sont class\u00e9s en ordre de fr\u00e9quence d\u00e9croissante.<\/div>\n<\/li>\n<li>\n<div align=\"LEFT\">Plus un item est fr\u00e9quent, plus il sera utilis\u00e9 par les itemsets fr\u00e9quent. Par cons\u00e9quent son n\u0153ud sera utilis\u00e9 souvent.<\/div>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p align=\"LEFT\">N\u00e9anmoins, malgr\u00e9 sa structure compacte, cela ne garantit pas, dans le cas ou la base de transactions est trop volumineuse, que toute la structure du FP-tree tiendra en m\u00e9moire centrale. De plus la construction de la structure FP-tree peut s&#8217;av\u00e9rer longue et pourrait consommer beaucoup de ressources syst\u00e8me.<\/p>\n<p>Lire la suite de cet article:<br \/>\n<a title=\"L\u2019algorithme FP-Growth \u2013 Construction du FP-tree (2\/3)\" href=\"https:\/\/khaledtannir.net\/blog\/2012\/07\/16\/lalgorithme-fp-growth-construction-du-fp-tree-23\/\">L&#8217;algorithme FP-Growth &#8211; Construction du FP-tree (2\/3)<\/a><\/p>\n<h6 align=\"LEFT\"><span style=\"color: #888888\">[1] Han, J., Pei, J., Yin, Y., (2000). <em>Mining Frequent Patterns without Candidate Generation<\/em>. Proc. 2000 ACMSIGMOD Int. Conf. on Management of Data (SIGMOD\u201900), Dallas, TX<\/span><\/h6>\n","protected":false},"excerpt":{"rendered":"<p>Nous avons vu que l\u2019algorithme Apriori effectue plusieurs passes (scans) de la base de donn\u00e9es. Ceci peut \u00eatre tr\u00e8s p\u00e9nalisant lorsqu&#8217;il s&#8217;agit de donn\u00e9es volumineuses.<\/p>\n","protected":false},"author":2,"featured_media":3473,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[55,56,58,59],"tags":[66,67,74,75],"_links":{"self":[{"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/posts\/347"}],"collection":[{"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/comments?post=347"}],"version-history":[{"count":0,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/posts\/347\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/media\/3473"}],"wp:attachment":[{"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/media?parent=347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/categories?post=347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/khaledtannir.net\/en\/wp-json\/wp\/v2\/tags?post=347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}