Используя Python, я вычисляю косинусное сходство между элементами.
с учетом данных о событии, представляющих покупку (пользователь, предмет), у меня есть список всех предметов, "купленных" моими пользователями.
Учитывая эти входные данные
(user,item)
X,1
X,2
Y,1
Y,2
Z,2
Z,3
Я строю словарь Python
{1: ['X','Y'], 2 : ['X','Y','Z'], 3 : ['Z']}
Из этого словаря я генерирую купленную / не купленную матрицу, а также другой словарь (bnb).
{1 : [1,1,0], 2 : [1,1,1], 3 : [0,0,1]}
Оттуда я вычисляю сходство между (1,2), вычисляя косинус между (1,1,0) и (1,1,1), получая 0,816496
Я делаю это по:
items=[1,2,3]
for item in items:
for sub in items:
if sub >= item: #as to not calculate similarity on the inverse
sim = coSim( bnb[item], bnb[sub] )
Я думаю, что метод грубой силы убивает меня, и он работает только медленнее, когда данные становятся больше. На моем надежном ноутбуке этот расчет выполняется часами при работе с 8500 пользователями и 3500 объектами.
Я пытаюсь вычислить сходство для всех предметов в моем диктофоне, и это занимает больше времени, чем мне бы хотелось. Я думаю, что это хороший кандидат на MapReduce, но у меня проблемы с «мышлением» в терминах пар ключ / значение.
В качестве альтернативы, проблема с моим подходом и не обязательно является кандидатом на сокращение карты?