1、协同过滤

协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投、拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予资讯相当程度的回应(如评分)并记录下来以达到过滤的目的,进而帮助别人筛选资讯,回应不一定局限于特别感兴趣的,特别不感兴趣资讯的纪录也相当重要。
协同过滤常被应用于推荐系统。这些技术旨在补充用户—商品关联矩阵中所缺失的部分。
MLlib 当前支持基于模型的协同过滤,其中用户和商品通过一小组隐性因子进行表达,并且这些因子也用于预测缺失的元素。MLLib 使用交替最小二乘法(ALS) 来学习这些隐性因子。
用户对物品或者信息的偏好,根据应用本身的不同,可能包括用户对物品的评分、用户查看物品的记录、用户的购买记录等。其实这些用户的偏好信息可以分为两类:
l  显式的用户反馈:这类是用户在网站上自然浏览或者使用网站以外,显式地提供反馈信息,例如用户对物品的评分或者对物品的评论。
l  隐式的用户反馈:这类是用户在使用网站是产生的数据,隐式地反映了用户对物品的喜好,例如用户购买了某物品,用户查看了某物品的信息,等等。
显式的用户反馈能准确地反映用户对物品的真实喜好,但需要用户付出额外的代价;而隐式的用户行为,通过一些分析和处理,也能反映用户的喜好,只是数据不是很精确,有些行为的分析存在较大的噪音。但只要选择正确的行为特征,隐式的用户反馈也能得到很好的效果,只是行为特征的选择可能在不同的应用中有很大的不同,例如在电子商务的网站上,购买行为其实就是一个能很好表现用户喜好的隐式反馈。
推荐引擎根据不同的推荐机制可能用到数据源中的一部分,然后根据这些数据,分析出一定的规则或者直接对用户对其他物品的喜好进行预测计算。这样推荐引擎可以在用户进入时给他推荐他可能感兴趣的物品。

2、Java开发ALS实例

实例中使用电影评分数据,字段信息包括用户编号:电影编号:评分:评分时间戳。
见spark-2.0.1-bin-hadoop2.7/data/mllib/als/ sample_movielens_ratings.txt
Java开发上,引入spark-mllib_2.11-2.0.1.jar、spark-mllib-local_2.11-2.0.1.jar、spark-catalyst_2.11-2.0.1.jar。
参考spark的example案例的代码,输出skals.jar包并提交执行。
bin/spark-submit --class sk.mlib.ALSDemo --master local /tmp/skals.jar

代码如下:

