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