Какие данные мне нужны для реализации k ближайших соседей?

В настоящее время у меня есть веб-сайт типа reddit-clone. Я пытаюсь рекомендовать сообщения на основе сообщений, которые ранее понравились моим пользователям.

Кажется, что K ближайший сосед или k означает лучший способ сделать это.

Я не могу понять, как на самом деле реализовать это. Я видел некоторые математические формулы (например, на странице k означает в Википедии), но они не имеют для меня особого смысла.

Может ли кто-нибудь порекомендовать какой-нибудь псевдокод или места для поиска, чтобы я мог лучше понять, как это сделать?


person icco    schedule 01.06.2011    source источник
comment
Программирование коллективного разума Тоби Сегарана стоит посмотреть. (Содержит разделы об этих и других алгоритмах).   -  person matt    schedule 01.06.2011
comment
icco, не могли бы вы добавить теги knn и ближайший сосед, пожалуйста   -  person denis    schedule 02.06.2011
comment
Наткнулся сегодня на эту случайность, возможно, вам будет интересно. Обсуждение того, как работает алгоритм ранжирования Reddit: amix.dk/blog/post/19588.   -  person Matt    schedule 03.06.2011


Ответы (5)


K-Nearest Neighbor (он же KNN) — это алгоритм классификации.

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

Как только эти «обучающие» данные были классифицированы, вы можете оценить «неизвестную» точку данных. Вы определяете «класс» неизвестного, находя ближайших к нему соседей в системе классификации. Если вы определяете классификацию по трем ближайшим соседям, ее можно назвать алгоритмом 3 ближайших соседей.

То, как вы определяете «ближайшего соседа», сильно зависит от того, как вы классифицируете свои данные. Очень часто данные отображаются в N-мерном пространстве, где N представляет собой количество различных классификационных характеристик, которые вы изучаете.

Простой пример:

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

Если бы я спросил вас, в какой стране находится случайная точка долготы и широты, смогли бы вы это выяснить? Что бы вы сделали, чтобы понять это?

Данные долготы/широты естественным образом отображаются в виде графика X,Y. Итак, если вы нанесете на этот график все города, а затем неизвестную точку, как вы определите страну неизвестного? Вы можете начать рисовать круги вокруг этой точки, увеличиваясь до тех пор, пока круг не охватит 10 ближайших городов на графике. Теперь вы можете посмотреть на страны этих 10 городов. Если все 10 находятся в США, то можно с достаточной долей уверенности сказать, что ваша неизвестная точка тоже находится в США. Но если только 6 городов в США, а остальные 4 в Канаде, можете ли вы сказать, где находится ваша неизвестная точка? Вы все еще можете предположить, США, но с меньшей уверенностью.

Самая сложная часть KNN — выяснить, как классифицировать ваши данные таким образом, чтобы вы могли определить «соседей» аналогичного качества и расстояние до этих соседей.

person Matt    schedule 01.06.2011

То, что вы описали, похоже на механизм рекомендательной системы, а не на алгоритм кластеризации, такой как k-means, который по сути является неконтролируемым подходом. Я не могу составить четкое представление о том, что на самом деле использует Reddit, но я нашел интересный пост, погуглив «рекомендатор + Reddit», например. Reddit, Stumbleupon, Del.icio.us и Hacker Новостные алгоритмы раскрыты! Во всяком случае, алгоритм k-NN (описанный в десять лучших алгоритмов интеллектуального анализа данных с псевдокодом в Википедии) может или другие методы, такие как совместная фильтрация (используется Amazon, например), описанный в этом хорошем руководство.

person chl    schedule 02.06.2011

Кластеризация k-средних в своей простейшей форме представляет собой усреднение значений и сохранение других средних значений вокруг одного центрального среднего значения. Предположим, у вас есть следующие значения

1,2,3,4,6,7,8,9,10,11,12,21,22,33,40

