SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Downloaden Sie, um offline zu lesen
Marco Montanari
                       Francesco Salbaroli




L’algoritmo FPGrowth
 Cosa è FPGrowth?
 Come funziona?
 A cosa serve?
 La nostra implementazione
 I Dataset
 E’ un Associatore
 E’ basato sul concetto di Apriori, con alcune
  differenze:
   Non genera tutte le possibili soluzioni e le valuta in
    seguito (Generate and test)
   Minimizza l’occupazione di memoria
Fase 1: Ricerca del Frequent Item Set
  1.        Innanzitutto è necessario trovare il set di termini frequenti
            del database e calcolarne il supporto.
  2.        Ordinato il set in ordine decrescente, si ottiene L,la lista di
            termini frequenti.
Fase 2: Creazione dell’albero
  1.        Per ogni transazione T nel database gli elementi della
            transazione vengono ordinati secondo L.
  2.        Detta T=[p|P], si controlla che il nodo radice non abbia già
            l’elemento p tra i suoi figli.
       1.     Se è così, il nodo viene aggiunto e viene invocato un metodo
              ricorsivo per l’aggiunta della coda P a p.
       2.     In caso contrario la coda P viene aggiunta direttamente
              all’elemento p già presente.
Fase 3: FPGtowth
procedure FP_growth (Tree, a)
   if Tree contains a single path P then
        for each combination (denoted as b) of the nodes in the path P
                    generate pattern   with support = minimum support of nodes in b;
   else for each    in the header of Tree {
        generate pattern b =    with support = .support;
        construct b 's conditional pattern base and then b 's conditional FP_tree Treeb;
        if   then
                    call FP_growth (Treeb, b);
        }
 Viene utilizzato in
  modo massiccio nella
  valutazione di cosa
  mostrare al cliente in
  ambiti di commercio sia
  elettronico che non
  (Basket analysis):
   La relazione evidenziata
    è infatti del tipo “chi ha
    fatto questo ha fatto
    anche quest’altro con
    questa probabilità”
 Offre un framework che permette di
   Semplificare l’accesso ai dati
   Semplificare la gestione del plugin
   Non occuparsi dei particolari poco interessanti
    quali la GUI e l’interazione con l’utente
inst = tuples.nextElement();                                      for(String item : m_itemSet.getInvertedSortedSet()) {
Enumeration<Attribute> attributes = inst.enumerateAttributes();         Vector<TreeNode> nodes =
                                                                        TreeNodeManager.getInstance().getNodes(item);
String tid = inst.stringValue(attributes.nextElement());
                                                                        CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode();
ArrayList<String> list = new ArrayList<String>();
                                                                        for (TreeNode node : nodes) {
while (attributes.hasMoreElements()) {
                                                                                   tmpSubTree.addSubTree(node);
       Attribute item = attributes.nextElement();
                                                                        }
       tmp = inst.stringValue(item);
                                                                        if (m_verbose) {
       StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;);
                                                                                   System.out.println(quot;Unpruned candidate tree:quot;);
       while(tok.hasMoreElements()) {
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
                  String element = tok.nextToken();
                                                                        }
                  list.add(element);
                                                                        tmpSubTree.prune(item, m_calcMinSupport);
       }
                                                                        if (m_verbose) {
}
                                                                                   System.out.println(quot;Pruned candidate tree:quot;);
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
m_itemSet.sortExternalVector(list);
                                                                        }
if(m_verbose) {
       System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;);
                                                                        toStringResult = toStringResult.concat(tmpSubTree.wekaToString());
       for (String string : list) {
                                                                        if (m_verbose) {
                  System.out.print(string);
                                                                                   System.out.println(quot;WekaToString:quot;);
       }
                                                                                   System.out.println(tmpSubTree.wekaToString());
       System.out.println();
                                                                        }
}
                                                                  }
m_tree.addTransaction(list);
inst = tuples.nextElement();                                      for(String item : m_itemSet.getInvertedSortedSet()) {
Enumeration<Attribute> attributes = inst.enumerateAttributes();         Vector<TreeNode> nodes =
                                                                        TreeNodeManager.getInstance().getNodes(item);
String tid = inst.stringValue(attributes.nextElement());
                                                                        CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode();
ArrayList<String> list = new ArrayList<String>();
                                                                        for (TreeNode node : nodes) {
while (attributes.hasMoreElements()) {
                                                                                   tmpSubTree.addSubTree(node);
       Attribute item = attributes.nextElement();
                                                                        }
       tmp = inst.stringValue(item);
                                                                        if (m_verbose) {
       StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;);
                                                                                   System.out.println(quot;Unpruned candidate tree:quot;);
       while(tok.hasMoreElements()) {
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
                  String element = tok.nextToken();
                                                                        }
                  list.add(element);
                                                                        tmpSubTree.prune(item, m_calcMinSupport);
       }
                                                                        if (m_verbose) {
}
                                                                                   System.out.println(quot;Pruned candidate tree:quot;);
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
m_itemSet.sortExternalVector(list);
                                                                        }
