2016-07-20 4 views
-1

Я хотел бы использовать матричное факторинг (с использованием ALS в MLlib, если быть точным) для рекомендаций по продуктам, где у меня нет рейтингов, но используйте количество покупок (неявная информация, разреженная матрица). Перед тренировкой я хотел бы стандартизировать набор данных клиентом (строка в матрице, где столбцы - это продукты, а пересечение - это сумма). Matrix имеет несколько миллионов строк и десятки тысяч столбцов, поэтому я хотел бы использовать RDD как можно больше.Стандартизация значений в разреженной матрице RDD

Мои данные хранятся в списке кортежей:

(int, int, int) 

[(Client1, Product1, amount) 
(Client1, Product2, amount) 
(Client2, Product1, amount) 
(Client2, Product3, amount)] 

Я хотел бы стандартизировать количество продуктов, купленных клиентом. Я думал о преобразовании groupByKey, но не знаю, куда идти отсюда.

EDIT: Основная проблема с подходом, который я взял было использование в РДУ и ALS реализована работа с РДУ (доступны в пакете mllib) вместо главной библиотеки ML, которая использует DataFrames (доступный в мл). Так как вложенные преобразования недоступны в RDD, использование DataFrames очень помогло.

+0

Какой стандартизации вы хотели бы применить? – jtitusj

ответ

0

Попробуйте это:

>>> from pyspark.mllib.linalg.distributed import * 
>>> from pyspark.mllib.linalg.distributed import * 
>>> 
>>> cm = CoordinateMatrix(rdd.map(lambda (c, p, a): MatrixEntry(c, p, a))) 
>>> irm = cm.toIndexedRowMatrix() 
>>> idxs = irm.rows.map(lambda row: row.index) 
>>> vcs = irm.rows.map(lambda row: row.vector) 
>>> 
>>> nzr = Normalizer(1) 
>>> rows = idxs.zip(nzr.transform(vcs)).map(lambda (index, vector): IndexedRow(index, vector)) 
>>> normalized = IndexedRowMatrix(rows).toCoordinateMatrix().entries. 
Смежные вопросы