问题提出:对于协同过滤,我们就是要预测用户所喜欢的但是又没有发现的物品,下面给出一个明确的评分矩阵,设为A,但是A有一部分没有值,表明用户没有对此物品评分,于是我们需要预测出没有值的评分部分。
解决方法:
我们知道有基于用户和基于物品的协同过滤算法,通过计算用户或物品的相似度来求得所缺失的打分。这里将潜在因子模型方法。 用户和物品分布在一个K维的特征空间,用户的未知评分可以简单的通过相应的用户和物品的向量的乘积得到。 也就是将矩阵A分解成两个矩阵U(用户特征矩阵)和M(物品特征矩阵)
可以通过计算U和M’的乘积A_k来接近A
A_k=UM’
这样就预测到了用户对未知物品的评分。
在mohout上实践
解压出ratings.dat文件,利用如下命令转换成用逗号分开的ratings.csv文件,
$cat ratings.dat |sed -e s/::/,/g| cut -d, -f1,2,3 > ratings.csv
将数据上传到hdfs
1.将rating分为预测集(10%)和训练集(90%)
$mahout splitDataset -i /cf/movieLens/ratings.csv -o /cf/movieLens/dataset –trainingPercentage 0.9 –probePercentage 0.1
2. 运行分布式的ALS-WR算法来进行矩阵的分解(matrix factorization)
$mahout parallelALS –i /cf/movieLens/dataset/trainingSet/ -o /cf/movieLens/als/out –numFeatures 20 –numIterations 10 –lambda 0.065
之后会在/cf/movieLens/als/out生成M和U以及保存的评分
3. 通过预测集来对模型进行评价,评价标准是RMSE
$mahout evaluateFactorization –i /cf/movieLens/dataset/probeSet/ -o /cf/movieLens/als/rmse/ -userFeatures /cf/movieLens/als/out/U/ –itemFeatures /cf/movieLens/als/out/M/
RMSE结果会输出在/cf/movieLens/als/rmse/rmse.txt
4. 最后进行推荐
$mahout recommendfactorized –i /cf/movieLens/als/out/userRatings/ -o /cf/movieLens/recommendations/ –userFeatures /cf/movieLens/als/out/U/ –itemFeatures /cf/movieLens/als/out/M/ –numRecommendations 6 –maxRating 5