if(m_verbose) {
       System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;);
                                                                        toStringResult = toStringResult.concat(tmpSubTree.wekaToString());
       for (String string : list) {
                                                                        if (m_verbose) {
                  System.out.print(string);
                                                                                   System.out.println(quot;WekaToString:quot;);
       }
                                                                                   System.out.println(tmpSubTree.wekaToString());
       System.out.println();
                                                                        }
}
                                                                  }
m_tree.addTransaction(list);
inst = tuples.nextElement();                                      for(String item : m_itemSet.getInvertedSortedSet()) {
Enumeration<Attribute> attributes = inst.enumerateAttributes();         Vector<TreeNode> nodes =
                                                                        TreeNodeManager.getInstance().getNodes(item);
String tid = inst.stringValue(attributes.nextElement());
                                                                        CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode();
ArrayList<String> list = new ArrayList<String>();
                                                                        for (TreeNode node : nodes) {
while (attributes.hasMoreElements()) {
                                                                                   tmpSubTree.addSubTree(node);
       Attribute item = attributes.nextElement();
                                                                        }
       tmp = inst.stringValue(item);
                                                                        if (m_verbose) {
       StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;);
                                                                                   System.out.println(quot;Unpruned candidate tree:quot;);
       while(tok.hasMoreElements()) {
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
                  String element = tok.nextToken();
                                                                        }
                  list.add(element);
                                                                        tmpSubTree.prune(item, m_calcMinSupport);
       }
                                                                        if (m_verbose) {
}
                                                                                   System.out.println(quot;Pruned candidate tree:quot;);
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
m_itemSet.sortExternalVector(list);
                                                                        }
if(m_verbose) {
       System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;);
                                                                        toStringResult = toStringResult.concat(tmpSubTree.wekaToString());
       for (String string : list) {
                                                                        if (m_verbose) {
                  System.out.print(string);
                                                                                   System.out.println(quot;WekaToString:quot;);
       }
                                                                                   System.out.println(tmpSubTree.wekaToString());
       System.out.println();
                                                                        }
}
                                                                  }
m_tree.addTransaction(list);
inst = tuples.nextElement();                                      for(String item : m_itemSet.getInvertedSortedSet()) {
Enumeration<Attribute> attributes = inst.enumerateAttributes();         Vector<TreeNode> nodes =
                                                                        TreeNodeManager.getInstance().getNodes(item);
String tid = inst.stringValue(attributes.nextElement());
                                                                        CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode();
ArrayList<String> list = new ArrayList<String>();
                                                                        for (TreeNode node : nodes) {
while (attributes.hasMoreElements()) {
                                                                                   tmpSubTree.addSubTree(node);
       Attribute item = attributes.nextElement();
                                                                        }
       tmp = inst.stringValue(item);
                                                                        if (m_verbose) {
       StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;);
                                                                                   System.out.println(quot;Unpruned candidate tree:quot;);
       while(tok.hasMoreElements()) {
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
                  String element = tok.nextToken();
                                                                        }
                  list.add(element);
                                                                        tmpSubTree.prune(item, m_calcMinSupport);
       }
                                                                        if (m_verbose) {
}
                                                                                   System.out.println(quot;Pruned candidate tree:quot;);
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
m_itemSet.sortExternalVector(list);
                                                                        }
if(m_verbose) {
       System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;);
                                                                        toStringResult = toStringResult.concat(tmpSubTree.wekaToString());
       for (String string : list) {
                                                                        if (m_verbose) {
                  System.out.print(string);
                                                                                   System.out.println(quot;WekaToString:quot;);
       }
                                                                                   System.out.println(tmpSubTree.wekaToString());
       System.out.println();
                                                                        }
}
                                                                  }
m_tree.addTransaction(list);
inst = tuples.nextElement();                                      for(String item : m_itemSet.getInvertedSortedSet()) {
Enumeration<Attribute> attributes = inst.enumerateAttributes();         Vector<TreeNode> nodes =
                                                                        TreeNodeManager.getInstance().getNodes(item);
String tid = inst.stringValue(attributes.nextElement());
                                                                        CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode();
ArrayList<String> list = new ArrayList<String>();
                                                                        for (TreeNode node : nodes) {
while (attributes.hasMoreElements()) {
                                                                                   tmpSubTree.addSubTree(node);
       Attribute item = attributes.nextElement();
                                                                        }
       tmp = inst.stringValue(item);
                                                                        if (m_verbose) {
       StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;);
                                                                                   System.out.println(quot;Unpruned candidate tree:quot;);
       while(tok.hasMoreElements()) {
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
                  String element = tok.nextToken();
                                                                        }
                  list.add(element);
                                                                        tmpSubTree.prune(item, m_calcMinSupport);
       }
                                                                        if (m_verbose) {
}
                                                                                   System.out.println(quot;Pruned candidate tree:quot;);
                                                                                   System.out.println(quot;quot;+ tmpSubTree);
m_itemSet.sortExternalVector(list);
                                                                        }
