• 协同过滤

    • 显示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-协同过滤的更多相关文章

  1. Spark MLlib协同过滤算法

    算法说明 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予 ...

  2. SparkMLlib—协同过滤之交替最小二乘法ALS原理与实践

    SparkMLlib-协同过滤之交替最小二乘法ALS原理与实践 一.Spark MLlib算法实现 1.1 显示反馈 1.1.1 基于RDD 1.1.2 基于DataFrame 1.2 隐式反馈 二. ...

  3. SparkMLlib—协同过滤推荐算法,电影推荐系统,物品喜好推荐

    SparkMLlib-协同过滤推荐算法,电影推荐系统,物品喜好推荐 一.协同过滤 1.1 显示vs隐式反馈 1.2 实例介绍 1.2.1 数据说明 评分数据说明(ratings.data) 用户信息( ...

  4. Spark MLlib之协同过滤

    原文:http://blog.selfup.cn/1001.html 什么是协同过滤 协同过滤(Collaborative Filtering, 简称CF),wiki上的定义是:简单来说是利用某兴趣相 ...

  5. Spark(十一) -- Mllib API编程 线性回归、KMeans、协同过滤演示

    本文测试的Spark版本是1.3.1 在使用Spark的机器学习算法库之前,需要先了解Mllib中几个基础的概念和专门用于机器学习的数据类型 特征向量Vector: Vector的概念是和数学中的向量 ...

  6. Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)

    Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...

  7. spark MLlib 概念 4: 协同过滤(CF)

    1. 定义 协同过滤(Collaborative Filtering)有狭义和广义两种意义: 广义协同过滤:对来源不同的数据,根据他们的共同点做过滤处理. Collaborative filterin ...

  8. 协同过滤 CF & ALS 及在Spark上的实现

    使用Spark进行ALS编程的例子可以看:http://www.cnblogs.com/charlesblc/p/6165201.html ALS:alternating least squares ...

  9. 【转载】协同过滤 & Spark机器学习实战

    因为协同过滤内容比较多,就新开一篇文章啦~~ 聚类和线性回归的实战,可以看:http://www.cnblogs.com/charlesblc/p/6159187.html 协同过滤实战,仍然参考:h ...

  10. Spark机器学习之协同过滤算法

    Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...

随机推荐

  1. Servlet工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  2. javascript随机将第一个dom中的图片添加到第二个div中去

    javascript随机将第一个dom中的图片添加到第二个div中去,此代码的是一个简单的例子,将第一个div中的五张图片中,提取随机两张显示到第二个div中. <!DOCTYPE html P ...

  3. OpenRisc-43-or1200的IF模块分析

    引言 “喂饱饥饿的CPU”,是计算机体系结构设计者时刻要考虑的问题.要解决这个问题,方法大体可分为两部分,第一就是利用principle of locality而引进的cache技术,缩短取指时间,第 ...

  4. 你真正的了解Ajax?Ajax技术简述

    Ajax技术是目前在浏览器中通过JavaScript脚本可以使用的所有技术的集合.Ajax并没有创造出某种具体的新技术,它所使用的大多数技术都是在很多年以前就已经存在了,然而Ajax以一种崭新的方式来 ...

  5. scipy安装失败

    pip install scipy安装失败 可以从uci网站下载wheel安装包然后执行pip install xx.whl进行安装 http://www.lfd.uci.edu/~gohlke/py ...

  6. 宇宙【全7季】【合集】【蓝光1080P】【历史频道】

    http://www.bilibili.com/video/av4343074/ 挺好看的 还有一部<宇宙时空之旅>也是挺好看的.

  7. JSP基本语法

    在tomcat环境搭建一文中为大家详细的介绍了第一个JSP的程序--Hello World,大家都应该顺利的完成了吧,以此为一个开端,希望大家在学习java EE的路上乘风破浪,不断进步.今天,为大家 ...

  8. 加载GIF动画方法 iOS

    方法一 使用UIWebView _codeStr为gif网址      如果是本地的gif可以直接使用dataWithContentsOfFile方法 NSData *data = [NSData d ...

  9. IOS中线程的通信

    一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 ...

  10. [ES6] Array.findIndex()

    In es5, you can use indexOf to get the index of one item in an array. In es6, you can use findIndex( ...