Теперь, если я выполняю кластеризацию k-средних и помню, что кластеризация k-средних будет иметь механизм смещения (среднее/усреднение), который будет либо помещать значения близко к центру, либо далеко от него. И получаем следующее.

cluster-1 
1,2,3,4,5,6,7,8

cluster-2
10,11,12

cluster-3
21,22

cluster-4
33

cluster-5
40

Помните, я только что составил эти кластерные центры (кластер 1-5). Таким образом, в следующий раз, когда вы будете выполнять кластеризацию, числа окажутся вокруг любого из этих центральных средних (также известных как k-центры). Приведенные выше данные являются одномерными.

Когда вы выполняете кластеризацию kmeans для больших наборов данных с несколькими измерениями (многомерные данные — это массив значений, у вас будут миллионы значений одного и того же измерения), вам понадобится что-то большее и масштабируемое. Сначала вы усредните один массив, вы получите одно значение, аналогично повторите то же самое для других массивов, а затем выполните кластеризацию kmean.

Прочитайте один из моих вопросов здесь

Надеюсь это поможет.

person Community    schedule 01.06.2011
comment
Как вы выбираете, в какие кластеры поместить данные? Все, что у меня есть для данных, это расстояние между двумя точками данных, но я не обязательно знаю, где эти точки расположены... - person icco; 01.06.2011
comment
@Icco, как я уже сказал, я просто сделал их так, чтобы они выглядели ближе к центру (я даже не вычислял центр), просто чтобы они отличались либо на 1 значение, либо больше. Поэтому я просто сгруппировал их. Это то, что более или менее K-Means собирается сделать для вас. Кроме того, помните, что кластеризация KMeans не может работать вечно, вам нужно будет либо указать количество итераций, прежде чем она остановится, либо, если вам повезет, она автоматически остановится, когда все центры будут стабильными, что означает, что кластеризация kmeans больше не влияет результат, и мы имеем стабильную ситуацию. Окончательный результат, который будет - person ; 01.06.2011
comment
@Icco, у тебя есть опыт в машинном обучении или что-то в этом роде? Если нет, это может быть немного утомительно для вас, но все же выполнимо. - person ; 01.06.2011
comment
@Wajih, у меня есть опыт работы с CS, но нет истории машинного обучения (или статистики ...). - person icco; 01.06.2011
comment
Итак, я думаю, что мое замешательство связано с тем, что у меня нет значений для моих объектов. Я знаю, что a находится на расстоянии 5 от b, но я не знаю, где они. В этом случае могут ли эти алгоритмы работать для меня? - person icco; 01.06.2011
comment
Конечно, они будут работать, KMeans определит центры для вас. Что вам нужно сообщить KMeans, так это размерность данных, количество итераций до остановки. И да, у вас должен быть набор данных, который нужно кластеризовать. - person ; 02.06.2011

Чтобы сделать k-ближайших соседей, вам в основном нужно понятие расстояния и способ найти k ближайших соседей к точке, которую вы можете себе позволить (вероятно, вы не хотите искать по всем своим точкам данных одну за другой). Существует библиотека для приблизительного ближайшего соседа по адресу http://www.cs.umd.edu/~mount/ANN/. Это очень простой алгоритм классификации — классифицировать новую точку p, найти ее k ближайших соседей и классифицировать p в соответствии с наиболее популярными классами среди этих k соседей.

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

Если вы заинтересованы в поиске особенно хорошего алгоритма обучения для ваших целей, загляните на http://www.cs.waikato.ac.nz/ml/weka/ — позволяет опробовать большое количество различных алгоритмов, а также написать свои в виде плагинов.

person mcdowella    schedule 02.06.2011

Вот очень простой пример KNN для набора данных MINST. Как только вы сможете рассчитать расстояние между вашими документами, тот же алгоритм будет работать.

http://shyamalapriya.github.io/digit-recognition-using-k-nearest-neighbors/

person Anand Rajasekar    schedule 25.09.2014