sparkmllib协同过滤推荐算法

利用Spark MLlib实现协同过滤(ALS)算法实例(Python) 协作过滤 协同过滤通常用于推荐系统。这些技术旨在填补用户项目关联矩阵的缺失条目。 spark.ml目前支持基于模型的协作过滤,其中用户和产品由一组可用于预测缺失条目的潜在因素来描述。 spark.ml使用交替最小二乘(ALS) 算法来学习这些潜在因素。实现spark.ml有以下参数: numBlocks是为了并行化计算而将用户和项目划分到的块的数量(默认为10)。 rank是模型中潜在因素... 阅读详情

协同过滤推荐算法,是最经典、最常用的推荐算法。通过分析用户兴趣,在用户群中找到指定用户的相似用户,综合这些相似用户对某一信息的评价,形成系统关于该指定用户对此信息的喜好程度预测。
要实现协同过滤,需要以下几个步骤:

1)收集用户偏好;
2)找到相似的用户或物品;
3)计算推荐。

这里写图片描述

用户评分

从用户的行为和偏好中发现规律,并基于此进行推荐,所以收集用户的偏好信息成为系统推荐效果最基础的决定因素。用户有很多种方式向系统提供自己的偏好信息,比如:评分、投票、转发、保存书签、购买、点击流、页面停留时间等。
1. 将不同的行为分组
一般可以分为查看和购买,然后基于不同的用户行为,计算不同用户或者物品的相似度。
2. 对不同行为进行加权
对不同行为产生的用户喜好进行加权,然后求出用户对物品的总体喜好。当我们收集好用户的行为数据后,还要对 数据进行预处理,最核心的工作就是减噪和归一化。
这里写图片描述
对用户的行为分析得到用户的偏好后,可以根据用户的偏好计算相似用户和物品,然后可以基于相似用户或物品进行推荐。这就是协同过滤中的两个分支了,即基于用户的协同过滤和基于物品的协同过滤。
这里写图片描述
这里写图片描述
这里写图片描述
3. 皮尔逊相关系数(Pearson Correlation Coefficient)
4. Cosine 相似度(Cosine Similarity)
5. Tanimoto 系数(Tanimoto Coefficient)

推荐计算

  1. 基于用户的CF(User CF)
    基于用户的 CF 的基本思想相当简单:基于用户对物品的偏好找到相邻的邻居用户,然后将邻居用户喜欢的推荐给当前用户。在计算上,就是将一个用户对所有物品的偏好作为一个向量来计算用户之间的相似度,找到K 邻居后,根据邻居的相似度权重及其对物品的偏好,预测当前用户没有偏好的未涉及物品,计算得到一个排序的物品列表作为推荐。图14-1 给出了一个例子,对于用户A,根据用户的历史偏好,这里只计算得到一个邻居-用户C,然后将用户C 喜欢的物品D 推荐给用户A。
    这里写图片描述
  2. 基于物品的CF(Item CF)
    基于物品的CF 的原理和基于用户的CF 类似,只是在计算邻居时采用物品本身,而不是从用户的角度。即基于用户对物品的偏好找到相似的物品,然后根据用户的历史偏好,推荐相似的物品给他。从计算的角度看,就是将所有用户对某个物品的偏好作为一个向量来计算物品之间的相似度,得到物品的相似物品后,根据用户历史的偏好预测当前用户还没有表示偏好的物品,计算得到一个排序的物品列表作为推荐。
    这里写图片描述
    根据用户评分矩阵采用同现相似度计算物品相似度矩阵。
    这里写图片描述
    其相似度计算实现了分布式计算,实现过程如下:
    这里写图片描述
    对于欧氏相似度的计算,采用离散计算公式d(x, y) = sqrt(Σ((x(i)-y(i)) * (x(i)- y(i))))。其中,i 只取x、y 同现的点,未同现的点不参与相似度计算;sim(x, y) = m / (1 + d(x, y)),m 为x、y 重叠数,同现次数
    这里写图片描述
    根据物品相似度矩阵和用户评分计算用户推荐列表,计算公式是R=W*A,取推荐计算中用户未评分过的物品,并且按照计算结果倒序推荐给用户。
    这里写图片描述
    其推荐计算实现了分布式计算。
    这里写图片描述

