Jump to content

Шаровое дерево

В информатике шаровое дерево , шаровое дерево. [1] или метрическое дерево — это разделения пространства структура данных для организации точек в многомерном пространстве. Дерево шаров разделяет точки данных на вложенный набор шаров . Полученная структура данных имеет характеристики, которые делают ее полезной для ряда приложений, в первую очередь для поиска ближайшего соседа .

Неофициальное описание [ править ]

Дерево шаров — это двоичное дерево , в котором каждый узел определяет D-мерный шар, содержащий подмножество точек для поиска. Каждый внутренний узел дерева делит точки данных на два непересекающихся набора , которые связаны с разными шарами. Хотя сами шары могут пересекаться, каждая точка присваивается тому или иному шару в перегородке в зависимости от его расстояния от центра шара. Каждый листовой узел в дереве определяет шар и перечисляет все точки данных внутри этого шара.

Каждый узел в дереве определяет наименьший шар, содержащий все точки данных в своем поддереве. Это приводит к тому полезному свойству, что для данной контрольной точки t вне шара расстояние до любой точки шара B в дереве больше или равно расстоянию от t до поверхности шара. Формально: [2]

Где — минимально возможное расстояние от любой точки шара B до некоторой точки t .

Шаровые деревья связаны с М-деревом , но поддерживают только двоичные разбиения, тогда как в М-дереве каждый уровень разбивается. к сгиб, что приводит к более мелкой древовидной структуре, поэтому требуется меньше вычислений расстояния, что обычно приводит к более быстрым запросам. Кроме того, M-деревья лучше хранить на диске , который организован в виде страниц . M-дерево также заранее рассчитывает расстояния от родительского узла для ускорения запросов.

Деревья точек обзора также похожи, но они разделяются по двоичному принципу на один шар и оставшиеся данные вместо использования двух шаров.

Строительство [ править ]

Доступен ряд алгоритмов построения шарового дерева. [1] Целью такого алгоритма является создание дерева, которое будет эффективно поддерживать запросы желаемого типа (например, ближайшего соседа) в среднем случае. Конкретные критерии идеального дерева будут зависеть от типа вопроса, на который требуется ответ, и распределения основных данных. Однако общеприменимой мерой эффективного дерева является мера, которая минимизирует общий объем его внутренних узлов. Учитывая различное распределение наборов реальных данных, это сложная задача, но существует несколько эвристик, которые на практике хорошо распределяют данные. В общем, существует компромисс между стоимостью построения дерева и эффективностью, достигаемой с помощью этого показателя. [2]

В этом разделе кратко описывается простейший из этих алгоритмов. Более подробное обсуждение пяти алгоритмов дал Стивен Омохундро. [1]

k алгоритм построения -d [ править ]

Простейшая такая процедура называется « алгоритмом построения k -d» по аналогии с процессом, используемым для построения k -d деревьев . Это автономный алгоритм , то есть алгоритм, который работает сразу со всем набором данных. Дерево строится сверху вниз путем рекурсивного разделения точек данных на два набора. Разбиения выбираются по одному измерению с наибольшим разбросом точек, при этом наборы делятся по медианному значению всех точек по этому измерению. Для поиска разделения для каждого внутреннего узла требуется линейное время от количества выборок, содержащихся в этом узле, что дает алгоритм с временной сложностью. , где n — количество точек данных.

Псевдокод [ править ]

function construct_balltree is
    input: D, an array of data points.
    output: B, the root of a constructed ball tree.

    if a single point remains then
        create a leaf B containing the single point in D
        return B
    else
        let c be the dimension of greatest spread
        let p be the central point selected considering c
        let L, R be the sets of points lying to the left and right of the median along dimension c
        create B with two children: 
            B.pivot := p
            B.child1 := construct_balltree(L),
            B.child2 := construct_balltree(R),
            let B.radius be maximum distance from p among children
        return B
    end if
end function

Поиск ближайшего соседа [ править ]

