Gyakori mintázatok és asszociációs szabályok
5.1. Gyakori elemhalmazok
5.1.2. Az Apriori algoritmus
Az Apriorialgoritmus az egyik legelső GYEK algoritmus. Szélességi bejárást valósít meg, ami azt jelenti, hogy a legkisebb mintából (ami az üres halmaz) ki-indulva szintenként halad előre a nagyobb méretű gyakori elemhalmazok meg-határozásához. A következő szinten (iterációban) az eggyel nagyobb méretű elemhalmazokkal foglalkozik. Az iterációk száma legfeljebb eggyel több, mint a legnagyobb gyakori elemhalmaz mérete.
A jelöltek definiálásánál a következő egyszerű tényt használja fel: Gyakori elemhalmaz minden részhalmaza gyakori. Az állítást indirekten nézve
elmond-hatjuk, hogy egy elemhalmaz biztosan nem gyakori, ha van ritka részhalmaza.
Ennek alapján ne legyen jelölt azon elemhalmaz, amelynek van ritka részhal-maza. Az Apriori algoritmus ezért építkezik lentről. Egy adott iterációban csak olyan jelöltet veszünk fel, amelynek összes valódi részhalmazáról tudjuk, hogy gyakori. Az algoritmus onnan kapta a nevét, hogy az ℓ-elemű jelölteket a bemeneti sorozat ℓ-edik átolvasásának megkezdése előtt (a priori) állítja elő.
Az ℓ-elemű jelöltek halmazát Jℓ-lel, az ℓ-elemű gyakori elemhalmazokat pedig GYℓ-lel jelöljük.
A kezdeti értékek beállítása után egy ciklus következik, amely akkor ér véget, ha nincsen egyetlenℓ-elemű jelölt sem. A cikluson belül először megha-tározzuk a jelöltek támogatottságát. Ehhez egyesével vesszük a tranzakciókat, és azon jelöltek számlálóját növeljük eggyel, amelyeket tartalmaz a vizsgált tranzakció. Ha rendelkezésre állnak a támogatottságok, akkor a jelöltek közül kiválogathatjuk a gyakoriakat.
Jelöltek előállítása
AJelölt-előállítás függvény azℓ-elemű gyakori elemhalmazokból(ℓ+ 1)-elemű jelölteket állít elő. Azok és csak azok az elemhalmazok lesznek jelöltek, amelyek minden részhalmaza gyakori.
A jelöltek előállítása során olyanℓ-elemű, gyakoriI1,I2elemhalmaz párokat keresünk, amelyekre igaz, hogy
• I1 lexikografikusan megelőzi I2-t,
• I1-ből a legnagyobb elem törlésével ugyanazt az elemhalmazt kapjuk, mintha az I2-ből törölnénk a legnagyobb elemet.
Ha a feltételeknek megfelelő párt találunk, akkor képezzük a pár unióját, majd ellenőrizzük, hogy a kapott elemhalmaznak minden valódi részhalmaza gyakori-e. A támogatottság anti-monotonitása miatt szükségtelen az összes valódi
részhalmazt megvizsgálni; ha mind az ℓ + 1 darab ℓ-elemű részhalmaz gya-kori, akkor az összes valódi részhalmaz is gyakori. AzI1,I2 halmazokat a jelölt generátorainak szokás hívni.
Példa Legyenek a 3-elemű gyakori elemhalmazok a következők: GY3 = {ABC, ABD, ACD, ACE, BCD}. Az ABC és ABD elemhalmazok megfelel-nek a feltételmegfelel-nek, ezért képezzük az uniójukat. Mivel ABCD minden három-elemű részhalmaza aGY3-nak is eleme, az ABCD jelölt lesz. Az ACD, ACE pár is megfelel a két feltételnek, de uniójuknak van olyan részhalmaza (ADE), amely nem gyakori. AzAprioria következő iterációban tehát már csak egyet-len jelölt támogatottságát határozza meg.
A fenti módszer csak akkor alkalmazható, ha ℓ > 0. Az egyelemű jelöltek előállítása egyszerű: minden egyelemű halmaz jelölt, amennyiben az üres elem-halmaz gyakori (|T | ≥min_supp). Ez összhangban áll azzal, hogy akkor lehet egy elemhalmaz jelölt, ha minden részhalmaza gyakori.
Jelöltek támogatottságának meghatározása
A jelöltek előfordulásait össze kell számolni. Ehhez egyesével vizsgáljuk a kosa-rakat, és azon jelöltek számlálóit növeljük eggyel, amelyeket tartalmaz a kosár.
1- és 2-elemű jelöltek támogatottsága – Könnyű dolgunk van, amennyi-ben a jelöltek mérete 1 vagy 2. A feladatot megoldhatjuk egy olyan lista, illetve féltömb segítségével, amelyekben a számlálókat tároljuk. Az elemek tá-mogatottságának meghatározásánál a lista j-edik eleme tárolja a j-edik elem számlálóját. A tranzakciók feldolgozásánál végigmegyünk a tranzakció elemein és növeljük a megfelelő cellákban található számlálókat.
Az első végigolvasás után kiválogathatjuk a gyakori elemeket. A további-akban már csak ezekkel az elemekkel dolgozunk, így új sorszámokat adhatunk nekik a[1..|GY1|]intervallumból (emlékeztetőülGYj-vel jelöljük aj-elemű gya-kori mintákat). Azlésk-adik elemekből álló pár támogatottságát a tömbl-edik sorának(k−l)-edik eleme tárolja (az általánosság megsértése nélkül feltehetjük, hogy l < k).
Ha egy számláló 4 byte-ot foglal, akkor a tömb helyigénye nagyjából4·(|GY1|
2
) byte. Azon elempárokhoz tartozó tömbelem értéke, amelyek sosem fordulnak elő együtt, 0 lesz. Helyet takaríthatunk meg, hogy ha csak akkor vesszük fel egy jelöltpár számlálóját, ha a párt legalább egy tranzakció tartalmazza [Ozden és tsa., 1998]. A párok támogatottságának meghatározása kevesebb memóriát fog igényelni, de ezzel együtt lassabb is lesz.
Nagyobb elemhalmazok támogatottsága – Vizsgáljuk meg részletesebben
. . . . .
1 2 3 N-1 N
supp(j)=vector[j]
1 2 3 |GY1| −1
1 . . .
2 . . .
...
|GY1| −2
|GY1| −1
supp({l, k})=tömb[l][k-l]
5.3. ábra. Adatstruktúrák az 1- és 2-elemű jelöltek támogatottságának megha-tározásához.
jelölt:
kosár:
B E G
A B C D E F G I
jelöltmutató
6
kosármutató
?
5.4. ábra. Jelöltmutató és kosármutató
az 5. sort. Adott egy tranzakció ésℓ-méretű jelöltek egy halmaza. Feladatunk meghatározni azon jelölteket, amelyek a tranzakció részhalmazai. Megoldhat-juk ezt egyszerűen úgy, hogy a jelölteket egyesével vesszük, és eldöntjük, hogy tartalmazza-e őket a tranzakció. Rendezett halmazban rendezett részhalmaz keresése elemi feladat.
Vegyünk fel két mutatót, amelyek a kosár, illetve a jelölt elemein fognak végighaladni. Kezdetben mutasson mindkét mutató az elemhalmazok első ele-meire. Amennyiben a két mutató által mutatott elemek megegyeznek, akkor léptessük mindkét mutatót a következő elemre. Ha a tranzakcióban található elem kisebb sorszámú, akkor csak a kosár mutatóját léptessük, ellenkező eset-ben pedig álljunk meg; ekkor a kosár biztosan nem tartalmazza a jelöltet. Ha a jelölt utolsó eleme is megegyezik a kosár valamelyik elemével, akkor a kosár tartalmazza a jelöltet.
Ennek az egyszerű módszernek a hátránya, hogy sok jelölt esetén lassú,
hi-5.5. ábra. AzABC, ABD, ACD, BCD jelölteket tároló szófa.
szen annyiszor kell a tranzakció elemein végighaladni, amennyi a jelöltek száma.
A gyorsabb működés érdekében a jelölteket szófában vagy hash-fában (hash-tree) célszerű tárolni. A szófát szokás prefix-fának vagy lexikografikus fának is hívni [Agrawal és tsa., 2001]. Az eredeti Apriori implementációban hash-fát alkalmaztak, azonban tesztek bizonyítják, hogy a szófa gyorsabb működést eredményez, mint a hash-fa. A hash-fa szófával való helyettesítéséről már a [Mueller, 1995]-ban írtak, ahol a szófát alkalmazóApriori algoritmust SEAR-nek nevezték el. A továbbiakban a szófában való keresést ismertetjük (a szófák felépítéséről és típusairól az alapfogalmak 2.5.1 részében már szóltunk).
Aszófa éleinek címkéi elemek lesznek. Minden csúcs egy elemhalmazt rep-rezentál, amelynek elemei a gyökérből a csúcsig vezető út éleinek címkéivel egyeznek meg. Feltehetjük, hogy az egy csúcsból induló élek, továbbá az egy úton található élek címkék szerint rendezve vannak (pl. legnagyobb elem az első helyen). A jelöltek számlálóit a jelöltet reprezentáló levélhez rendeljük. A 5.5. ábrán egy szófát láthatunk.
A t tranzakcióban azℓ-elemű jelölteket úgy találjuk meg, hogy a jelölteket leíró fa gyökeréből kiindulva, rekurzív módon bejárunk bizonyos részfákat. Ha egy d szintű belső csúcshoz a tranzakciój-edik elemén keresztül jutunk, akkor azon élein keresztül lépünk eggyel mélyebb szintre, amelyeknek címkéje meg-egyezik a tranzakció j′-edik elemével, ahol j < j′ ≤ |t| −ℓ+d (ugyanis ℓ−d elemre még szükség van ahhoz, hogy levélbe érjünk). Ha ily módon eljutunk egyℓszintű csúcshoz, az azt jelenti, hogy a csúcs által reprezentált elemhalmazt tartalmazzat, így ennek a levélnek a számlálóját kell növelnünk eggyel.
A szófát prefix fának is szokták hívni, ami arra utal, hogy a közös prefixeket csak egyszer tárolja. Ettől lesz gyorsabb a szófás támogatottság-meghatározás a naiv módszernél. A közös prefixeket összevonjuk, és csak egyszer foglalkozunk velük.
A szófa nagy előnye a gyors támogatottság-meghatározás mellett, hogy a jelölt-előállítást is támogatja. Tudjuk, hogy két gyakori elemhalmaz akkor lesz generátor, ha a legnagyobb sorszámú elemük elhagyásával ugyanazt az elem-halmazt kapjuk, vagy más szavakkal, a két gyakori elemhalmaz ℓ−1 hosszú