源码分析

这里写图片描述
ALS算法:

def train(
      ratings: RDD[Rating],
      rank: Int,
      iterations: Int,
      lambda: Double,
      blocks: Int,
      seed: Long
    ): MatrixFactorizationModel = {
    new ALS(blocks, blocks, rank, iterations, lambda, false, 1.0, seed).run(ratings)
  }
 def run(ratings: RDD[Rating]): MatrixFactorizationModel = {
    require(!ratings.isEmpty(), s"No ratings available from $ratings")

    val sc = ratings.context

    val numUserBlocks = if (this.numUserBlocks == -1) {
      math.max(sc.defaultParallelism, ratings.partitions.length / 2)
    } else {
      this.numUserBlocks
    }
    val numProductBlocks = if (this.numProductBlocks == -1) {
      math.max(sc.defaultParallelism, ratings.partitions.length / 2)
    } else {
      this.numProductBlocks
    }

    val (floatUserFactors, floatProdFactors) = NewALS.train[Int](
      ratings = ratings.map(r => NewALS.Rating(r.user, r.product, r.rating.toFloat)),
      rank = rank,
      numUserBlocks = numUserBlocks,
      numItemBlocks = numProductBlocks,
      maxIter = iterations,
      regParam = lambda,
      implicitPrefs = implicitPrefs,
      alpha = alpha,
      nonnegative = nonnegative,
      intermediateRDDStorageLevel = intermediateRDDStorageLevel,
      finalRDDStorageLevel = StorageLevel.NONE,
      checkpointInterval = checkpointInterval,
      seed = seed)

    val userFactors = floatUserFactors
      .mapValues(_.map(_.toDouble))
      .setName("users")
      .persist(finalRDDStorageLevel)
    val prodFactors = floatProdFactors
      .mapValues(_.map(_.toDouble))
      .setName("products")
      .persist(finalRDDStorageLevel)
    if (finalRDDStorageLevel != StorageLevel.NONE) {
      userFactors.count()
      prodFactors.count()
    }
    new MatrixFactorizationModel(rank, userFactors, prodFactors)
  }
private def recommend(
      recommendToFeatures: Array[Double],
      recommendableFeatures: RDD[(Int, Array[Double])],
      num: Int): Array[(Int, Double)] = {
    val scored = recommendableFeatures.map { case (id, features) =>
      (id, blas.ddot(features.length, recommendToFeatures, 1, features, 1))
    }
    scored.top(num)(Ordering.by(_._2))
  }

实例:

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, "target/tmp/myCollaborativeFilter")
val sameModel = MatrixFactorizationModel.load(sc, "target/tmp/myCollaborativeFilter")
Spark MLlib协同过滤推荐算法实现 Spark MLlib协同过滤推荐算法实现一、算法概述 一、算法概述 阅读详情

相关推荐

python使用spark实现推荐系统_利用Spark MLlib实现协同过滤(ALS)算法实例(Python)

