Ближайшие соседи ищут данные очень большого размера

17

У меня есть большая разреженная матрица пользователей и элементов, которые им нравятся (порядка 1М пользователей и 100 тыс. Элементов с очень низким уровнем разреженности). Я исследую способы, которыми я мог бы выполнить поиск kNN на нем. Учитывая размер моего набора данных и некоторые начальные тесты, которые я выполнил, я предполагаю, что метод, который я буду использовать, должен быть либо параллельным, либо распределенным. Итак, я рассматриваю два класса возможных решений: один, который доступен (или реализуется достаточно простым способом) на одной многоядерной машине, другой - на кластере Spark, т.е. как программа MapReduce. Вот три широких идеи, которые я рассмотрел:

  • Предполагая метрику подобия косинуса, выполните полное умножение нормализованной матрицы на ее транспонирование (реализованное в виде суммы внешних произведений).
  • Использование локального хеширования (LSH)
  • Уменьшение сначала размерности проблемы с PCA

Буду признателен за любые мысли или советы о возможных других способах решения этой проблемы.

cjauvin
источник
1
Я только что исследовал эту область и написал сообщение в блоге о том, что я нашел. Я использовал LSH, но я думаю, что мой уровень разреженности был выше, чем вы ищете. tttv-engineering.tumblr.com/post/109569205836/…
Филипп Перл

Ответы:

15

Я надеюсь, что следующие ресурсы могут дать вам дополнительные идеи для решения проблемы:

1) Научно-исследовательская работа «Эффективные алгоритмы соединения K-ближайших соседей для разреженных данных больших размеров» : http://arxiv.org/abs/1011.2807

2) Классный проект «Система рекомендаций, основанная на совместной фильтрации» (Стэнфордский университет): http://cs229.stanford.edu/proj2008/Wen-RecommendationSystemBasedOnCollaborativeFiltering.pdf

3) Проект для призового конкурса Netflix (на основе k-NN ) : http://cs.carleton.edu/cs_comps/0910/netflixprize/final_results/knn/index.html

4) Исследовательская работа «Хабы в космосе: популярные ближайшие соседи в многомерных данных» о проклятии феномена размерности и его связи с машинным обучением в целом и алгоритмом k-NN , в частности: http://jmlr.org /papers/volume11/radovanovic10a/radovanovic10a.pdf

5) Программное обеспечение для разреженной классификации k-NN (бесплатно, но, как представляется, не является открытым исходным кодом - возможно, уточните у авторов): http://www.autonlab.org/autonweb/10408.html

6) Несколько обсуждений на StackOverflow :

7) Обратите внимание на GraphLab , параллельную среду с открытым исходным кодом для машинного обучения ( http://select.cs.cmu.edu/code/graphlab ), которая поддерживает параллельную кластеризацию через MapReduceмодель: http: //select.cs.cmu. Edu / код / graphlab / clustering.html

Вы также можете проверить мой ответ здесь на Data Science StackExchange о редкой регрессии для ссылок на соответствующие Rпакеты и CRAN Task Viewстраницы: /datascience//a/918/2452 .

Александр Блех
источник
4

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

Эмре
источник
1

Вы должны использовать: PySparNN , недавнюю реализацию Facebook на python, которая чертовски быстра. Это также легко использовать.

Syzygyyy
источник