• Nem Talált Eredményt

A gyakori elemhalmaz fogalma

In document Kinek szól ez a jegyzet? (Pldal 194-199)

Gyakori mintázatok és asszociációs szabályok

5.1. Gyakori elemhalmazok

5.1.1. A gyakori elemhalmaz fogalma

Legyen I = {i1, i2, . . . , im} elemek halmaza és T = ⟨t1, . . . , tn az I hatvány-halmaza felett értelmezett sorozat, azaz tj ⊆ I. A T sorozatot bemeneti so-rozatnak hívjuk, amelynek tj elemei a tranzakciók. Az I ⊆ I elemhalmaz

fedése megegyezik azon tranzakciók sorozatával, amelyeknek részhalmaza az I. Az I elemhalmaz támogatottsága a fedésének elemszámával egyezik meg (jelölésben supp(I)). Az I gyakori, amennyiben támogatottsága nem kisebb egy el®re megadott konstansnál, amelyet hagyományosan min_supp-pal jelö-lünk, és támogatottsági küszöbnek hívunk. A gyakori elemhalmazok keresése során adott egy I elemhalmaz,T bemeneti sorozat, min_supp támogatottsági küszöb, feladatunk meghatározni a gyakori elemhalmazokat és azok támoga-tottságát. Az egyszer¶ség kedvéért a halmazt jelöl® kapcsos zárójeleket (s®t az elemek határoló vessz®t) gyakran elhagyjuk, tehát például az

⟨{A, C, D},{B, C, E},{A, B, C, E},{B, E},{A, B, C, E}⟩

sorozatot

⟨ACD, BCE, ABCE, BE, ABCE⟩ formában írjuk.

Az általánosság megsértése nélkül feltehetjük, hogy azIelemein tudunk egy rendezést deniálni, és a minták illetve a tranzakciók elemeit minden esetben nagyság szerint növ® sorrendben tároljuk. Ezen rendezés szerinti lexikogra-kusan tudjuk rendezni az azonos méret¶ halmazokat.

A keresési teret úgy képzelhetjük el, mint egy irányított gráfot, amelynek csúcsai az elemhalmazok, és az I1-b®l él indul I2-be, amennyiben I1 I2, és |I1| + 1 = |I2|. A keresési tér bejárásán mindig ezen gráf egy részének bejárását fogjuk érteni. Tehát például a keresési tér szélességi bejárása ezen gráf szélességi bejárását jelenti.

Elterjedt, hogy a támogatottság helyett gyakoriságot, a támogatottsági küszöb helyett gyakorisági küszöböt használnak, melyeket f req(I)-vel, illetve min_freq-kel jelölnek. AzI elemhalmaz gyakoriságán asupp(I)/|T |hányadost értjük.

A gyakorlatban el®forduló adatbázisokban nem ritka, hogy az elemek száma 105106, a tranzakcióké pedig1091010. Elméletileg már az eredmény kiírása is azI elemszámában exponenciális lehet, hiszen el®fordulhat, hogyI minden részhalmaza gyakori. A gyakorlatban a maximális méret¶ gyakori elemhalmaz mérete |I|-nél jóval kisebb (legfeljebb 20-30). Ezen kívül minden tranzakció viszonylag kicsi, azaz |tj| ≪ |I|. A keresési tér tehát nagy, ami azt jelenti, hogy az egyszer¶ nyers er® módszerek (határozzuk meg minden elemhalmaz támogatottságát, majd válogassuk ki a gyakoriakat) elfogadhatatlanul lassan futnának.

A kés®bbiekben gyakran használjuk majd tranzakciók esetén a sz¶rt jelz®t.

Egy tranzakció sz¶rt tranzakcióját úgy kaphatjuk meg, ha töröljük bel®le a ritka elemeket. A sz¶rt tranzakciók minden információt tartalmaznak a gya-kori elemhalmazok kinyeréséhez, ezért a legtöbb algoritmus els® lépése a gyagya-kori

elemek meghatározása, majd a sz¶rt tranzakciók el®állítása. Ezután az eredeti adatbázist nem használják többé.

A bemenetet illet®en három adattárolási módot szoktak elkülöníteni. Ho-rizontális adatbázisról beszélünk, ha a tranzakciókat azonosítóval látjuk el, és minden azonosítóhoz tároljuk a tranzakcióban található elemeket. Vertikális adatbázisnál minden elemhez tároljuk az elemet tartalmazó tranzakciók azo-nosítóit (sorszámát). A vertikális tárolás nagy el®nye, hogy gyorsan megkap-hatjuk egy elemhalmaz fedését (az elemekhez tartozó kosarak metszetét kell képezni), amib®l közvetlen adódik a támogatottság. Mind a horizontális, mind a vertikális ábrázolási módnál használhatunk az elemek vagy tranzakciók fel-sorolása helyett rögzített szélesség¶ bitvektorokat. Azi-edik elem (tranzakció) meglétét azi-edik pozícióban szerepl® 1-es jelzi.

tranzakció elemhalmaz

1 C

2 A,B,C

elem tranzakcióhalmaz

A 2

B 2

C 1,2

tranzakció elem

1 C

2 A

2 B

2 C

5.1. táblázat. Horizontális-, vertikális- és relációs tárolási mód

Tudjuk, hogy egy tranzakcióban változó számú elem lehet (és fordítva: egy elem változó számú tranzakcióban szerepelhet). A legtöbb mai adatbázis relá-ciós táblák formájában van elmentve, amelyekben csak rögzített számú attri-bútum szerepelhet. A valóságban ezért a tranzakciók két attriattri-bútummal ren-delkez® relációs tábla formájában találhatók, ahol az els® attribútum a tranz-akciót, a második pedig az elemet adja meg (pontosabban a tranzakciók és az elemek azonosítóit). A három tárolási módszerre mutatnak példát a 5.1 táblázatok.

5.1. ábra. Gráfos ábrázolási mód

A bemenetet elemhalmazok sorozataként deniáltuk. Ábrázoljuk ezt, mint

G = (I, T, R) irányítatlan, páros gráf, vagy mint B bináris mátrix. Ha a t tranzakció tartalmazza azi elemet, akkor és csak akkor az (i, t) eleme R-nek.

Vagy mátrix esetén at soránaki eleme 1 (különben 0). A

⟨ACD, BCE, ABCE, BE, ABCE⟩

bemenethez tartozó gráf és bináris mátrix az 5.1 és az 5.2 ábrán látható.

5.2. ábra. Bináris mátrixos ábrázolási mód

A bemeneti adatot szokták a s¶r¶ (dense) illetve a ritka (sparse) jelz®vel illetni, amellyel a bináris mátrixban található 1-esek számára utalnak. Vásárlói kosarakat ábrázoló mátrix tipikusan ritka1, ugyanis a kosarakban általában jóval kevesebb termék van (50-100), mint az összes termék száma (10 000-100 000).

A tranzakciók száma általában nagy, de a mai tárolókapacitások mellett, még egészen nagy adatbázisok is elférnek a memóriában: egy 1010 tranzakciót tartalmazó adatbázis csak kb. 1 GB helyet kíván, amennyiben a tranzakciók átlagos mérete 6 elem. Csak extrém nagy adathalmazok esetén nem alkalmaz-hatók azok az algoritmusok, amelyek feltételezik, hogy a bemenet (vagy a sz¶rt tranzakciók) elférnek a memóriában.

Miel®tt bemutatjuk az APRIORI módszert elemhalmazok esetén, gondol-kozzunk el azon, vajon m¶ködne-e az alábbi egyszer¶ algoritmus a gyakorlat-ban. Olvassuk be a háttértárolóból az adatbázis els® blokkját, és vizsgáljuk meg az els® tranzakciót. Ennek a t1 tranzakciónak az összes részhalmazát tá-roljuk el a memóriában és mindegyikhez rendeljünk egy számlálót 1 kezdeti értékkel. Az I elemhalmazhoz rendelt számláló fogja tárolni I támogatottsá-gát. Az els® tranzakció feldolgozása után vizsgáljuk meg sorban a többit: a ti

1A ritka mátrix a gyakori mintázatok kontextusban kicsit másként értend®, mint a koráb-ban látott ajánlórendszereknél: ott a mátrix abkoráb-ban az értelemben volt ritka, hogy a cellák nagyrészének értéke ismeretlen volt, itt viszont tudjuk, hogy a cellák nagyrésze azt kódolja, hogy az adott kosárban az adott termék nem fordul el®, nem pedig azt, hogy nem ismerjük, hogy a termék el®fordul-e vagy sem.

tranzakció minden részelemhalmazának számlálóját növeljük eggyel, vagy ve-gyük fel a memóriába egy új számlálóval, amennyiben az eddigi feldolgozott tranzakciókban még nem fordult el®. Az adatbázis teljes végigolvasása után az összes valahol el®forduló elemhalmaz támogatottsága rendelkezésünkre áll, amib®l könnyen megkaphatjuk a gyakoriakat.

Látható, hogy ennél az egyszer¶ algoritmusnál lemezhozzáférés szempont-jából gyorsabbat nem lehet találni, mert az adatbázis egyszeri végigolvasása mindenképpen szükséges a támogatottság meghatározásához és ennél az algo-ritmusnál elég is. A gyakorlatban mégsem használják ezt a gyors és egyszer¶

algoritmust. Ennek oka, hogy valós adatbázisokban nem ritka, hogy valamelyik tranzakció sok elemet tartalmaz. Egy átlagos szupermarketben mindennapos, hogy valaki 60 különböz® elemet vásárol. Ekkor csak a számlálók mintegy 16 ezer TB-ot foglalnának, amennyiben a számlálók 4 byte-osak. A számláló-kat mindenképpen a memóriában szeretnénk tartani, hiszen egy új tranzakció vizsgálatánál nem tudjuk el®re, hogy melyik számlálót kell növelni.