利用Spark MLlib实现协同过滤(ALS)算法实例(Python)发布时间:2018-04-07 16:24,浏览次数:1137, 标签:SparkMLlibALSPython协作过滤协同过滤通常用于推荐系统。这些技术旨在填补用户项目关联矩阵的缺失条目。spark.ml目前支持基于模型的协作过滤,其中用户和产品由一组可用于预测缺失条目的潜在因素来描述。 spark.ml使用交替最小二乘(AL...

weixin_39752215的博客 831

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

Spark MLlib架构解析MLlib的底层基础解析MLlib算法库分析分类算法回归算法聚类算法协同过滤MLlib的实用程序分析从架构图可以看出MLlib主要包含三个部分:底层基础:包括Spark的运行库、矩阵库和向量库;算法库:包含广义线性模型、推荐系统、聚类、决策树和评估的算法;实用程序:包括测试数据的生成、外部数据的读入等功能。MLlib的底层基础解析底层基础部分主要包括向量接口和矩阵接...

weixin_39773447的博客 292

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

MLlib——协同过滤推荐算法一、协同过滤1.1 显示vs隐式fankui1.2 实例介绍1.2.1 数据说明评分数据说明(ratings.data)用户信息(users.dat)电影信息(movies.dat)程序代码 相关内容原文地址: 博客园:Lemon_Qin:MLlib-协同过滤 博客园:大数据和AI躺过的坑:Spark MLlib协同过滤算法 一、协同过滤 协同过滤(Collabo...

爱是与世界平行 3250

sparkMllib协同过滤推荐算法

协同过滤推荐算法,是最经典、最常用的推荐算法。通过分析用户兴趣,在用户群中找到指定用户的相似用户,综合这些相似用户对某一信息的评价,形成系统关于该指定用户对此信息的喜好程度预测。 要实现协同过滤,需要以下几个步骤: 1)收集用户偏好; 2)找到相似的用户或物品; 3)计算推荐。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VpWIHzEJ-1608025968713)(%E6%96%87%E6%A1%A3%EF%BC%9A%20sparkmllib%E5%8D%8F%E5%

litianxingzsq的博客 626

离线图书推荐,使用sparkMLlib ALS协同过滤算法

图书推荐,使用sparkMLlib ALS协同过滤算法,bookcrossing数据集,Scala语言,虚拟机ieda平台, 代码参照HADOOP大数据实战权威指南第十一章,只能说算是能运行出结果了吧 package com.csu import java.util.Random import org.apache.spark.{SparkConf, SparkContext} import or...

qq_43561757的博客 654

大数据进阶必修课!Spark实战协同过滤推荐算法

目录9.SparkMLlib协同过滤推荐算法9.1 协同过滤推荐算法9.2 算法源码分析9.3 应用实战9.3.1 数据说明9.3.2 代码详解 9.SparkMLlib协同过滤推荐算法 9.1 协同过滤推荐算法 协同过滤算法是一种经典的推荐算法推荐算法的基础是计算两个对象之间的相关度,其有两种实现形式:基于用户的推荐和基于物品的推荐。 基于用户的推荐思想是基于用户对某项物品的喜好找到具有相同喜好的相邻用户,然后将相邻用户喜欢的物品推荐给该用户。在这里,将一个用户对所有物品的喜好作为一个向量,计算不同用户

bazhaheigang的博客 1342

基于Spark MLlib平台的协同过滤算法---电影推荐系统

又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法推荐系统中的应用。     说到推荐系统,大家可能立马会想到协同过滤算法。本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用。其中,主要包括三部分内容:   协同过滤算法概述   基于模型的协同过滤应用---电影推荐 实时推荐架构分析    

xiaomin1991222的专栏 934

推荐系统-前期调研准备工作(一)

背景 公司电商产品,随着商品的不断丰富,用户被大量可选的商品淹没,传统方式很难直接精准呈现用户喜欢的商品,需要增加推荐服务,前期准备从常规服务开始,例如:看了又看,买了又买功能 目标 通过推荐引擎自动计算用户喜欢的商品,在指定的场景呈现给用户,提高最终订单的转化率 推荐系统的三种方式 一、基于人口的统计学推荐(Demographic-based Recommendation) 仅使用用户的基本信息,比如年龄,性别等衡量用户的相似性,建立用户画像将用户分组,将与当前用户相似的用户所偏好的物品推荐给当前用户

haolinbird的博客 731

电商推荐系统论文:基于Spark机器学习的电商推荐系统的设计与实现,大数据电商推荐系统毕设论文,Spring MLlib电商推荐系统

毕 业 设 计(论 文) 题 目: 基于Spark机器学习的电商推荐系统的设计与实现 这是我去年本科毕业时做的毕业设计论文,全文三万多字,知网查重对重复率1%,由于本科论文不会被发表到知网上,再加上我已毕业近一年,现在将论文发表到CSDN。如有需要做毕设论文可引用本文对内容,先到先得(内容纯原创,少有重复)。 由于作者对水平有限,文章中难免有错误对内容或作者对相关技术有错误对见解,望读者予以谅解,谢谢! 接上篇文章:电商推荐系统(下):实时推荐服务、实时框架、实时推荐算法、获取用户的K次...

qq_43265673的博客 2万+

毕业设计——基于spark的电影推荐系统,包括基于ALS、LFM的离线推荐、实时推荐

项目以推荐系统建设领域知名的经过修改过的MovieLens数据集作为依托,以电影网站真实业务数据架构为基础,包含了离线推荐与实时推荐体系,综合利用了协同过滤算法以及基于内容的推荐方法来提供混合推荐。【用户可视化】 :主 要 负 责实 现 和 用 户 的 交 互 以 及业 务 数 据 的 展 示 , 主 体采 用AngularJS2进行实现,部署在Apache服务上。部署在Tomcat上。【数据存储部分】业务数据库:项目采用广泛应用的文档数据库MongDB作为主数据库,主要负责平台业务逻辑数据的存储。

白话机器学习 647

spark课程设计作业:基于Spark MLlib+ALS协同过滤算法实现的电影推荐系统,采用MovieLens数据集进行分析建模

数据格式:userId,movieId,rating,timestamp。数据格式:userId, [(movieId, rating)]说明:当前文章或代码如侵犯了您的权益,请私信作者删除!数据格式:movieId,title,genres。movieId:电影ID。userId:用户ID。rating:推荐度。

白话机器学习 612

一、 个性化电商广告推荐系统介绍

Ali_Display_Ad_Click是阿里巴巴提供的一个淘宝展示广告点击率预估数据集数据集来源:天池竞赛原始样本骨架raw_sample淘宝网站中随机抽样了114万用户8天内的广告展示/点击日志(2600万条记录),构成原始的样本骨架。user_id:脱敏过的用户ID;adgroup_id:脱敏过的广告单元ID;time_stamp:时间戳;pid:资源位;noclk:为1代表没有点击;为0代表点击;clk:为0代表没有点击;为1代表点击;

Wzideng@qq.com 703

Spark MLlib

基本概念 1. 项不项集 这是一个集合的概念,在一篮子商品中的一件消费品即一项(item),则若干项的集合为 项集,如{啤酒,尿布}构成一个二元项集。 2. 关联规则 关联规则用亍表示数据内隐含的关联性,例如表示购买了尿布的消费者往往也会购买啤酒。 关联性强度如何,由3 个概念,即支持度、置信度、提升度来控制和评价。 3. 支持度(support) 支持度是指在所有项集中{X, Y}出现的可能性,即项集中同时含有X 和Y 的概率: 设定最小阈值为5%,由亍{尿布,啤酒}的支持度为800/10000=8%

weixin_45749011的博客 450

pyspark训练ALS模型注意事项

而用于隐式反馈时,每个评分代表的是用户会和给定产品发送交互的置信度(比如随着用户访问一个网页次数的增加,评分也会提高),预测出来的也是置信度。rank: 使用的特征向量的大小,更大的特征向量会产生更好的模型,但是也需要话费更大的计算代价,默认10。用于显式评分时,每个用户对于一个产品的评分需要是一个得分(例如1到5星),而预测出来的评分也是得分。MLlib/ ml中包含交替最小二乘法(ALS)的一个实现,这是一个协同过滤的常用算法,可以很好的。产品的页面但是没有对产品评分)交互皆可。

