Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > HEngine и KNN


Автор: mrgloom 25.2.2014, 17:24
появилась такая статья http://habrahabr.ru/post/211264/

но там используются бинарные векторы, а что если у нас есть обычные численные векторы и мы хотим осуществить поиск ближайшего соседа?
Т.е. как преобразовать из численного вектора в бинарный?


варианты:
1. на основании набора векторов, по каждой ячейке(числовой позиции например вектор vec={2 3 7} 3 позиции) вычислять среднее или медиану и соответственно если больше то 1, если меньше то 0.
2. кластеризовать вектора, взять k центров и смотреть расстояние до центров, если меньше dist то 1, если больше то 0 (соответственно тут мы получим сокращение размерности). непонятно правда как выбирать k и dist, в предельных случаях будем иметь пустой или очень разреженный вектор или всё в единицах ,а можно сначала заполнить новые вектора длины k расстояниями dist и сделать как в пункте 1.

п.с. это похоже получается хэш-функция?

но если так делать, то уже точное соответствие не найдешь, т.к. идёт потеря информации.


п.с. как раз еще есть http://en.wikipedia.org/wiki/Nearest_neighbor_search#Locality_sensitive_hashing


есть так же развитой проект http://www.cs.ubc.ca/research/flann/ , но он так же Approximate Nearest Neighbors.

Автор: Mirkes 4.3.2014, 15:45
Довольно забавный подход. Первый вопрос - какая у Вас задача.
Исходя из задачи выбирают расстояние. KNN необычайно чувствителен к выбору расстояния. Расстояние Хеминга пригодно только для качественных (категорийных) работ. В простейшем варианте - для бинарных данных. Если Вы работаете с действительными числами, то используйте другие расстояния - квадрат Эвклидова, расстояние Минковского, Манхеттенское и т.д и т.п. Их сотни описаны в литературе.
Но увидев один метод подсчета чего-то очень быстро сводить свою задачу к этому чему-то несколько странно. 

Автор: mrgloom 4.3.2014, 17:26
что значит качественных (категорийных) ?

У меня есть набор векторов интов, типа vec={12,1,2,4,23}  (только большей  размерности примерно 1к)
Я использую стандартно евклидово расстояние(l2 distance).

выше я предлагал свести вектор интов к бинарному вектору(по идее будет потеря информации).

п.с. да я не силён в матане простанства, нормы и т.д.

Автор: Mirkes 5.3.2014, 21:47
Цитата(mrgloom @  4.3.2014,  17:26 Найти цитируемый пост)
что значит качественных (категорийных) ?

Это значит имеет несколько (мало) различных значений. Типичные примеры: пол, образование в анкете (среднее, среднее специальное, высшее).

При преобразовании векторов из целых к бинарным может происходить потеря информации, а может не происходить.

Сформулируйте задачу, что вы делаете с этими многомерными векторами?

Автор: mrgloom 6.3.2014, 10:21
решаю задачу нахождения ближайшего соседа
http://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm

Автор: Mirkes 6.3.2014, 14:22
Я хорошо знаю задачу нахождения ближайшего соседа и http://www.math.le.ac.uk/people/ag153/homepage/KNN/KNN3.html
Однако KNN это инструмент и не более. А какова задача?

Поясняю. Пусть у нас МНОГО точек и нам нужно находить ближайших соседей для новых точек. В этом случае применяются специальные методы индексации точек для быстрого поиска соседей. Если множество базовых точек регулярно обновляется, это уже другая задача.

Теперь по поводу 1000 мерных векторов. Есть хорошая статья о применимости KNN в этой ситуации: Beyer, K.; Goldstein, J.; Ramakrishnan, R.; Shaft, U. (1999). "When is “Nearest Neighbor” Meaningful?". Proc. 7th International Conference on Database Theory - ICDT'99. LNCS 1540: 217–235. doi:10.1007/3-540-49257-7_15. ISBN 978-3-540-65452-0

Кроме того, Вы так и не сформулировали задачу smile 
Зачем Вам ближайшие соседи?
Или это  просто самоцель?

Автор: mrgloom 6.3.2014, 15:18
задача: поиск похожих объектов в базе, типа http://en.wikipedia.org/wiki/Content-based_image_retrieval

Цитата

усть у нас МНОГО точек и нам нужно находить ближайших соседей для новых точек.

изначально, да.

Цитата

 Если множество базовых точек регулярно обновляется, это уже другая задача.

оно может обновляться, но не по 1 точке, а групами точек, я так понимаю, просто при очередном добавлении придётся перестраивать индекс.


Цитата

 "When is “Nearest Neighbor” Meaningful?"

http://en.wikipedia.org/wiki/Curse_of_dimensionality
что то такое читал

Автор: Mirkes 6.3.2014, 16:48
Цитата(mrgloom @  6.3.2014,  15:18 Найти цитируемый пост)
задача: поиск похожих объектов в базе, типа CBIR


Вот с таким я не работал, так что посоветовать ничего не могу.

Насчет проклятия размерности - с ним очень даже можно бороться путем уменьшения пространства признаков (dimension reduction, feature selection).

Однако все эти методы сильно зависят от конкретной задачи (набора признаков) и потребуют большого числа экспериментов для определения нужного поднабора признаков.

Желаю удачи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)