2013-12-16 6 views
0

У меня есть список многих пользователей (более 10 миллионов), каждый из которых представлен идентификатором пользователя, а затем 10 чисел с плавающей запятой, указывающих их предпочтения. Я хотел бы эффективно вычислить матрицу подобия пользователя, используя подобие косинуса на основе mapreduce. Однако, поскольку значения являются числами с плавающей запятой, трудно определить ключ в структуре mapreduce. Какие-либо предложения?mapreduce способ вычисления матрицы подобия пользователя

ответ

2

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

Первый - это Mahath's ItemSimilarityJob, который является частью его системных библиотек рекомендаций. Конкретную информацию для этой работы можно найти here. Вам просто нужно предоставить входные данные в требуемом формате и выбрать VectorSimilarityMeasure (что для вашего случая будет SIMILARITY_COSINE) вместе с любыми дополнительными оптимизациями. Поскольку вы рассчитываете рассчитать подобие пользователя и пользователя на основе вектора предпочтений десяти значений с плавающей запятой, то вы можете назначить простой 1-к-10 числовой хеш для индексов вектора и создать простой .csv-файл vectorIndex, userID, decimalValue как ввод задания задания сходства Mahout (идентификатор пользователя - числовое значение Int или Long). Результатом вывода должен быть текстовый файл с разделителями, разделенный вкладкой userID, userID, сходство.

Во втором решении может быть RowSimilarityJob Mahout, включенном в его математическую библиотеку. Я никогда не использовал его сам, но некоторую информацию можно найти here и в этом previous stackoverflow thread. Вместо ввода .csv в качестве входных данных вам необходимо будет перевести ваши входные данные как DistributedRowMatrix, а идентификаторы пользователей - это строки матрицы. Результат, я считаю, также будет файлом последовательности DistributedRowMatrix, содержащим данные о сходстве пользователя и пользователя, которые вы ищете.

Я полагаю, какое решение лучше зависит от того, какой формат ввода/вывода вы предпочитаете. Всего наилучшего.

Смежные вопросы