Важным применением шаровых деревьев является ускорение запросов поиска ближайших соседей , цель которых состоит в том, чтобы найти k точек в дереве, которые наиболее близки к заданной контрольной точке по некоторой метрике расстояния (например, евклидову расстоянию ). Простой алгоритм поиска, иногда называемый KNS1, использует свойство расстояния шарового дерева. В частности, если алгоритм ищет структуру данных с помощью тестовой точки t и уже видел некоторую точку p , ближайшую к t среди встреченных до сих пор точек, то любое поддерево, шар которого находится дальше от t, чем p, можно игнорировать. для остальной части поиска.

Описание [ править ]

Алгоритм ближайшего соседа шарового дерева исследует узлы в порядке глубины, начиная с корня. В ходе поиска алгоритм максимальным поддерживает очередь с приоритетом (часто реализованную с помощью кучи ), обозначенную здесь Q , из k ближайших точек, встреченных на данный момент. На каждом узле B он может выполнить одну из трех операций, прежде чем, наконец, вернуть обновленную версию приоритетной очереди:

  1. Если расстояние от контрольной точки t до текущего узла B больше, чем самая дальняя точка в , игнорируйте B и возвращайте Q. Q
  2. Если B является конечным узлом, просканируйте каждую точку, перечисленную в B, и соответствующим образом обновите очередь ближайших соседей. Верните обновленную очередь.
  3. Если B является внутренним узлом, вызовите алгоритм рекурсивно на двух дочерних узлах B , сначала выполняя поиск дочернего узла, центр которого ближе к t . Возвращайте очередь после того, как каждый из этих вызовов по очереди обновил ее.

Выполнение рекурсивного поиска в порядке, описанном в пункте 3 выше, увеличивает вероятность того, что следующий дочерний элемент будет удален. полностью во время поиска.

Псевдокод [ править ]

function knn_search is
    input: 
        t, the target point for the query
        k, the number of nearest neighbors of t to search for
        Q, max-first priority queue containing at most k points
        B, a node, or ball, in the tree
    output: 
        Q, containing the k nearest neighbors from within B

    if distance(t, B.pivot) - B.radius ≥ distance(t, Q.first) then
        return Q unchanged
    else if B is a leaf node then
        for each point p in B do
            if distance(t, p) < distance(t, Q.first) then
                add p to Q
                if size(Q) > k then
                    remove the furthest neighbor from Q
                end if
            end if
        repeat
    else
        let child1 be the child node closest to t
        let child2 be the child node furthest from t
        knn_search(t, k, Q, child1)
        knn_search(t, k, Q, child2)
    end if
    return Q
end function[2]

Производительность [ править ]

По сравнению с некоторыми другими структурами данных, шаровые деревья довольно хорошо работают на проблема поиска ближайших соседей, особенно по мере роста их размерностей. [3] [4] Однако лучшая структура данных ближайшего соседа для данного приложения будет зависеть от размерности, количества точек данных и базовой структуры данных.

Ссылки [ править ]

  1. Перейти обратно: Перейти обратно: а б с Омохундро, Стивен М. (1989) «Пять алгоритмов построения шарового дерева»
  2. Перейти обратно: Перейти обратно: а б с Лю, Т.; Мур А. и Грей А. (2006). «Новые алгоритмы эффективной многомерной непараметрической классификации» (PDF) . Журнал исследований машинного обучения . 7 : 1135–1158.
  3. ^ Кумар, Н.; Чжан, Л.; Наяр, С. (2008). «Каков хороший алгоритм ближайших соседей для поиска похожих участков на изображениях?». Компьютерное зрение – ECCV 2008 (PDF) . Конспекты лекций по информатике. Том. 5303. с. 364. CiteSeerX   10.1.1.360.7582 . дои : 10.1007/978-3-540-88688-4_27 . ISBN  978-3-540-88685-3 .
  4. ^ Кибрия, А.М.; Франк, Э. (2007). «Эмпирическое сравнение точных алгоритмов ближайшего соседа». Обнаружение знаний в базах данных: PKDD 2007 (PDF) . Конспекты лекций по информатике. Том. 4702. с. 140. дои : 10.1007/978-3-540-74976-9_16 . ISBN  978-3-540-74975-2 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 240df58898e5ee217233b1dc7e8033d0__1702303620
URL1:https://arc.ask3.ru/arc/aa/24/d0/240df58898e5ee217233b1dc7e8033d0.html
Заголовок, (Title) документа по адресу, URL1:
Ball tree - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)