Abban az esetben, ha biztosan tudjuk, hogy a tranzakciók egyike sem tar-talmaz sok elemet, vagy az adatbázis bináris értékeket tartar-talmazó mátrix for-májában adott, ahol az oszlopok (attribútumok) száma kicsi, akkor a fenti algoritmus hatékonyan használható.

Amir és szerz®társai [Amir és tsa., 1997] a fenti algoritmus kis módosítását javasolták. Egyrészt csak olyan elemhalmazokat vizsgáltak, amelyek mérete nem halad meg egy el®re megadott korlátot, másrészr®l a vizsgált elemhalma-zokat és számlálóikat a gyors visszakeresés érdekében szófában tárolták.

A módszernek két súlyos hátránya van: nem teljes (az algoritmus nem találja meg azokat az elemhalmazokat, amelyek mérete nagyobb az el®re megadott kü-szöbnél), továbbá túlságosan nagy a memóriaigénye (sok lehet a hamis jelölt).

Amennyiben az adatbázisunk kicsi, akkor még a fenti algoritmusokat sem kell implementálnunk, mert egy szabványos adatbázis-lekérdez® nyelv segít-ségével megkaphatjuk a gyakori elemhalmazokat. Az alábbi SQL parancs a gyakori elempárokat adja eredményül:

SELECT I.elem,J.elem, COUNT(I.tranzakció) FROM tranzakciók I, tranzakciók J

WHERE I.tranzakció=J.tranzakció AND I.elem<J.elem GROUP BY I.elem, J.elem

HAVING COUNT(I.tranzakció) >= min_supp

Látnunk kell, hogy a fenti parancs az összekapcsolás (FROM mez®ben két tábla) m¶velet miatt nem fog m¶ködni, ha az adatbázis mérete túl nagy.

A következ®kben bemutatjuk a három leghíresebb gyakori elemhalmazokat kinyer® (GYEK) algoritmust. Mindhárman az üres mintából indulnak ki. Az

algoritmusok egy adott fázisában jelöltnek hívjuk azokat az elemhalmazokat, amelyek támogatottságát meg akarjuk határozni. Az algoritmus akkor teljes, ha minden gyakori elemhalmazt megtalál és helyes, ha csak a gyakoriakat ta-lálja meg.

Mindhárom algoritmus három lépést ismétel. El®ször jelölteket állítanak el®, majd meghatározzák a jelöltek támogatottságát, végül kiválogatják a je-löltek közül a gyakoriakat. Természetesen az egyes algoritmusok különböz®

módon járják be a keresési teret (az összes lehetséges elemhalmazt), állítják el® a jelölteket, és különböz® módon határozzák meg a támogatottságokat.

Az általánosság megsértése nélkül feltehetjük, hogy az I elemein tudunk deniálni egy teljes rendezést, és a jelöltek, illetve a tranzakciók elemeit ezen rendezés szerint tároljuk. Más szóval az elemhalmazokat sorozatokká alakítjuk.

Egy sorozat -elem¶ prexén a sorozat els® eleméb®l képzett részsorozatát értjük. A példákban majd, amennyiben a rendezésre nem térünk ki külön, az ábécé szerinti sorrendet használjuk. A GYEK algoritmusok általában érzéke-nyek a használt rendezésre. Ezért minden algoritmusnál megvizsgáljuk, hogy milyen rendezést célszer¶ használni annak érdekében, hogy a futási id®, vagy a memóriaszükséglet a lehet® legkisebb legyen.

A jelölt-el®állítás ismétlés nélküli, amennyiben nem állítja el® ugyanazt a jelöltet többféle módon. Ez a hatékonyság miatt fontos, ugyanis ismétléses jelölt-el®állítás esetében minden jelölt el®állítása után ellen®rizni kellene, hogy nem állítottuk-e el® már korábban. Ha ezt nem tesszük, akkor feleslegesen kötünk le er®forrásokat a támogatottság ismételt meghatározásánál. Mindhá-rom ismertetett algoritmusban a jelöltek el®állítása ismétlés nélküli lesz, amit a rendezéssel tudunk garantálni.

Az algoritmusok pszeudokódjaiban GY-vel jelöljük a gyakori elemhalma-zok halmazát, J-vel a jelöltekét és j.számláló-val a j jelölt számlálóját. Az olvashatóbb kódok érdekében feltesszük, hogy minden számláló kezdeti értéke nulla, és az olyan halmazok, amelyeknek nem adunk kezdeti értéket (például GY), nem tartalmaznak kezdetben egyetlen elemet sem.

In document Kinek szól ez a jegyzet? (Pldal 194-199)