У меня есть большая разреженная матрица пользователей и элементов, которые им нравятся (порядка 1М пользователей и 100 тыс. Элементов с очень низким уровнем разреженности). Я исследую способы, которыми я мог бы выполнить поиск kNN на нем. Учитывая размер моего набора данных и некоторые начальные тесты, которые я выполнил, я предполагаю, что метод, который я буду использовать, должен быть либо параллельным, либо распределенным. Итак, я рассматриваю два класса возможных решений: один, который доступен (или реализуется достаточно простым способом) на одной многоядерной машине, другой - на кластере Spark, т.е. как программа MapReduce. Вот три широких идеи, которые я рассмотрел:
- Предполагая метрику подобия косинуса, выполните полное умножение нормализованной матрицы на ее транспонирование (реализованное в виде суммы внешних произведений).
- Использование локального хеширования (LSH)
- Уменьшение сначала размерности проблемы с PCA
Буду признателен за любые мысли или советы о возможных других способах решения этой проблемы.
Ответы:
Я надеюсь, что следующие ресурсы могут дать вам дополнительные идеи для решения проблемы:
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 :
Python
, это относится кR
экосистеме)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 .источник
Если вы работаете над совместной фильтрацией, вы должны представить проблему как матричную аппроксимацию низкого ранга, в которой оба пользователя являются элементами, которые встроены в одно пространство с низкой размерностью. Поиск по сходству будет намного проще. Я рекомендую использовать LSH, как вы предложили. Еще один плодотворный путь уменьшения размерности, о котором еще не говорилось, - это случайная проекция .
источник
Вы должны использовать: PySparNN , недавнюю реализацию Facebook на python, которая чертовски быстра. Это также легко использовать.
источник