package sk.mlib;import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;import java.io.Serializable;import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.ml.evaluation.RegressionEvaluator;
import org.apache.spark.ml.recommendation.ALS;
import org.apache.spark.ml.recommendation.ALSModel;public class ALSDemo {public static class Rating implements Serializable {private int userId;private int movieId;private float rating;private long timestamp;public Rating() {}public Rating(int userId, int movieId, float rating, long timestamp) {this.userId = userId;this.movieId = movieId;this.rating = rating;this.timestamp = timestamp;}public int getUserId() {return userId;}public int getMovieId() {return movieId;}public float getRating() {return rating;}public long getTimestamp() {return timestamp;}public static Rating parseRating(String str) {String[] fields = str.split("::");if (fields.length != 4) {throw new IllegalArgumentException("Each line must contain 4 fields");}int userId = Integer.parseInt(fields[0]);int movieId = Integer.parseInt(fields[1]);float rating = Float.parseFloat(fields[2]);long timestamp = Long.parseLong(fields[3]);return new Rating(userId, movieId, rating, timestamp);}}public static void main(String[] args) {SparkSession spark = SparkSession.builder().appName("ALSDemo").getOrCreate();JavaRDD<Rating> ratingsRDD = spark.read().textFile("/tmp/sample_movielens_ratings.txt").javaRDD().map(new Function<String, Rating>() {public Rating call(String str) {return Rating.parseRating(str);}});Dataset<Row> ratings = spark.createDataFrame(ratingsRDD, Rating.class);Dataset<Row>[] splits = ratings.randomSplit(new double[]{0.8, 0.2});//8成做训练样本,2成做测试样本Dataset<Row> training = splits[0];Dataset<Row> test = splits[1];// Build the recommendation model using ALS on the training dataALS als = new ALS().setMaxIter(5).setRegParam(0.01).setUserCol("userId").setItemCol("movieId").setRatingCol("rating");ALSModel model = als.fit(training);// Evaluate the model by computing the RMSE on the test dataDataset<Row> predictions = model.transform(test);RegressionEvaluator evaluator = new RegressionEvaluator().setMetricName("rmse").setLabelCol("rating").setPredictionCol("prediction");Double rmse = evaluator.evaluate(predictions);System.out.println("Root-mean-square error = " + rmse);spark.stop();}
}
/** 执行结果:* Root-mean-square error = 1.7215462865151776*/

对Spark平台MLib库通过三个实例初步了解和掌握,主要还是对算法本身有掌握,才能明确实际场景需要用到的算法。

离线轻量级大数据平台Spark之MLib机器学习协同过滤ALS实例相关推荐

  1. 离线轻量级大数据平台Spark之MLib机器学习库概念学习

    Mlib机器学习库 1.1机器学习概念 机器学习有很多定义,倾向于下面这个定义.机器学习是对能通过经验自动改进的计算机算法的研究.机器学习依赖数据经验并评估和优化算法所运行出的模型.机器学习算法尝试根 ...

  2. 离线轻量级大数据平台Spark之MLib机器学习库朴素贝叶斯实例

    1.朴素贝叶斯介绍 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率,公式为: 贝叶斯定理: 从已知P(A|B)获得P(B|A)值. 假设A和B代表两类互相影响的事件,如 ...

  3. 离线轻量级大数据平台Spark之MLib机器学习库Word2Vec实例

    Word2Vecword2vec能将文本中出现的词向量化,可以在捕捉语境信息的同时压缩数据规模.Word2Vec实际上是两种不同的方法:Continuous Bag of Words (CBOW) 和 ...

  4. 离线轻量级大数据平台Spark之MLib机器学习库TF-IDF实例

    TF-IDF(termfrequency–inverse document frequency)是TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的 ...

  5. 离线轻量级大数据平台Spark之MLib机器学习库线性回归实例

    1.线性回归 线性回归是利用称为线性回归方程的函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析方法,只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归,在实际情况中大多数都 ...

  6. 离线轻量级大数据平台Spark之MLib机器学习库聚类算法KMeans实例

    1.KMeans算法 所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高.其 ...

  7. 离线轻量级大数据平台Spark之MLib机器学习库SVM实例

    支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终 ...

  8. 离线轻量级大数据平台Spark之单机部署及Java开发

    1.Spark平台基本介绍 Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and PeopleLab) 开发,可用来构建大型的.低延迟的数据分析应用程 ...

  9. 离线轻量级大数据平台Spark之JavaRDD关联join操作

    对两个RDD进行关联操作,如: 1)文件post_data.txt包含:post_id\title\content 2)文件train.txt包含:dev_id\post_id\praise\time ...

最新文章

  1. 扩展欧几里得算法_扩展欧几里得递推算法
  2. android adt 最新下载地址
  3. (HDU)1491-- Octorber 21st (校庆)
  4. Miniprofiler在普通net项目中的使用
  5. 【视频码率==文件传输大小等通用计算】
  6. java 一对多 socket_js作为websocket client,服务用java 点对点、一对多聊天
  7. 拓端tecdat|R语言Fama French (FF) 三因子模型和CAPM多因素扩展模型分析股票市场投资组合风险/收益可视化
  8. 3套看漫画学python视频教程
  9. lstanyu+大米云,我的云
  10. VMware Workstation Ubuntu 20.04 LTS无法连接网络问题
  11. PCL库学习笔记——使用变换矩阵变换点云
  12. 二、设计模式-必要的基础知识—旅行前的准备 #和设计模式一起旅行#
  13. 用 node.js 来制作数据可视化视频吧
  14. Aspose.Words在word文档合并时如何控制列表编号
  15. itextpdf 添加折线图、饼图、柱状图
  16. Linux /etc/fstab文件详解
  17. Tf中的平方,多次方,开方计算
  18. 使用Python批量旋转,镜像图片
  19. 【网络科普】网络类型:PAN、LAN、WLAN、CAN、MAN、SAN和WAN
  20. SpringBoot实现OA自动化办公管理系统

热门文章

  1. NIO详解(十二):AsynchronousFileChannel详解
  2. Zookeeper分布式一致性原理(五):Zookeeper-Java-API
  3. 高中数学对计算机,高中数学在计算机中的运用及思考.doc
  4. 如何关闭win10自动更新_如何关闭win10系统自动更新
  5. Java 匿名对象、内部类
  6. 第一课 第四节 数据转换
  7. 深入浅出 Java Concurrency (33): 线程池 part 6 线程池的实现及原理 (1)[转]
  8. “放到桌面”的Servlet实现
  9. c# 连续抓取页面内容
  10. Android实现系统ROOT, 并能赋予app root权限