550 likes | 675 Views
Vyhľadávanie najbližších objektov nad viacrozmernými indexmi. Vyhľadávanie najbližších objektov nad viacrozmernými indexmi. Z knihy Multidimensional and Metric Data Structures. Obsah. Viacrozmerné indexy Best-First k nearest neighbour approach DFS k nearest neighbour approach Pruning Rules
E N D
Vyhľadávanie najbližších objektov nad viacrozmernými indexmi
Vyhľadávanie najbližších objektov nad viacrozmernými indexmi Z knihy Multidimensional and Metric Data Structures .
Obsah • Viacrozmerné indexy • Best-First k nearest neighbour approach • DFS k nearest neighbour approach • Pruning Rules • Záver
Viacrozmerné Indexy • Hierarchické stromové štruktúry na indexovanie viacrozmerných dát • Minimum bounding containers • MBC objektov sú uložené v listoch
Obsah • Viacrozmerné indexy • Best-First k nearest neighbour approach • DFS k nearest neighbour approach • Pruning Rules • Záver
kNN Dopyt Vstupom je bod A, číslo k. Výstupom je k najbližších objektov k tomuto bodu A.
Best First Approach knn(Bod pt, PrioritnyRad queue, int k) { foreach (p in potomok) { queue.add(p); } Object o = queue.poll(); if (o je datovy objekt) vysledok.add(o) else o.knn(pt, queue); if (vysledok.size() == k) return vysledok;
Best First Approach knn(Bod pt, PrioritnyRad queue, int k) { foreach (p in potomok) { queue.add(p); } Object o = queue.poll(); if (o je datovy objekt) vysledok.add(o) else o.knn(pt, queue); if (vysledok.size() == k) return vysledok;
Best First Approach knn(Bod pt, PrioritnyRad queue, int k) { foreach (p in potomok) { queue.add(p); } Object o = queue.poll(); if (o je datovy objekt) vysledok.add(o) else o.knn(pt, queue); if (vysledok.size() == k) return vysledok;
Best First Approach knn(Bod pt, PrioritnyRad queue, int k) { foreach (p in potomok) { queue.add(p); } Object o = queue.poll(); if (o je datovy objekt) vysledok.add(o) else o.knn(pt, queue); if (vysledok.size() == k) return vysledok;
Best First Approach knn(Bod pt, PrioritnyRad queue, int k) { foreach (p in potomok) { queue.add(p); } Object o = queue.poll(); if (o je datovy objekt) vysledok.add(o) else o.knn(pt, queue); if (vysledok.size() == k) return vysledok;
Best First Approach knn(Bod pt, PrioritnyRad queue, int k) { foreach (p in potomok) { queue.add(p); } Object o = queue.poll(); if (o je datovy objekt) vysledok.add(o) else o.knn(pt, queue); if (vysledok.size() == k) return vysledok;
Best First Approach knn(Bod pt, PrioritnyRad queue, int k) { foreach (p in potomok) { queue.add(p); } Object o = queue.poll(); if (o je datovy objekt) vysledok.add(o) else o.knn(pt, queue); if (vysledok.size() == k) return vysledok;
Best First Approach knn(Bod pt, PrioritnyRad queue, int k) { foreach (p in potomok) { queue.add(p); } Object o = queue.poll(); if (o je datovy objekt) vysledok.add(o) else o.knn(pt, queue); if (vysledok.size() == k) return vysledok;
Best First Incremental Approach - R-Optimalita • Vlastnosť zaručujúca, že pre všetky elementy e navštívené počas behu algoritmu platí d(q,e) ≤ d(q,ok ) • Ako funkciu vzdialenosti bola zatiaľ použitá metrika MIN_DIST.
Obsah • Viacrozmerné indexy • Best-First k nearest neighbour approach • DFS k nearest neighbour approach • Pruning Rules • Záver
Depth First Approach DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { foreach (p in potomok(e)) { if (d(q,o) < Dk) { enqueue(p, d(q,o)); if (size(queue) > k) Dk =queue.elementAt(k); } else { foreach (p in potomok(e)) { DFS(pt, queue, p, k, Dk); }
Depth First Approach DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { foreach (p in potomok(e)) { if (d(q,o) < Dk) { enqueue(p, d(q,o)); if (size(queue) > k) Dk =queue.elementAt(k); } else { foreach (p in potomok(e)) { if (d(q,p) < Dk) { DFS(pt, queue, p, k, Dk); // nemusim prechádzať uzly, ktoré sú vzdialenejšie ako Dk } }
Depth First Approach DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { foreach (p in potomok(e)) { if (d(q,o) < Dk) { enqueue(p, d(q,o)); if (size(queue) > k) Dk =queue.elementAt(k); } else { foreach (p in potomok(e)) { // nech su potomkovia zoradení podľa rastúceho d(p,q) if (d(q,p) < Dk) { DFS(pt, queue, p, k, Dk); } else { break foreach loop; // ak nájdem jedného s väčším d(p,q), nemusím pokračovať } }
Obsah • Viacrozmerné indexy • Best-First k nearest neighbour approach • DFS k nearest neighbour approach • Pruning Rules • Záver
Pruning Rules - Motivácia • Minimalizácia elementov skúmaných DFS prístupom
Pruning Rules - Motivácia • Minimalizácia elementov skúmaných DFS prístupom • So stúpajúcou dimenziou stúpa náročnosť výpočtu MIN_DIST (Curse of Dimensionality...)
Pruning Rules – Dodatočné informácie o potomkoch • Každý uzol v indexe má tieto informácie o potomkoch : • MBC(p) • Pointer(p) • Pivot(p) • Rmax(p)
Pruning Rule 1 (Fukunaga and Narendra) DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { foreach (p in potomok(e)) { compute(d(q,o)); if (d(q,o) < Dk) { enqueue(p, d(q,o)); if (size(queue) > k) Dk =queue.elementAt(k); } else { foreach (p in potomok(e)) { DFS(pt, queue, p, k, Dk); }
Pruning Rule 1 (Fukunaga and Narendra) DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { foreach (p in potomok(e)) { compute(d(q,o)); if (d(q,o) < Dk) { enqueue(p, d(q,o)); if (size(queue) > k) Dk =queue.elementAt(k); } else { foreach (p in potomok(e)) { if ( d(q, Pivot(p)) – Rmax(p) > Dk ) then ignore p; DFS(pt, queue, p, k, Dk); }
Pruning Rule 1 (Fukunaga and Narendra) Rule 1 : Dk + Rmax(p) < PIVOT_DIST(p,q)
Pruning Rule 2 (Fukunaga and Narendra) DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { foreach (p in potomok(e)) { if ( d(q, Pivot(e)) – d(p, pivot(e)) > Dk ) then ignore p; compute(d(q,p)); if (d(q,o) < Dk) { enqueue(p, d(q,o)); if (size(queue) > k) Dk =queue.elementAt(k); } else { foreach (p in potomok(e)) { if ( d(q, Pivot(p)) – Rmax(p) > Dk ) then ignore p; DFS(pt, queue, p, k, Dk); }
Pruning Rule 2 (Fukunaga and Narendra) Rule 2 : Dk + PIVOT_DIST(o, p) < PIVOT_DIST(p,q)
Pruning Rule 2 (Fukunaga and Narendra) Rule 2 : Dk + PIVOT_DIST(o, p) < PIVOT_DIST(p,q)
Pruning Rule 3 (Kamgar-Parsi, Kanal) DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { foreach (p in potomok(e)) if ( d(q, Pivot(e)) – d(p, pivot(e)) > Dk ) then ignore p; compute(d(q,p)); if (d(q,o) < Dk) { enqueue(p, d(q,o)); if (size(queue) > k) Dk =queue.elementAt(k); } else { foreach (p in potomok(e)) { if ( d(q, Pivot(p)) – Rmax(p) > Dk ) then ignore p; if ( Rmin(p) - d(q, Pivot(p)) > Dk ) then ignore p; DFS(pt, queue, p, k, Dk); }
Pruning Rule 3 (Kamgar-Parsi, Kanal) DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { foreach (p in potomok(e)) { if ( d(q, Pivot(e)) – d(p, pivot(e)) > Dk ) then ignore p; compute(d(q,p)); if (d(q,o) < Dk) { enqueue(p, d(q,o)); if (size(queue) > k) Dk =queue.elementAt(k); } else { foreach (p in potomok(e)) { if ( d(q, Pivot(p)) – Rmax(p) > Dk ) then ignore p; if ( Rmin(p)- d(q, Pivot(p)) > Dk ) then ignore p; DFS(pt, queue, p, k, Dk); }
Pruning Rule 3 (Kamgar-Parsi, Kanal) Rule 3 : Dk + PIVOT_DIST(q, p) < Rmin(p)
Pruning Rule 3 (Kamgar-Parsi, Kanal) ANALÓGIA K PRAVIDLU 2, AVŠAK NA NELISTOVEJ VRSTVE
Pruning Rule 4 (Kamgar-Parsi, Kanal) DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { foreach (p in potomok(e)) { if ( d(q, Pivot(e)) – d(p, pivot(e)) > Dk ) then ignore p; if ( d(p, Pivot(e)) – d(q, pivot(e)) > Dk ) then ignore p; compute(d(q,p)); if (d(q,o) < Dk) { enqueue(p, d(q,o)); if (size(queue) > k) Dk =queue.elementAt(k); } else { foreach (p in potomok(e)) { if ( d(q, Pivot(p)) – Rmax(p) > Dk ) then ignore p; if ( Rmin(p) - d(q, Pivot(p)) > Dk ) then ignore p; DFS(pt, queue, p, k, Dk); }
Pruning Rule 4 (Kamgar-Parsi, Kanal) Rule 4 : Dk + PIVOT_DIST(q, p) < PIVOT_DIST(p,o)
Pruning Rule 4 (Kamgar-Parsi, Kanal) Rule 4 : Dk + PIVOT_DIST(q, p) < PIVOT_DIST(p,o) Rozšírenie rule 2, ktoré by to pustilo
Pruning Rule 5 (Fukunaga and Narendra), k = 1 DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { ... else { potomok(e) nech vygeneruje zoznam utriedených prvkov podľa PIVOT_DIST(q,p), pre každé p potomok e, nech sú spracovávané v tomto poradí. If (k = 1) { foreach(p in potomok(e)) { if (PIVOT_DIST(q,p) >D1) exit foreach loop; if (PIVOT_DIST(q,p) + Rmax(p) < D1) D1 = PIVOT_DIST(q,p) + Rmax(p); } } foreach (p in potomok(e)) { if ( d(q, Pivot(p)) – Rmax(p) > Dk ) then ignore p; if ( Rmin(p) - d(q, Pivot(p)) > Dk ) then ignore p; DFS(pt, queue, p, k, Dk); }
Pruning Rule 5 (Fukunaga and Narendra), k = 1 PIVOT_DIST(q,p) + Rmax(p) = MAX_DIST(p,q) • Odhad vzdialenosti medzi najvzdialenejším potomkom uzla e a dopytovým bodom q.
Pruning Rule 5 (Larsen and Kanal), k = 1 PIVOT_DIST(q,p) + Rmax(p) = MAX_DIST(p,q) • Odhad vzdialenosti medzi najvzdialenejším potomkom uzla e a dopytovým bodom q. PIVOT_DIST(q,p) + Rmin(p) = MAXNEAREST_DIST(p,q) • Odhad vzdialenosti medzi najbližším potomkom uzla e a dopytovým bodom q.
MAXNEAREST_DIST • MAXNEAREST_DIST sa dá určiť aj za situácie, kedy Rmin nepoznáme. • Pre indexy používajúce Minimum Bounding Sphere platí (V Euclidovskom priestore) : MAXNEAREST_DIST(p,q) = Odmocnina(PIVOT_DIST(q,p)^2 + Rmax(p)^2)
MAXNEAREST_DIST MAXNEAREST_DIST(p,q) = Odmocnina(PIVOT_DIST(q,p)^2 + Rmax(p)^2)
MAXNEAREST_DIST Cena O(d^2), kde d je dimenzia
Pruning Rule 5 (Fukunaga and Narendra), k = 1 DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { ... else { potomok(e) nech vygeneruje zoznam utriedených prvkov podľa PIVOT_DIST(q,p), pre každé p potomok e, nech sú spracovávané v tomto poradí. If (k = 1) { foreach(p in potomok(e)) { if (PIVOT_DIST(q,p) >D1) exit foreach loop; if (PIVOT_DIST(q,p) + Rmax(p) < D1) D1 = PIVOT_DIST(q,p) + Rmax(p); } } foreach (p in potomok(e)) { if ( d(q, Pivot(p)) – Rmax(p) > Dk ) then ignore p; if ( Rmin(p) - d(q, Pivot(p)) > Dk ) then ignore p; DFS(pt, queue, p, k, Dk); }
Pruning Rule 5 (Larsen and Kanal), k = 1 DFS(Bod q, PrioritnyRad queue, element e, int k, reference integer Dk) { if (e je list) { ... else { potomok(e) nech vygeneruje zoznam utriedených prvkov podľa PIVOT_DIST(q,p), pre každé p potomok e, nech sú spracovávané v tomto poradí. If (k = 1) { foreach(p in potomok(e)) { if (PIVOT_DIST(q,p) >D1) exit foreach loop; if (PIVOT_DIST(q,p) + Rmin(p) < D1) D1 = PIVOT_DIST(q,p) + Rmin(p); } } foreach (p in potomok(e)) { if ( d(q, Pivot(p)) – Rmax(p) > Dk ) then ignore p; if ( Rmin(p) - d(q, Pivot(p)) > Dk ) then ignore p; DFS(pt, queue, p, k, Dk); }