您的位置:首页 > 其它

Spark MLlib 1.6 -- 协同过滤

2016-02-24 13:11 393 查看
· Collaborative filtering
· Explicit vs. implicit feedback
· Scaling of the regularization parameter
· Examples

· Tutorial

4.1 协同过滤算法
协同过滤算法主要用于推荐系统中,推荐系统用于给用户和物品之间建立实体关系。Spark.mllib暂支持基于协同过滤,在这个模型中,用户和物品这间用关联因子确定两者之间的关联关系。Spark.mllib 使用交替最小二乘法(ALS)算法学习用户和物品之间关联因子。Spark.mllib 协同过滤算法中需要以下参数:
1) numBlocks 并行计算的数据块(-1 是自动配置)
2) rank 模型中关联矩阵的秩
3) iterations 迭代次数
4) lambda ALS 中正规化参数
5) implicitPrefs设置是使用显式ALS回馈或隐式ALS回馈
6) alpha 当使用隐式ALS回馈时,式参数确定预设观察样本的基线置信度。

4.1.1 显式或隐式回馈
标准的基于矩阵分解的协同过滤算法,用户和物品矩阵中每个元素代表用户对某个物品的偏好度。
在实际生活的例子中,更多的是隐式回馈(例如,看页面,点击链接,购买商品,喜欢商品,分享文章等)。针对此场景,spark.mllib 中专门描述如何处理协同过滤算法中隐式回馈的数据集(http://dx.doi.org/10.1109/ICDM.2008.22)。实质上,显式回馈使用用户对商品的打分值,而在隐式回馈中,直接可以看成两项偏好(译者注:如喜欢或不喜欢,需要或不需要)和置信度(译者注:如喜欢的可信度有多大,或不喜欢的置信度)。这样,在显式中的用户对物品的打分值,在隐式中变成了通过观察用户偏好而得出的置信水平(the
level of confidence)。模型通过这些因子来预测用户对每个物品可能的偏好。

4.1.2 放缩正规化参数
从1.1开始,我们引入正规化参数的放缩因子lambda , 对用户偏好物品程度(因子)给出用户一个级别权重,或对物品吸引用户的程度(因子)给物品一个级别权重,以解决此类最小二乘问题。这就是”ALS-WR” 算法,详见“大规模并行协同过滤 for
Netflix prize”(http://dx.doi.org/10.1007/978-3-540-68880-8_32).考虑到此参数并不依赖于数据集,因此可以对样本集使用最优的参数,并应用于全量数据集。

1.2 例子
下面的例子加载评分数据集,每行是用户对物品的打分值。对显式回馈使用默认ALS.train() 方法。使用最小均方差来评估推荐模型匹配度。
ALS scala DocsAPI : http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.mllib.recommendation.ALS
importorg.apache.spark.mllib.recommendation.ALS
importorg.apache.spark.mllib.recommendation.MatrixFactorizationModel
importorg.apache.spark.mllib.recommendation.Rating

// Load andparse the data
val data = sc.textFile("data/mllib/als/test.data")
val ratings = data.map(_.split(',')match{caseArray(user, item, rate)=>
Rating(user.toInt, item.toInt, rate.toDouble)
})

// Build therecommendation model using ALS
val rank =10
val numIterations =10
val model =ALS.train(ratings, rank, numIterations,0.01)

// Evaluate themodel on rating data
val usersProducts = ratings.map {caseRating(user, product, rate)=>
(user, product)
}
val predictions =
model.predict(usersProducts).map {caseRating(user, product, rate)=>
((user, product), rate)
}
val ratesAndPreds = ratings.map {caseRating(user, product, rate)=>
((user, product), rate)
}.join(predictions)
valMSE= ratesAndPreds.map {case((user, product),(r1, r2))=>
val err =(r1 - r2)
err* err
}.mean()
println("MeanSquared Error = "+MSE)

// Save and loadmodel
model.save(sc,"target/tmp/myCollaborativeFilter")
val sameModel =MatrixFactorizationModel.load(sc,"target/tmp/myCollaborativeFilter")
详细的例子见:"examples/src/main/scala/org/apache/spark/examples/mllib/RecommendationExample.scala"

如果训练数据是从其它信息系统而来(如从其它信号系统),可以使用trainImplicit 方式得到隐式回馈的结果。
val alpha =0.01
val lambda =0.01
val model =ALS.trainImplicit(ratings, rank, numIterations, lambda, alpha)
想运行以上程序,需要查阅spark 快速参考中自包含应用程序章节(self-containedapplication http://spark.apache.org/docs/latest/quick-start.html#self-contained-applications)。同时需要注意引入spark-mllib 相应的类库。

1.2.1 教程
Spark summit2014 中包含手把手的训练练习:使用spark.mllib来对用户进行电影推荐: https://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: