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

Post on 03-Jan-2016

24 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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

top related