if(m_verbose) {
       System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;);
                                                                        toStringResult = toStringResult.concat(tmpSubTree.wekaToString());
       for (String string : list) {
                                                                        if (m_verbose) {
                  System.out.print(string);
                                                                                   System.out.println(quot;WekaToString:quot;);
       }
                                                                                   System.out.println(tmpSubTree.wekaToString());
       System.out.println();
                                                                        }
}
                                                                  }
m_tree.addTransaction(list);
 I due dataset selezionati sono
   Il dataset dimostrativo del paper
   Un dataset legato ad un ipotetico negozio di DVD,
    con acquisti effettuati da utenti di vario genere e
    con diversi interessi di argomento o attori
FP-Growth                                                                    Apriori
               Pro                                      Contro                                  Pro                               Contro
                                                                                                                           Grande quantità di
    Minimizza la ricerca di nodi                                                                                           memoria per mantenere
                                                                                                                            tutti i percorsi possibili.
    Ricerca completamente tutte le                                                   Ricerca completamente tutte le
     combinazioni                                                                      combinazioni
                                               E’ necessario esplorare tutto
                                                l’albero più volte, quindi da un
                                                punto di vista temporale
                                                diventa molto oneroso




Si osserva come le performance
                                                                                       Tempo di esecuzione
degradino non tanto all’aumentare
della dimensione delle transazioni,
quanto più che altro all’aumentare
del loro numero.                                                                                                                                     n=35
                                                                                                                                                    n=25

                                                                                                                                                n=15

                                                                                                                                            n=5
FP-Growth                                                                    Apriori
               Pro                                      Contro                                  Pro                               Contro
                                                                                                                           Grande quantità di
    Minimizza la ricerca di nodi                                                                                           memoria per mantenere
                                                                                                                            tutti i percorsi possibili.
    Ricerca completamente tutte le                                                   Ricerca completamente tutte le
     combinazioni                                                                      combinazioni
                                               E’ necessario esplorare tutto
                                                l’albero più volte, quindi da un
                                                punto di vista temporale
                                                diventa molto oneroso




Si osserva come le performance
                                                                                       Tempo di esecuzione
degradino non tanto all’aumentare
della dimensione delle transazioni,
quanto più che altro all’aumentare
del loro numero.                                                                                                                                     n=35
                                                                                                                                                    n=25

                                                                                                                                                n=15
                                                   Sarebbe stato
                                                                                                                                            n=5
                                                interessante usare
                                                  un cubo OLAP…
FPGrowth Presentation

Weitere ähnliche Inhalte

Andere mochten auch

Stoor Outlook Express Attachment
Stoor Outlook Express AttachmentStoor Outlook Express Attachment
Stoor Outlook Express AttachmentFanie van der Merwe
 
Registro De Evaluacion Isabe Lx
Registro De Evaluacion Isabe LxRegistro De Evaluacion Isabe Lx
Registro De Evaluacion Isabe Lxisabel222
 
San SandurniñO
San SandurniñOSan SandurniñO
San SandurniñOInesytta
 
Nitin's marriage with Vibha - Invite
Nitin's marriage with Vibha - InviteNitin's marriage with Vibha - Invite
Nitin's marriage with Vibha - InviteNitin Karthy
 
BBOT Reference Letter
BBOT Reference LetterBBOT Reference Letter
BBOT Reference LetterNeil Calder
 
תכנון בעזרת תרחישים 2010
תכנון בעזרת תרחישים 2010תכנון בעזרת תרחישים 2010
תכנון בעזרת תרחישים 2010Yonathan Lerner
 
Contes Dels Alumnes De Sisè
Contes Dels Alumnes De SisèContes Dels Alumnes De Sisè
Contes Dels Alumnes De Sisèclescorts08
 
Computer Assisted Reporting (Redacted)
Computer Assisted Reporting (Redacted)Computer Assisted Reporting (Redacted)
Computer Assisted Reporting (Redacted)Paolo Attivissimo
 
Agua , Fuente De Vida
Agua , Fuente De VidaAgua , Fuente De Vida
Agua , Fuente De VidaRuth Sanchez
 
