Object Intersection and Rice - Siff Algortihm for Formal concept analysis

Vsetko viac formalne a s dokazmi je v ZNA textbook

TDLR: Co treba vediet na pochopenie:

Ak toto vsetko viete, staci skocit na kapitolu Object Intersection Algorithm

Co je to uzaver mnoziny?

Uzaver mnoziny je mnozina, ktora obsahuje vsetky prvky, ktore su vytvorene z povodnej mnoziny pomocou nejakeho operatora. Stale plati ze pre mnozinu X a jej uzaver cl(X): X je podmnozina cl(X) a cl(cl(X)) = cl(X) footnote(tato vlasnost sa vola indepodencia, taktiez potrebne vediet pre derivacne operatory, galois connection, atd.) Preco je to pravda? Uvedme priklad mam X = {1, 2, 3} a operator “nasobenie”, tak cl(X) = {1,2,3,4,6,9}. A to preto ze kazdy vysledok nasobenia a * b, kde a,b su z X musi byt v cl(X). To ze X je podmnozina cl(X) je zrejme. Vseobecne mame nejaky operator H ktory vie generovat nove prvky z X a uzaverom tejto mnoziny bude skupina vsetkych tychto moznych generovanych prvkov.

Co je to uzaverovy operator?

Pred vysvetlenim potrebujeme definovat este uzaverovy system. Ten je neformalne len pre nejaku mnozinu G mam uzaverovy system S ked spravim cl(G) s tym ze ten operator na generovanie prvok bude prienik. Tj. priklad G={a,b} tak potom uzaverovy system moze byt S = {∅,{a,b}}, a to lebo plati ze prienik prvkov z S su sami v S. Nemusi to byt jediny uzaverovy system, pre nas priklad existuje aj uzaverovy system S = {∅, {a}, {b}, {a, b}}. Kde nas prvy uzaverovy system bol najmensi mozny a druhy je najvacsi mozny. Formalna definicia je:

Uzaverovym systemom na mnozine G nazyvame taku mnozinu jej podmnozın, ktora ako jeden z jej prvkov obsahuje celu mnozinu G a je uzavreta na prieniky.

Uzaverovy operator je to kazde zobrazenie na G, ktore splna tri podmienky:

1.) monotonnost X ⊆ Y ⇒ ϕX ⊆ ϕY

2.) extenzivnost X ⊆ ϕX (toto vypliva z uzaveru mnoziny cl(G), je to popisane v hore )

3.) idempotencia ϕϕX ⊆ ϕX (podobne ako v cl(G), presny dokaz je v skriptach)

Co je to formalny kontext?

Formalny kontext je trojica (B, A, R), kde B je mnozina objektov, A je mnozina atributov a R je binarna relacia medzi B a A. Tato relacia hovori o tom, ktore atributy patria k danemu objektu.

Co je to derivacny operator?

Mam (B, A, R) formalny kontext. Potom pre vsetky X ⊆ B (obekty) a Y ⊆ A (atributy) definujem derivačné operátory takto:

\(\uparrow X = {a \in A \mid \forall b \in X: (b, a) \in R}\) Toto znamena, ze sipka hore X vrati vsetky take atributy ktore maju vsetky objekty v mnozine X.

\(\downarrow Y = {b \in B \mid \forall a \in Y: (b, a) \in R}\) Toto znamena ze sipka dole Y vrati vsetky take objekty ktore maju vsetky spolocne atributy v mnozine Y.

Urobim si priklad:

Potom,

Co je to formalny koncept?

Ak uz mam formalny kontext (B, A, R) a dve jeho derivacne operatory (↑, ↓) tak potom formalny koncept je kazda taka dvojica (X,Y) pre ktoru plati ↑ (X) = Y a ↓ (Y) = X.

Ak spravim uzaver na cl(B, A, R) dostanem mnozinu vsetkych formalnych konceptov

Object Intersection Algorithm

Link na clanok Object Intersection Algorithm

Tento algoritmus vezme formalny kontext a pre kazdy objekt najde vsetky jeho atributy. Ako prvy concept sa vytvori

V pseudo-pythone


def object_intersection(context):
    # TODO, lepsie napisat pseudokod 
    concepts=[[0:len(context[0])]] # 
    for row in BAR:
        for concept in concepts:
            intersection= intersect(row,concept) 
            if intersection not in concepts:
                concepts.append(intersection)
    return concepts

Rice - Siff Algorithm

Clanok o tomto algoritme vysiel v Electronic Notes in Theoretical Computer Science 40 (2002) strana 24, bohužiaľ od roku 2021 je tento časopis zrušený.

Narozdiel od object intersection v tomto algoritme rozhodujeme ci pridame koncept do kontextu na zaklade pseudo metriky (tiez sa to da najst ako Jaccart distance). Ta je definovana ako: \ro((X,Y),(X',Y'))= 1- |Y ∩ Y'|/|Y ∪ Y'|, kde X, X’ su objekty a Y, Y’ su atributy. A usporiadana dvojica (X,Y) je koncept.

V pseudo-pythone vyzera implementacia nasledovne:


def rice_siff(context):
    # toto vyzera strasidelne, ale v podstate to vezme context a vrati pole s mnozinami kde kazdy prvok mnoziny je index na ktorom v contexte bola hodnota true 
    # tj pre [1, 0, 1] bude context [{0,2}]
    concepts = [(set([i]), set(j for j, x in enumerate(context[i]) if x == 1)) for i in range(len(context))] 

    while True:
        closest_pair = find_closest_pair(concepts) 
        (X1, Y1), (X2, Y2) = closest_pair
        if distance(Y1, Y2) > pseudometric_ro(X1, Y1, X2, Y2): 
            break
        new_extent = X1 | X2 
        new_intent = Y1 & Y2 
        concepts.remove((X1, Y1))
        concepts.remove((X2, Y2))
        concepts.append((new_extent, new_intent))

    return concepts 

Factorizaton of a matrix (Set Covering Problem)

Bottleneck

Kedze faktorizacia konceptov je v podstate hladanie “obdliznika” v tabulke BAR, ktory zachytava co najviac konceptov. Mozme tento problem preformulovat ako set covering. Set Cover z predmetu APA alebo zo Zlozitosti vieme ze je NP-uplny problem. Teda neexistuje algoritmus, ktory by ho riesil v polynomialnom case. Moja greedy implemetacia je prevzata z wikipedie a je velmi pomala pri dostatocne velkych maticiach.

Numba version

Numba python vie kompilovat python funkcie s dekoratororm @njit ak splnaju. Stale ale crashuje.

CUDA

WORK IN PROGRESS

Results