1 / 55

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

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

Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Vyhľadávanie najbližších objektov nad viacrozmernými indexmi Z knihy Multidimensional and Metric Data Structures .

  3. Obsah • Viacrozmerné indexy • Best-First k nearest neighbour approach • DFS k nearest neighbour approach • Pruning Rules • Záver

  4. Viacrozmerné Indexy • Hierarchické stromové štruktúry na indexovanie viacrozmerných dát • Minimum bounding containers • MBC objektov sú uložené v listoch

  5. Viacrozmerné Indexy – Objekty a MBC

  6. R Strom

  7. Obsah • Viacrozmerné indexy • Best-First k nearest neighbour approach • DFS k nearest neighbour approach • Pruning Rules • Záver

  8. kNN Dopyt Vstupom je bod A, číslo k. Výstupom je k najbližších objektov k tomuto bodu A.

  9. 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;

  10. 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;

  11. 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;

  12. 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;

  13. 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;

  14. 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;

  15. 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;

  16. 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;

  17. Best First Approach - Worst Case

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

  19. Obsah • Viacrozmerné indexy • Best-First k nearest neighbour approach • DFS k nearest neighbour approach • Pruning Rules • Záver

  20. 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); }

  21. 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 } }

  22. 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ť } }

  23. Obsah • Viacrozmerné indexy • Best-First k nearest neighbour approach • DFS k nearest neighbour approach • Pruning Rules • Záver

  24. Pruning Rules - Motivácia • Minimalizácia elementov skúmaných DFS prístupom

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

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

  27. Pruning Rules – MIN_DIST vs PIVOT_DIST

  28. Pruning Rules – Rmax(p)

  29. 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); }

  30. 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); }

  31. Pruning Rule 1 (Fukunaga and Narendra) Rule 1 : Dk + Rmax(p) < PIVOT_DIST(p,q)

  32. 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); }

  33. Pruning Rule 2 (Fukunaga and Narendra) Rule 2 : Dk + PIVOT_DIST(o, p) < PIVOT_DIST(p,q)

  34. Pruning Rule 2 (Fukunaga and Narendra) Rule 2 : Dk + PIVOT_DIST(o, p) < PIVOT_DIST(p,q)

  35. 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); }

  36. 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); }

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

  38. Pruning Rule 3 (Kamgar-Parsi, Kanal) Rule 3 : Dk + PIVOT_DIST(q, p) < Rmin(p)

  39. Pruning Rule 3 (Kamgar-Parsi, Kanal) ANALÓGIA K PRAVIDLU 2, AVŠAK NA NELISTOVEJ VRSTVE

  40. 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); }

  41. Pruning Rule 4 (Kamgar-Parsi, Kanal) Rule 4 : Dk + PIVOT_DIST(q, p) < PIVOT_DIST(p,o)

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

  43. 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); }

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

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

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

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

  48. MAXNEAREST_DIST Cena O(d^2), kde d je dimenzia

  49. 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); }

  50. 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); }

More Related