READING AND WRITING Cultural Responsive Strategies for ESL Success in Reading...
READING AND WRITING Cultural Responsive Strategies for ESL Success in Reading...READING AND WRITING Cultural Responsive Strategies for ESL Success in Reading...
READING AND WRITING Cultural Responsive Strategies for ESL Success in Reading...Dr. Bonnie Mozer
 
Mariage Slave
Mariage SlaveMariage Slave
Mariage Slavealexiane
 

Andere mochten auch (20)

E-learning
E-learningE-learning
E-learning
 
Stoor Outlook Express Attachment
Stoor Outlook Express AttachmentStoor Outlook Express Attachment
Stoor Outlook Express Attachment
 
Registro De Evaluacion Isabe Lx
Registro De Evaluacion Isabe LxRegistro De Evaluacion Isabe Lx
Registro De Evaluacion Isabe Lx
 
Finlandia I
Finlandia IFinlandia I
Finlandia I
 
Dorrea (Solairuka)
Dorrea (Solairuka)Dorrea (Solairuka)
Dorrea (Solairuka)
 
San SandurniñO
San SandurniñOSan SandurniñO
San SandurniñO
 
Nitin's marriage with Vibha - Invite
Nitin's marriage with Vibha - InviteNitin's marriage with Vibha - Invite
Nitin's marriage with Vibha - Invite
 
BBOT Reference Letter
BBOT Reference LetterBBOT Reference Letter
BBOT Reference Letter
 
Mis Compis
Mis CompisMis Compis
Mis Compis
 
ET DEIXO LES MEVES ULLERES
ET DEIXO LES MEVES ULLERESET DEIXO LES MEVES ULLERES
ET DEIXO LES MEVES ULLERES
 
תכנון בעזרת תרחישים 2010
תכנון בעזרת תרחישים 2010תכנון בעזרת תרחישים 2010
תכנון בעזרת תרחישים 2010
 
Contes Dels Alumnes De Sisè
Contes Dels Alumnes De SisèContes Dels Alumnes De Sisè
Contes Dels Alumnes De Sisè
 
Computer Assisted Reporting (Redacted)
Computer Assisted Reporting (Redacted)Computer Assisted Reporting (Redacted)
Computer Assisted Reporting (Redacted)
 
哥雅
哥雅哥雅
哥雅
 
Agua , Fuente De Vida
Agua , Fuente De VidaAgua , Fuente De Vida
Agua , Fuente De Vida
 
READING AND WRITING Cultural Responsive Strategies for ESL Success in Reading...
READING AND WRITING Cultural Responsive Strategies for ESL Success in Reading...READING AND WRITING Cultural Responsive Strategies for ESL Success in Reading...
READING AND WRITING Cultural Responsive Strategies for ESL Success in Reading...
 
Mariage Slave
Mariage SlaveMariage Slave
Mariage Slave
 
jjjj
jjjjjjjj
jjjj
 
Burua/Head and Neck
Burua/Head and NeckBurua/Head and Neck
Burua/Head and Neck
 
Belga Final
Belga FinalBelga Final
Belga Final
 

Ähnlich wie FPGrowth Presentation

Eserc v del 26 marzo 2012
 Eserc v del 26 marzo 2012 Eserc v del 26 marzo 2012
Eserc v del 26 marzo 2012STELITANO
 
Algoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeAlgoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeSergio Porcu
 
PHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLPHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLextrategy
 
Javascript - 8 | WebMaster & WebDesigner
Javascript - 8 | WebMaster & WebDesignerJavascript - 8 | WebMaster & WebDesigner
Javascript - 8 | WebMaster & WebDesignerMatteo Magni
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiSergio Porcu
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)STELITANO
 
Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)FLT.lab
 

Ähnlich wie FPGrowth Presentation (16)

Selection sort
Selection sortSelection sort
Selection sort
 
Insertion sort
Insertion sortInsertion sort
Insertion sort
 
Eserc v del 26 marzo 2012
 Eserc v del 26 marzo 2012 Eserc v del 26 marzo 2012
Eserc v del 26 marzo 2012
 
Java lezione 10
Java lezione 10Java lezione 10
Java lezione 10
 
Ese01 java
Ese01 javaEse01 java
Ese01 java
 
Java lezione 7
Java lezione 7Java lezione 7
Java lezione 7
 
8 Algoritmi
8   Algoritmi8   Algoritmi
8 Algoritmi
 
Algoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeAlgoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, code
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
PHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLPHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQL
 
Javascript - 8 | WebMaster & WebDesigner
Javascript - 8 | WebMaster & WebDesignerJavascript - 8 | WebMaster & WebDesigner
Javascript - 8 | WebMaster & WebDesigner
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)
 
Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)
 
