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 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
随机推荐
- HDOJ(HDU) 2133 What day is it(认识下Java的Calendar类---日期类)
Problem Description Today is Saturday, 17th Nov,2007. Now, if i tell you a date, can you tell me wha ...
- ARM机器码分析
我们编写的汇编程序还是不够底层,CPU都是对机器码进行操作的,所以还需要用汇编器将汇编代码转换成机器码才能被CPU处理.下面举几个例子来说说分析ARM机器码的方法. 对编译连接之后得到的ELF进行反汇 ...
- ActionFilterAttribute OnActionExecuting 获取参数
public class AuthFilterAttribute : ActionFilterAttribute { /// <summary> /// Action执行前处理 /// & ...
- Jenkins 十二: 集成 selenium 测试
我的selenium采用的是python版本. 其实 selenium java版本也类似. 1. 在jenkins里面新建selenium 测试项目. 源码管理采用 “Subversion”,输入 ...
- opencv_形态学结构化元素对形态学图像处理的影响
场景 对大米预处理之后的二值图像做开运算再做canny边缘检测. python代码: # kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3 ...
- Linux crontab相关
定时自动启动任务crontab命令 文章目录 [隐藏] crontab简介 crontab用法 crontab例子 每个操作系统都有它的自动定时启动程序的功能,Windows有它的任务计划,而Linu ...
- ./filezilla: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory
opensuse系统 在filezilla官网下载压缩文件解压运行后报 ./filezilla: error while loading shared libraries: libpng12.so.0 ...
- Y2错题解析
数据流程图描述信息的来龙去脉和实际流程,反映信息在系统中流动.处理和存储的情况.程序结构图用来描述程序结构,一般由构成系统的要素和表达要素间关系的连线或箭头构成.因果图是一种发现问题"根本原 ...
- python中的TCP编程学习
今天看了一下关于python的TCP编程. 发现思路和其他语言(比如java)思路基本上差点儿相同. 先看client.基本过程例如以下: 第一步:创建一个socket 第二步:建立连接 第三步:发送 ...
- ios中框架介绍
ios中框架介绍 参考博客: 参考文章:框架介绍 框架介绍 框架就是一个目录,一个目录包含了共享库,访问共享库里面的代码的头文件,和其他的图片和声音的资源文件.一个共享库定义的方法和函数可以被应用程序 ...