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) 2178 猜数字(题意有点难理解、、、)
Problem Description A有1数m,B来猜.B每猜一次,A就说"太大","太小"或"对了" . 问B猜n次可以猜到的最大数. ...
- POJ 3208 Apocalypse Someday
题意: 将含有连续的三个6的数称为不吉利数,比如666,1666,6662,但是6266吉利.则666为第一个不吉利数,输入整数n,求第n个不吉利数.(n <= 5*10^7) 解法: 如果是给 ...
- nyoj 222 整数中的1个数以及这类问题
之前也写过一篇这样的文章,但是隔了这么久,竟然忘了.还是要有清晰的思路,才能真正的掌握. 这道题是这样的: 给出两个非负32位整型范围内的数a,b,请输出闭区间[a,b]内所有数二进制中各个位的1的总 ...
- hdu 4607 Park Visit (dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先如果k小于等于直径长度,那么答案为k−1.如果k大于直径长度,设直径长度为r,那么答案为r− ...
- [Angular 2] Pipe Purity
Explaining how Pipes only change by default when your Pipe input parameters change and not when your ...
- Linux 监控CPU 温度
安装测试系统: 硬件:普通PC机, 软件:redhat linux as 4 2.6 .9 , 安装系统自带的lm_sensors-2.8.7-2.i386 你也可以从[url]http://w ...
- html contenteditable
contenteditable 是html中的一個屬性,在HTML中,某些元素設置 contenteditable='true' 屬性時可以開啟該元素的編輯模式,contenteditable 可以 ...
- centos7 部署ssserver
centos7 部署shadowsocks服务端 为什么要选centos7? 以后centos7 肯定是主流,在不重要的环境还是尽量使用新系统吧 centos7 的坑 默认可能会有firewall 或 ...
- Decorator Wrapper 装饰模式 包装
简介 装饰模式 装饰模式以对客户端[透明]的方式[扩展]对象的功能,客户端并不会觉得对象在装饰前和装饰后有什么不同,是继承关系的一个替代方案. 若只为增加功能而使用继承,当基类较多时会导致继承体系越来 ...
- C# 邮件发送注意事项
使用QQ邮箱作为smtp服务器时,遇到 "命令顺序不正确. 服务器响应为: AUTH first..",解决办法: smtpClient.UseDefaultCredentials ...