primi comandi SQL con Mysql
primi comandi SQL con Mysqlprimi comandi SQL con Mysql
primi comandi SQL con Mysql
 
Array
ArrayArray
Array
 

Mehr von Marco Montanari

OpenStreetMap_LinuxDay2023.pptx
OpenStreetMap_LinuxDay2023.pptxOpenStreetMap_LinuxDay2023.pptx
OpenStreetMap_LinuxDay2023.pptxMarco Montanari
 
Ohm itwikicon tech - english
Ohm itwikicon tech - englishOhm itwikicon tech - english
Ohm itwikicon tech - englishMarco Montanari
 
ITWikiCon 2020 - OpenHistoryMap
ITWikiCon 2020 - OpenHistoryMapITWikiCon 2020 - OpenHistoryMap
ITWikiCon 2020 - OpenHistoryMapMarco Montanari
 
ITWikiCon - Edutainment e Wikipedia
ITWikiCon - Edutainment e WikipediaITWikiCon - Edutainment e Wikipedia
ITWikiCon - Edutainment e WikipediaMarco Montanari
 
MN-MAP Poster for Foss4G2018
MN-MAP Poster for Foss4G2018MN-MAP Poster for Foss4G2018
MN-MAP Poster for Foss4G2018Marco Montanari
 
GEOCONTEXT AND CHCONTEXT GEOGRAPHIC INFORMATION IN CULTURAL HERITAGE
GEOCONTEXT AND CHCONTEXT GEOGRAPHIC INFORMATION IN CULTURAL HERITAGEGEOCONTEXT AND CHCONTEXT GEOGRAPHIC INFORMATION IN CULTURAL HERITAGE
GEOCONTEXT AND CHCONTEXT GEOGRAPHIC INFORMATION IN CULTURAL HERITAGEMarco Montanari
 
Saas rad with django, django rest framework
Saas rad with django, django rest frameworkSaas rad with django, django rest framework
Saas rad with django, django rest frameworkMarco Montanari
 
Intro datajournalism - 14-15/06/2017
Intro datajournalism - 14-15/06/2017Intro datajournalism - 14-15/06/2017
Intro datajournalism - 14-15/06/2017Marco Montanari
 
Open Data e Trasparenza come punto di contatto fra cittadinanza e politica
Open Data e Trasparenza come punto di contatto fra cittadinanza e politicaOpen Data e Trasparenza come punto di contatto fra cittadinanza e politica
Open Data e Trasparenza come punto di contatto fra cittadinanza e politicaMarco Montanari
 

Mehr von Marco Montanari (20)

OpenStreetMap_LinuxDay2023.pptx
OpenStreetMap_LinuxDay2023.pptxOpenStreetMap_LinuxDay2023.pptx
OpenStreetMap_LinuxDay2023.pptx
 
Ohm wikimania 2021
Ohm wikimania 2021Ohm wikimania 2021
Ohm wikimania 2021
 
Ohm itwikicon tech - english
Ohm itwikicon tech - englishOhm itwikicon tech - english
Ohm itwikicon tech - english
 
ITWikiCon 2020 - OpenHistoryMap
ITWikiCon 2020 - OpenHistoryMapITWikiCon 2020 - OpenHistoryMap
ITWikiCon 2020 - OpenHistoryMap
 
ITWikiCon - Edutainment e Wikipedia
ITWikiCon - Edutainment e WikipediaITWikiCon - Edutainment e Wikipedia
ITWikiCon - Edutainment e Wikipedia
 
Storia dell'informatica
Storia dell'informaticaStoria dell'informatica
Storia dell'informatica
 
Bononia 1115
Bononia 1115Bononia 1115
Bononia 1115
 
ChContext
ChContextChContext
ChContext
 
MN-MAP Poster for Foss4G2018
MN-MAP Poster for Foss4G2018MN-MAP Poster for Foss4G2018
MN-MAP Poster for Foss4G2018
 
GEOCONTEXT AND CHCONTEXT GEOGRAPHIC INFORMATION IN CULTURAL HERITAGE
GEOCONTEXT AND CHCONTEXT GEOGRAPHIC INFORMATION IN CULTURAL HERITAGEGEOCONTEXT AND CHCONTEXT GEOGRAPHIC INFORMATION IN CULTURAL HERITAGE
GEOCONTEXT AND CHCONTEXT GEOGRAPHIC INFORMATION IN CULTURAL HERITAGE
 
OHM at FOSS4G17
OHM at FOSS4G17OHM at FOSS4G17
OHM at FOSS4G17
 
Mn map poster
Mn map posterMn map poster
Mn map poster
 
Saas rad with django, django rest framework
Saas rad with django, django rest frameworkSaas rad with django, django rest framework
Saas rad with django, django rest framework
 
poster mn-auth
poster mn-authposter mn-auth
poster mn-auth
 
poster holodocker
poster holodockerposter holodocker
poster holodocker
 
Big data, big tourism
Big data, big tourismBig data, big tourism
Big data, big tourism
 
Intro datajournalism - 14-15/06/2017
Intro datajournalism - 14-15/06/2017Intro datajournalism - 14-15/06/2017
Intro datajournalism - 14-15/06/2017
 
OHM at Kainua17
OHM at Kainua17OHM at Kainua17
OHM at Kainua17
 
OHM Workshop
OHM WorkshopOHM Workshop
OHM Workshop
 
Open Data e Trasparenza come punto di contatto fra cittadinanza e politica
Open Data e Trasparenza come punto di contatto fra cittadinanza e politicaOpen Data e Trasparenza come punto di contatto fra cittadinanza e politica
Open Data e Trasparenza come punto di contatto fra cittadinanza e politica
 

Kürzlich hochgeladen

Confronto tra Sparta e Atene classiche.ppt
Confronto tra Sparta e Atene classiche.pptConfronto tra Sparta e Atene classiche.ppt
Confronto tra Sparta e Atene classiche.pptcarlottagalassi
 
Presentazioni Efficaci e lezioni di Educazione Civica
Presentazioni Efficaci e lezioni di Educazione CivicaPresentazioni Efficaci e lezioni di Educazione Civica
Presentazioni Efficaci e lezioni di Educazione CivicaSalvatore Cianciabella
 
Lorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptxLorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptxlorenzodemidio01
 
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptxLorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptxlorenzodemidio01
 
discorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxdiscorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxtecongo2007
 
Lorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptxLorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptxlorenzodemidio01
 
Descrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxDescrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxtecongo2007
 
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptxLorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptxlorenzodemidio01
 
descrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptxdescrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptxtecongo2007
 
Quadrilateri e isometrie studente di liceo
Quadrilateri e isometrie studente di liceoQuadrilateri e isometrie studente di liceo
Quadrilateri e isometrie studente di liceoyanmeng831
 
Scrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileScrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileNicola Rabbi
 

Kürzlich hochgeladen (11)

Confronto tra Sparta e Atene classiche.ppt
Confronto tra Sparta e Atene classiche.pptConfronto tra Sparta e Atene classiche.ppt
Confronto tra Sparta e Atene classiche.ppt
 
Presentazioni Efficaci e lezioni di Educazione Civica
Presentazioni Efficaci e lezioni di Educazione CivicaPresentazioni Efficaci e lezioni di Educazione Civica
Presentazioni Efficaci e lezioni di Educazione Civica
 
Lorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptxLorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptx
 
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptxLorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
 
discorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptxdiscorso generale sulla fisica e le discipline.pptx
discorso generale sulla fisica e le discipline.pptx
 
Lorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptxLorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptx
 
Descrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptxDescrizione Piccolo teorema di Talete.pptx
Descrizione Piccolo teorema di Talete.pptx
 
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptxLorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
 
descrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptxdescrizioni della antica civiltà dei sumeri.pptx
descrizioni della antica civiltà dei sumeri.pptx
 
Quadrilateri e isometrie studente di liceo
Quadrilateri e isometrie studente di liceoQuadrilateri e isometrie studente di liceo
Quadrilateri e isometrie studente di liceo
 
Scrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibileScrittura seo e scrittura accessibile
Scrittura seo e scrittura accessibile
 

