Post on 03-Jan-2016
description
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
Viacrozmerné Indexy – Objekty a MBC
R Strom
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 Approach - Worst Case
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...)
• Každý uzol v indexe má tieto informácie o potomkoch :
• MBC(p)• Pointer(p)• Pivot(p)• Rmax(p)
Pruning Rules – Dodatočné informácie o potomkoch
Pruning Rules – MIN_DIST vs PIVOT_DIST
Pruning Rules – 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)Rmin(p) - d(q, Pivot(p)) > Dk ) then ignore p;
DFS(pt, queue, p, k, Dk);
}
Pruning Rule 3 (Kamgar-Parsi, Kanal) - Rmin
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);
}
Pruning Rule 5, k = 1DFS(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 (MAXNEAREST_DIST(p,q) < D1) D1 = MAXNEAREST_DIST(p,q);
}
}
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, Diskusia
• Zoznam potomkov e je lepšie triediť pomocou MIN_DIST ako hlavného kľúča a MAXNEAREST_DIST ako sekundárneho, namiesto triedenia pomocou PIVOT_DIST
• MIN_DIST, MAXNEAREST_DIST možno vypočítať z Rmax, Rmin a PIVOT_DIST.
Obsah
• Viacrozmerné indexy
• Best-First k nearest neighbour approach
• DFS k nearest neighbour approach
• Pruning Rules
• Záver
Záver
• DFS algoritmus síce možno vylepšiť pomocou orezávacích pravidiel, ale nie je šanca dosiahnuť R – optimalitu ako u Best-First algoritmu.
• DFS algoritmus má teoreticky lepšiu pamäťovú zložitosť.
• Na základe prezentovaných pravidiel možno upraviť aj Best-First algoritmus.
Otázky