vyhľadávanie najbližších objektov nad viacrozmernými indexmi

55
Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Upload: raymond-king

Post on 03-Jan-2016

25 views

Category:

Documents


0 download

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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Vyhľadávanie najbližších objektov nad viacrozmernými

indexmi

Page 2: 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

.

Page 3: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Obsah

• Viacrozmerné indexy

• Best-First k nearest neighbour approach

• DFS k nearest neighbour approach

• Pruning Rules

• Záver

Page 4: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Viacrozmerné Indexy

• Hierarchické stromové štruktúry na indexovanie viacrozmerných dát

• Minimum bounding containers

• MBC objektov sú uložené v listoch

Page 5: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Viacrozmerné Indexy – Objekty a MBC

Page 6: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

R Strom

Page 7: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Obsah

• Viacrozmerné indexy

• Best-First k nearest neighbour approach

• DFS k nearest neighbour approach

• Pruning Rules

• Záver

Page 8: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

kNN Dopyt

Vstupom je bod A, číslo k.

Výstupom je k najbližších objektov k tomuto bodu A.

Page 9: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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;

Page 10: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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;

Page 11: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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;

Page 12: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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;

Page 13: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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;

Page 14: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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;

Page 15: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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;

Page 16: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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;

Page 17: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Best First Approach - Worst Case

Page 18: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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.

Page 19: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Obsah

• Viacrozmerné indexy

• Best-First k nearest neighbour approach

• DFS k nearest neighbour approach

• Pruning Rules

• Záver

Page 20: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 21: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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

}

}

Page 22: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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ť

}

}

Page 23: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Obsah

• Viacrozmerné indexy

• Best-First k nearest neighbour approach

• DFS k nearest neighbour approach

• Pruning Rules

• Záver

Page 24: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rules - Motivácia

• Minimalizácia elementov skúmaných DFS prístupom

Page 25: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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...)

Page 26: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

• 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

Page 27: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rules – MIN_DIST vs PIVOT_DIST

Page 28: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rules – Rmax(p)

Page 29: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 30: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 31: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rule 1 (Fukunaga and Narendra)

Rule 1 : Dk + Rmax(p) < PIVOT_DIST(p,q)

Page 32: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 33: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rule 2 (Fukunaga and Narendra)

Rule 2 : Dk + PIVOT_DIST(o, p) < PIVOT_DIST(p,q)

Page 34: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rule 2 (Fukunaga and Narendra)

Rule 2 : Dk + PIVOT_DIST(o, p) < PIVOT_DIST(p,q)

Page 35: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 36: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 37: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rule 3 (Kamgar-Parsi, Kanal) - Rmin

Page 38: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rule 3 (Kamgar-Parsi, Kanal)

Rule 3 : Dk + PIVOT_DIST(q, p) < Rmin(p)

Page 39: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rule 3 (Kamgar-Parsi, Kanal)

ANALÓGIA K PRAVIDLU 2, AVŠAK NA NELISTOVEJ VRSTVE

Page 40: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 41: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Pruning Rule 4 (Kamgar-Parsi, Kanal)

Rule 4 : Dk + PIVOT_DIST(q, p) < PIVOT_DIST(p,o)

Page 42: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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

Page 43: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 44: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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.

Page 45: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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.

Page 46: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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)

Page 47: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

MAXNEAREST_DIST

MAXNEAREST_DIST(p,q) = Odmocnina(PIVOT_DIST(q,p)^2 + Rmax(p)^2)

Page 48: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

MAXNEAREST_DIST

Cena O(d^2), kde d je dimenzia

Page 49: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 50: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 51: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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);

}

Page 52: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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.

Page 53: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Obsah

• Viacrozmerné indexy

• Best-First k nearest neighbour approach

• DFS k nearest neighbour approach

• Pruning Rules

• Záver

Page 54: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

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.

Page 55: Vyhľadávanie najbližších objektov nad viacrozmernými indexmi

Otázky