MLlib-协同过滤
- 协同过滤
- 显示vs隐式反馈
- 参数调整
- 实例
- 教程
协同过滤
协同过滤是推荐系统的常用方法。可以填充user-item相关矩阵中的缺失值。MLlib支持基于模型的协同过滤,即使用能够预测缺失值的一个隐藏因素集合来表示用户和产品。MLlib使用交替做小二乘法(alternating least squares, ALS)学习隐藏因子。MLlib算法中的参数如下:
- numBlocks 并行计算的block数(-1为自动配置)
- rank 模型中隐藏因子数
- iterations 算法迭代次数
- lambda ALS中的正则化参数
- implicitPrefs 使用显示反馈ALS变量或隐式反馈
- alpha ALS隐式反馈变化率用于控制 the baseline confidence in preference observations
显示vs隐式fankui
基于矩阵分解的协同过滤的标准方法一般将用户商品矩阵中的元素作为用户对商品的显性偏好。
真实的案例中通常只有隐式反馈(例如,查看,点击,购买,喜欢,分享等)。MLlib中处理此类数据的方法来自于Collaborative Filtering for Implicit Feedback Datasets。 本质上,这个方法将数据作为二元偏好值和偏好强度的一个结合,而不是对评分矩阵直接进行建模。因此,评价就不是与用户对商品的显性评分而是和所观察到的用户偏好强度关联了起来。然后,这个模型将尝试找到隐语义因子来预估一个用户对一个商品的偏好。
参数调整
V1.1以来, 在结局每个最小二乘问题中通过调整lambda参数来控制更新用户因子时的用户产生比例或在更新物品因子时接收物品的比例。 这种方法叫做“ALS-WR”,来自论文“Large-Scale Parallel Collaborative Filtering for the Netflix Prize”。他使lambda对数据规模的依赖更小。所以,这里使用从抽样数据中学到的最优参数去填充应用到整个数据集并期盼会有类似表现。
实例
例子中,使用打分数据,每一行包括:用户,产品和打分。使用默认的ALS.train()方法,假定打分是显示的。使用打分预测的错误率军方法来评价推荐模型。(注:这里只调研了scala)
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
import org.apache.spark.mllib.recommendation.Rating // Load and parse the data
val data = sc.textFile("data/mllib/als/test.data")
val ratings = data.map(_.split(',') match { case Array(user, item, rate) =>
Rating(user.toInt, item.toInt, rate.toDouble)
}) // Build the recommendation model using ALS
val rank = 10
val numIterations = 10
val model = ALS.train(ratings, rank, numIterations, 0.01) // Evaluate the model on rating data
val usersProducts = ratings.map { case Rating(user, product, rate) =>
(user, product)
}
val predictions =
model.predict(usersProducts).map { case Rating(user, product, rate) =>
((user, product), rate)
}
val ratesAndPreds = ratings.map { case Rating(user, product, rate) =>
((user, product), rate)
}.join(predictions)
val MSE = ratesAndPreds.map { case ((user, product), (r1, r2)) =>
val err = (r1 - r2)
err * err
}.mean()
println("Mean Squared Error = " + MSE) // Save and load model
model.save(sc, "myModelPath")
val sameModel = MatrixFactorizationModel.load(sc, "myModelPath")
如果打分矩阵是从其他源信息得到的,可以使用 trainImplicit 方法得到更好的结果。
val alpha = 0.01
val lambda = 0.01
val model = ALS.trainImplicit(ratings, rank, numIterations, lambda, alpha)
请参照Self-Contained Applications运行上面的例子。确保build文件中包含spark-mllib依赖。
教程
The training exercises from the Spark Summit 2014 include a hands-on tutorial for personalized movie recommendation with MLlib.
使用MovieLens数据进行协同过滤
在IDEA中新建工程filter-starter,新建文件src/Filter.scala, 本地运行程序:
/**
* Created by *****qin on 2014-12-25.
*/
import org.apache.spark._
import org.apache.spark.SparkContext._
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating object Filter {
def main(args: Array[String]) {
//load data
val conf = new SparkConf().setAppName("filter").setMaster("local")
val sc = new SparkContext(conf)
val data = sc.textFile("E:\\_spark\\test_data\\ua_ratings.data")
println(data.count())
val ratings = data.map(_.split(" ") match { case Array(user, item, rate) => Rating(user.toInt, item.toInt, rate.toDouble)}) //build the recommendation model using ALS
val rank = 10
val numIterations = 20
val model = ALS.train(ratings, rank, numIterations, 0.01) //Evaluate the model on the rating data
val usersProducts = ratings.map { case Rating(user, product, rate) =>
(user, product)
} val predictions =
model.predict(usersProducts).map { case Rating(user, product, rate) =>
((user, product), rate)
}
val ratesAndPreds = ratings.map { case Rating(user, product, rate) =>
((user, product), rate)
}.join(predictions) val MSE = ratesAndPreds.map { case ((user, product), (r1, r2)) =>
val err = (r1 - r2)
err * err
}.mean() println("Mean Squared Error = " + MSE)
}
}
右键->"Run Filter"即可
**期间遇到一个问题,程序里已经导入了import org.apache.spark._ 居然不管用,总是提示错误
Error:(36, 7) value join is not a member of org.apache.spark.rdd.RDD[((Int, Int), Double)]
possible cause: maybe a semicolon is missing before `value join'?
}.join(predictions)
^
找了半天发现需要导入import org.apache.spark.SparkContext._ ,虽然IDEA提示unused import statement, 但是编译就不报错了,凌乱了,怀疑IDEA对scala的支持
集群运行,需要修改程序:
//load data
val conf = new SparkConf().setAppName("filter")
val sc = new SparkContext(conf)
val data = sc.textFile(args(0))
将程序打成jar包,上传hdfs集群提交任务
如有疑问,欢迎评论!!!!!
MLlib-协同过滤的更多相关文章
- Spark MLlib协同过滤算法
算法说明 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予 ...
- SparkMLlib—协同过滤之交替最小二乘法ALS原理与实践
SparkMLlib-协同过滤之交替最小二乘法ALS原理与实践 一.Spark MLlib算法实现 1.1 显示反馈 1.1.1 基于RDD 1.1.2 基于DataFrame 1.2 隐式反馈 二. ...
- SparkMLlib—协同过滤推荐算法,电影推荐系统,物品喜好推荐
SparkMLlib-协同过滤推荐算法,电影推荐系统,物品喜好推荐 一.协同过滤 1.1 显示vs隐式反馈 1.2 实例介绍 1.2.1 数据说明 评分数据说明(ratings.data) 用户信息( ...
- Spark MLlib之协同过滤
原文:http://blog.selfup.cn/1001.html 什么是协同过滤 协同过滤(Collaborative Filtering, 简称CF),wiki上的定义是:简单来说是利用某兴趣相 ...
- Spark(十一) -- Mllib API编程 线性回归、KMeans、协同过滤演示
本文测试的Spark版本是1.3.1 在使用Spark的机器学习算法库之前,需要先了解Mllib中几个基础的概念和专门用于机器学习的数据类型 特征向量Vector: Vector的概念是和数学中的向量 ...
- Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)
Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...
- spark MLlib 概念 4: 协同过滤(CF)
1. 定义 协同过滤(Collaborative Filtering)有狭义和广义两种意义: 广义协同过滤:对来源不同的数据,根据他们的共同点做过滤处理. Collaborative filterin ...
- 协同过滤 CF & ALS 及在Spark上的实现
使用Spark进行ALS编程的例子可以看:http://www.cnblogs.com/charlesblc/p/6165201.html ALS:alternating least squares ...
- 【转载】协同过滤 & Spark机器学习实战
因为协同过滤内容比较多,就新开一篇文章啦~~ 聚类和线性回归的实战,可以看:http://www.cnblogs.com/charlesblc/p/6159187.html 协同过滤实战,仍然参考:h ...
- Spark机器学习之协同过滤算法
Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
随机推荐
- Ubuntu中Nginx的安装与配置
原文地址:http://www.cnblogs.com/languoliang/archive/2013/04/01/nginx.html 1.Nginx介绍 Nginx是一个非常轻量级的HTTP服务 ...
- 使用string
public class UsingString { public static void testFindStr(String str) { System.out.p ...
- [Locked] Closest Binary Search Tree Value & Closest Binary Search Tree Value II
Closest Binary Search Tree Value Given a non-empty binary search tree and a target value, find the ...
- HAProxy、Nginx 配置 HTTP/2 完整指南
基于最近对HTTP/2的争论和它的优势,是时候升级底层架构了.这篇文章将会介绍如何在安装和配置HAProxy和Ngnix(使用ssl终端).为了简化流程,我建议你准备好使用Docker镜像. 如果你想 ...
- A - Wireless Network-poj2236(简单并查集)
说是有N个村庄,刚开始每个村庄的网络都是受损状态,于是派一个人去修理,修理过的村庄只能联系距离他们半径为D的村庄,当然他们可以通过一些村庄当中转站,联系. 输入先输入一个N表示有N个村庄,还有一个 ...
- poj2299
好吧,看到这个图片就知道是干什么的了,求逆序数- - 可以用线段树,貌似还可以用归并排序,这题应该是考的归并排序,毕竟是递归分治- - 基本上都忘了,再写一写试试吧. AC ///////////// ...
- RHEL 6.4 安装svn和apache
1.安装软件包(RHEL已经按默认设置安装完成) 需要安装的.rpm软件包: postgresql-libs perl-URI subversion mod_dav_svn 2.创建svn文件夹和版本 ...
- 【jquery mobile笔记二】jquery mobile调用豆瓣api示例
页面主要代码如下 <div data-role="page" id="page1"> <div data-role="hea ...
- JAR WAR EAR包的区别
jar包和war包的区别: war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令 ...
- SQL中的case when then else end用法
--简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' ...