Aktsvigun / hnsw_python

Realization of Hierarchical Navigable Short World as proposed in http://arxiv.org/pdf/1603.09320v2.pdf

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Realization of Hierarchical Navigable Short World as proposed in http://arxiv.org/pdf/1603.09320v2.pdf

Реализация алгоритма поиска HNSW, предложенного в статье http://arxiv.org/pdf/1603.09320v2.pdf

  • HNSW - Слоистая структура графов. На нулевом слое представлены все N вершин из исходной выборки. Вершина, присутствующая на уровне L так же присутствует на уровне L+1 с вероятностью P. Т.е. кол-во слоёв растет как O(log N). Количество соседей каждой вершины на каждом уровне ограниченно константой, что позволяет делать запросы на добавление и удаление вершины за O(log N).

  • Алгоритм состоит из пяти частей:

    • Алгоритм добавления новой вершины в облако (функция add, в статье - Algorithm 1)
    • Алгоритм поиска на текущем слое (функция _search_graph, в статье - Algorithm 2)
    • Алгоритм выбора М соседей "наивным" путем, т.е. М соседей с минимальным расстоянеим до объекта (функция _select_naive, в статье - Algorithm 3)
    • Алгоритм для выбора М соседей с помощью эвристики (функция _select_heuristic, в статье - Algorithm 4)
    • Алгоритм для поиска k ближайших соседей к запросу (функция search, в статье - Алгоритм 5)
  • В реализации также присутствуют функции для сохранения и загрузки имеющегося графа HNSW при помощи библиотеки pickle. Однако поскольку Python не позволяет делать dump функций, перед сохранением облака необходимо удалить функцию, используемую для вычисления расстояний между объектами.

  • В конце кода представлен пример создания облака HNSW. Все слои представлены на одном рисунке. Фиолетовые линии соответстуют связям (ребрам) на нулевом слое, синие - на первом, бирюзовые - на втором, зеленые - на третьем и так далее - чем светлее и больше связи (ребра), тем выше уровень. Для запуска примера необходимо скачать .py файл и в командной строке написать python hnsw.py.

Пример облака HNSW

About

Realization of Hierarchical Navigable Short World as proposed in http://arxiv.org/pdf/1603.09320v2.pdf


Languages

Language:Python 100.0%