Toby的博客 710

spark推荐系统和协同过滤

协同过滤算法则是基于用户的行为数据,通过分析用户与物品的历史关系,找出具有相似行为特征的用户或物品,从而进行推荐推荐系统是一种信息过滤系统,通过分析用户的行为、偏好和个人信息,将最相关、最有用的信息或商品推荐给用户,以提高用户的满意度和体验。基于用户的协同过滤算法是根据用户的历史行为数据,找出具有相似行为特征的用户,将这些用户喜欢的物品推荐给目标用户。基于物品的协同过滤算法是根据用户的历史行为数据,找出用户之间喜欢的相似物品,将这些相似物品推荐给目标用户。)根据这些物品的相似物品,计算推荐物品的得分。

互联网知识分享 989

推荐系统之——ALS交替最小二乘法建立推荐模型

ALS交替最小二乘法作为一种高效的矩阵分解算法,在推荐系统中具有广泛的应用前景。通过交替优化U和V矩阵,ALS算法可以逼近原始评分矩阵,从而实现对未评分物品的预测和个性化推荐。同时,ALS算法还具有缓解冷启动问题和可扩展性等优点,使得其在大数据环境下更具优势。

weixin_63260646的博客 1439
上一篇: sparkmllib关联规则算法(FPGrowth,Apriori)
下一篇: QQ邮箱模拟登录
illbehere
博客等级 码龄18年 53粉丝 64原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值