• Nem Talált Eredményt

A gyakori elemhalmaz fogalma

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 definiálni, és a minták illetve a tranzakciók elemeit minden esetben nagyság szerint növő sorrendben tároljuk. Ezen rendezés szerinti lexikografi-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, hogy I 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 definiá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. Gondoljuk meg pél-dául, hogy egy107 tranzakciót tartalmazó adatbázis csak 120 MB helyet kíván, amennyiben a tranzakciók átlagos mérete 6 elem. Csak extrém nagy adathal-mazok esetén nem alkalmazható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 tranzakció minden részelemhalmazának számlálóját növeljük eggyel, vagy

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ékeismeretlen volt, itt viszonttudjuk, hogy a cellák nagyrésze azt kódolja, hogy az adott kosárban az adott terméknem fordul elő, nem pedig azt, hogy nem ismerjük, hogy a termék előfordul-e vagy sem.

vegyük fel a memóriába egy új számlálóval, amennyiben az eddig feldolgozott tranzakcióban 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 IO szempontjából gyorsab-bat 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 algoritmusnál elég is.

A gyakorlatban mégsem használják ezt a gyors és egyszerű algoritmust. Ennek oka, hogy az életben előforduló 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 a memóriából, amennyiben a számlálók 4 byte-osak. A számlálókat mindenképpen a memóriában szeretnénk tartani, hogy elkerüljük a folyamatos swappelést, 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 egyszerű algorit-musokat sem kell leprogramoznunk, mert egy teljesen szabványos adatbázis-lekérdező nyelv segítsé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 definiá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ű prefixé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.