FPGrowth Presentation

  • 1. Marco Montanari Francesco Salbaroli L’algoritmo FPGrowth
  • 2.  Cosa è FPGrowth?  Come funziona?  A cosa serve?  La nostra implementazione  I Dataset
  • 3.  E’ un Associatore  E’ basato sul concetto di Apriori, con alcune differenze:  Non genera tutte le possibili soluzioni e le valuta in seguito (Generate and test)  Minimizza l’occupazione di memoria
  • 4. Fase 1: Ricerca del Frequent Item Set 1. Innanzitutto è necessario trovare il set di termini frequenti del database e calcolarne il supporto. 2. Ordinato il set in ordine decrescente, si ottiene L,la lista di termini frequenti. Fase 2: Creazione dell’albero 1. Per ogni transazione T nel database gli elementi della transazione vengono ordinati secondo L. 2. Detta T=[p|P], si controlla che il nodo radice non abbia già l’elemento p tra i suoi figli. 1. Se è così, il nodo viene aggiunto e viene invocato un metodo ricorsivo per l’aggiunta della coda P a p. 2. In caso contrario la coda P viene aggiunta direttamente all’elemento p già presente.
  • 5. Fase 3: FPGtowth procedure FP_growth (Tree, a) if Tree contains a single path P then for each combination (denoted as b) of the nodes in the path P generate pattern with support = minimum support of nodes in b; else for each in the header of Tree { generate pattern b = with support = .support; construct b 's conditional pattern base and then b 's conditional FP_tree Treeb; if then call FP_growth (Treeb, b); }
  • 6.  Viene utilizzato in modo massiccio nella valutazione di cosa mostrare al cliente in ambiti di commercio sia elettronico che non (Basket analysis):  La relazione evidenziata è infatti del tipo “chi ha fatto questo ha fatto anche quest’altro con questa probabilità”
  • 7.  Offre un framework che permette di  Semplificare l’accesso ai dati  Semplificare la gestione del plugin  Non occuparsi dei particolari poco interessanti quali la GUI e l’interazione con l’utente
  • 8.
  • 9. inst = tuples.nextElement(); for(String item : m_itemSet.getInvertedSortedSet()) { Enumeration<Attribute> attributes = inst.enumerateAttributes(); Vector<TreeNode> nodes = TreeNodeManager.getInstance().getNodes(item); String tid = inst.stringValue(attributes.nextElement()); CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode(); ArrayList<String> list = new ArrayList<String>(); for (TreeNode node : nodes) { while (attributes.hasMoreElements()) { tmpSubTree.addSubTree(node); Attribute item = attributes.nextElement(); } tmp = inst.stringValue(item); if (m_verbose) { StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;); System.out.println(quot;Unpruned candidate tree:quot;); while(tok.hasMoreElements()) { System.out.println(quot;quot;+ tmpSubTree); String element = tok.nextToken(); } list.add(element); tmpSubTree.prune(item, m_calcMinSupport); } if (m_verbose) { } System.out.println(quot;Pruned candidate tree:quot;); System.out.println(quot;quot;+ tmpSubTree); m_itemSet.sortExternalVector(list); } if(m_verbose) { System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;); toStringResult = toStringResult.concat(tmpSubTree.wekaToString()); for (String string : list) { if (m_verbose) { System.out.print(string); System.out.println(quot;WekaToString:quot;); } System.out.println(tmpSubTree.wekaToString()); System.out.println(); } } } m_tree.addTransaction(list);
  • 10. inst = tuples.nextElement(); for(String item : m_itemSet.getInvertedSortedSet()) { Enumeration<Attribute> attributes = inst.enumerateAttributes(); Vector<TreeNode> nodes = TreeNodeManager.getInstance().getNodes(item); String tid = inst.stringValue(attributes.nextElement()); CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode(); ArrayList<String> list = new ArrayList<String>(); for (TreeNode node : nodes) { while (attributes.hasMoreElements()) { tmpSubTree.addSubTree(node); Attribute item = attributes.nextElement(); } tmp = inst.stringValue(item); if (m_verbose) { StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;); System.out.println(quot;Unpruned candidate tree:quot;); while(tok.hasMoreElements()) { System.out.println(quot;quot;+ tmpSubTree); String element = tok.nextToken(); } list.add(element); tmpSubTree.prune(item, m_calcMinSupport); } if (m_verbose) { } System.out.println(quot;Pruned candidate tree:quot;); System.out.println(quot;quot;+ tmpSubTree); m_itemSet.sortExternalVector(list); } if(m_verbose) { System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;); toStringResult = toStringResult.concat(tmpSubTree.wekaToString()); for (String string : list) { if (m_verbose) { System.out.print(string); System.out.println(quot;WekaToString:quot;); } System.out.println(tmpSubTree.wekaToString()); System.out.println(); } } } m_tree.addTransaction(list);
  • 11. inst = tuples.nextElement(); for(String item : m_itemSet.getInvertedSortedSet()) { Enumeration<Attribute> attributes = inst.enumerateAttributes(); Vector<TreeNode> nodes = TreeNodeManager.getInstance().getNodes(item); String tid = inst.stringValue(attributes.nextElement()); CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode(); ArrayList<String> list = new ArrayList<String>(); for (TreeNode node : nodes) { while (attributes.hasMoreElements()) { tmpSubTree.addSubTree(node); Attribute item = attributes.nextElement(); } tmp = inst.stringValue(item); if (m_verbose) { StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;); System.out.println(quot;Unpruned candidate tree:quot;); while(tok.hasMoreElements()) { System.out.println(quot;quot;+ tmpSubTree); String element = tok.nextToken(); } list.add(element); tmpSubTree.prune(item, m_calcMinSupport); } if (m_verbose) { } System.out.println(quot;Pruned candidate tree:quot;); System.out.println(quot;quot;+ tmpSubTree); m_itemSet.sortExternalVector(list); } if(m_verbose) { System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;); toStringResult = toStringResult.concat(tmpSubTree.wekaToString()); for (String string : list) { if (m_verbose) { System.out.print(string); System.out.println(quot;WekaToString:quot;); } System.out.println(tmpSubTree.wekaToString()); System.out.println(); } } } m_tree.addTransaction(list);
  • 12. inst = tuples.nextElement(); for(String item : m_itemSet.getInvertedSortedSet()) { Enumeration<Attribute> attributes = inst.enumerateAttributes(); Vector<TreeNode> nodes = TreeNodeManager.getInstance().getNodes(item); String tid = inst.stringValue(attributes.nextElement()); CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode(); ArrayList<String> list = new ArrayList<String>(); for (TreeNode node : nodes) { while (attributes.hasMoreElements()) { tmpSubTree.addSubTree(node); Attribute item = attributes.nextElement(); } tmp = inst.stringValue(item); if (m_verbose) { StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;); System.out.println(quot;Unpruned candidate tree:quot;); while(tok.hasMoreElements()) { System.out.println(quot;quot;+ tmpSubTree); String element = tok.nextToken(); } list.add(element); tmpSubTree.prune(item, m_calcMinSupport); } if (m_verbose) { } System.out.println(quot;Pruned candidate tree:quot;); System.out.println(quot;quot;+ tmpSubTree); m_itemSet.sortExternalVector(list); } if(m_verbose) { System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;); toStringResult = toStringResult.concat(tmpSubTree.wekaToString()); for (String string : list) { if (m_verbose) { System.out.print(string); System.out.println(quot;WekaToString:quot;); } System.out.println(tmpSubTree.wekaToString()); System.out.println(); } } } m_tree.addTransaction(list);
  • 13. inst = tuples.nextElement(); for(String item : m_itemSet.getInvertedSortedSet()) { Enumeration<Attribute> attributes = inst.enumerateAttributes(); Vector<TreeNode> nodes = TreeNodeManager.getInstance().getNodes(item); String tid = inst.stringValue(attributes.nextElement()); CandidateRootTreeNode tmpSubTree = new CandidateRootTreeNode(); ArrayList<String> list = new ArrayList<String>(); for (TreeNode node : nodes) { while (attributes.hasMoreElements()) { tmpSubTree.addSubTree(node); Attribute item = attributes.nextElement(); } tmp = inst.stringValue(item); if (m_verbose) { StringTokenizer tok = new StringTokenizer(tmp,quot;;quot;); System.out.println(quot;Unpruned candidate tree:quot;); while(tok.hasMoreElements()) { System.out.println(quot;quot;+ tmpSubTree); String element = tok.nextToken(); } list.add(element); tmpSubTree.prune(item, m_calcMinSupport); } if (m_verbose) { } System.out.println(quot;Pruned candidate tree:quot;); System.out.println(quot;quot;+ tmpSubTree); m_itemSet.sortExternalVector(list); } if(m_verbose) { System.out.print(quot;Elementi ordinati di TID quot;+tid+quot;: quot;); toStringResult = toStringResult.concat(tmpSubTree.wekaToString()); for (String string : list) { if (m_verbose) { System.out.print(string); System.out.println(quot;WekaToString:quot;); } System.out.println(tmpSubTree.wekaToString()); System.out.println(); } } } m_tree.addTransaction(list);
  • 14.  I due dataset selezionati sono  Il dataset dimostrativo del paper  Un dataset legato ad un ipotetico negozio di DVD, con acquisti effettuati da utenti di vario genere e con diversi interessi di argomento o attori
  • 15. FP-Growth Apriori Pro Contro Pro Contro  Grande quantità di  Minimizza la ricerca di nodi memoria per mantenere tutti i percorsi possibili.  Ricerca completamente tutte le  Ricerca completamente tutte le combinazioni combinazioni  E’ necessario esplorare tutto l’albero più volte, quindi da un punto di vista temporale diventa molto oneroso Si osserva come le performance Tempo di esecuzione degradino non tanto all’aumentare della dimensione delle transazioni, quanto più che altro all’aumentare del loro numero. n=35 n=25 n=15 n=5
  • 16. FP-Growth Apriori Pro Contro Pro Contro  Grande quantità di  Minimizza la ricerca di nodi memoria per mantenere tutti i percorsi possibili.  Ricerca completamente tutte le  Ricerca completamente tutte le combinazioni combinazioni  E’ necessario esplorare tutto l’albero più volte, quindi da un punto di vista temporale diventa molto oneroso Si osserva come le performance Tempo di esecuzione degradino non tanto all’aumentare della dimensione delle transazioni, quanto più che altro all’aumentare del loro numero. n=35 n=25 n=15 Sarebbe stato n=5 interessante usare un cubo OLAP…