推荐系统之余弦相似度的Spark实现

(1)原理分析

   余弦相似度度量是相似度度量中最常用的度量关系,从程序分析中,

  • 第一步是数据的输入,
  • 其次是使用相似性度量公式
  • 最后是对不同用户的递归计算。

   本例子是基于欧几里得举例的相似度计算。

(2)源代码

 package com.bigdata.demo

 import org.apache.spark.{SparkContext, SparkConf}

 /**
* Created by SimonsZhao on 3/29/2017.
*/
object CollaborativeFilteringSpark {
//1.设置环境变量
val conf=new SparkConf().setMaster("local").setAppName("CollaborativeFilteringSpark")
//2.实例化环境
val sc=new SparkContext(conf)
//3.设置用户
val users=sc.parallelize(Array("aaa","bbb","ccc","ddd","eee"))
//4.设置电影名
sc.parallelize(Array("smzdm","ylxb","znb","nhsc","fcwr"))
//5.使用一个source嵌套map作为姓名电影名和分值的存储
var source=Map[String,Map[String,Int]]()
//6.设置一个用以存放电影分的map
val filmSource =Map[String,Int]()
//7.设置电影评分
def getSource():Map[String,Map[String,Int]]={
val user1FilmSource=Map("smzdm"->2,"ylxb"->3,"znb"->1,"nhsc"->0,"fcwr"->1)
val user2FilmSource=Map("smzdm"->1,"ylxb"->2,"znb"->2,"nhsc"->1,"fcwr"->4)
val user3FilmSource=Map("smzdm"->2,"ylxb"->1,"znb"->0,"nhsc"->1,"fcwr"->4)
val user4FilmSource=Map("smzdm"->3,"ylxb"->2,"znb"->0,"nhsc"->5,"fcwr"->3)
val user5FilmSource=Map("smzdm"->5,"ylxb"->3,"znb"->1,"nhsc"->1,"fcwr"->2)
//存储人的名字
source += ("aaa" -> user1FilmSource)
//存储人的名字
source += ("bbb" -> user2FilmSource)
//存储人的名字
source += ("ccc" -> user3FilmSource)
//存储人的名字
source += ("ddd" -> user4FilmSource)
//存储人的名字
source += ("eee" -> user5FilmSource)
//返回嵌套的map
source
}
//采用余弦相似度两两计算分值
def getCollaborateSource(user1:String,user2:String):Double={
//获得第一个用户的评分
val user1FilmSource =source.get(user1).get.values.toVector
//获得第二个用户的评分
val user2FileSource=source.get(user2).get.values.toVector
//对公示分子部分进行计算
val member=user1FilmSource.zip(user2FileSource).map(d => d._1 *d._2).reduce(_+_).toDouble
//求解分母的第一个变量
val temp1=math.sqrt(user1FilmSource.map(num=>{math.pow(num,2)}).reduce(_+_))
//求解分母第二个变量
val temp2=math.sqrt(user2FileSource.map(num=>{math.pow(num,2)}).reduce(_+_))
//求出分母
val denominator=temp1*temp2
//求出分式的值
member/denominator
}
def main(args: Array[String]) {
//初始化分数
getSource()
//设定目标对象
val name="bbb"
//进行迭代计算
users.foreach(user=>{
println(name+" 相对于"+user+"的相似性分数是:"+getCollaborateSource(name,user))
})
}
}

点击可复制代码

 package com.bigdata.demo

 import org.apache.spark.{SparkContext, SparkConf}

 /**
* Created by SimonsZhao on 3/29/2017.
*/
object CollaborativeFilteringSpark {
//1.设置环境变量
val conf=new SparkConf().setMaster("local").setAppName("CollaborativeFilteringSpark")
//2.实例化环境
val sc=new SparkContext(conf)
//3.设置用户
val users=sc.parallelize(Array("aaa","bbb","ccc","ddd","eee"))
//4.设置电影名
sc.parallelize(Array("smzdm","ylxb","znb","nhsc","fcwr"))
//5.使用一个source嵌套map作为姓名电影名和分值的存储
var source=Map[String,Map[String,Int]]()
//6.设置一个用以存放电影分的map
val filmSource =Map[String,Int]()
//7.设置电影评分
def getSource():Map[String,Map[String,Int]]={
val user1FilmSource=Map("smzdm"->2,"ylxb"->3,"znb"->1,"nhsc"->0,"fcwr"->1)
val user2FilmSource=Map("smzdm"->1,"ylxb"->2,"znb"->2,"nhsc"->1,"fcwr"->4)
val user3FilmSource=Map("smzdm"->2,"ylxb"->1,"znb"->0,"nhsc"->1,"fcwr"->4)
val user4FilmSource=Map("smzdm"->3,"ylxb"->2,"znb"->0,"nhsc"->5,"fcwr"->3)
val user5FilmSource=Map("smzdm"->5,"ylxb"->3,"znb"->1,"nhsc"->1,"fcwr"->2)
//存储人的名字
source += ("aaa" -> user1FilmSource)
//存储人的名字
source += ("bbb" -> user2FilmSource)
//存储人的名字
source += ("ccc" -> user3FilmSource)
//存储人的名字
source += ("ddd" -> user4FilmSource)
//存储人的名字
source += ("eee" -> user5FilmSource)
//返回嵌套的map
source
}
//采用余弦相似度两两计算分值
def getCollaborateSource(user1:String,user2:String):Double={
//获得第一个用户的评分
val user1FilmSource =source.get(user1).get.values.toVector
//获得第二个用户的评分
val user2FileSource=source.get(user2).get.values.toVector
//对公示分子部分进行计算
val member=user1FilmSource.zip(user2FileSource).map(d => d._1 *d._2).reduce(_+_).toDouble
//求解分母的第一个变量
val temp1=math.sqrt(user1FilmSource.map(num=>{math.pow(num,2)}).reduce(_+_))
//求解分母第二个变量
val temp2=math.sqrt(user2FileSource.map(num=>{math.pow(num,2)}).reduce(_+_))
//求出分母
val denominator=temp1*temp2
//求出分式的值
member/denominator
}
def main(args: Array[String]) {
//初始化分数
getSource()
//设定目标对象
val name="bbb"
//进行迭代计算
users.foreach(user=>{
println(name+" 相对于"+user+"的相似性分数是:"+getCollaborateSource(name,user))
})
}
}

点击+可复制代码

(3)结果分析

推荐系统之余弦相似度的Spark实现的更多相关文章

  1. Spark/Scala实现推荐系统中的相似度算法(欧几里得距离、皮尔逊相关系数、余弦相似度:附实现代码)

    在推荐系统中,协同过滤算法是应用较多的,具体又主要划分为基于用户和基于物品的协同过滤算法,核心点就是基于"一个人"或"一件物品",根据这个人或物品所具有的属性, ...

  2. Spark Mllib里相似度度量(基于余弦相似度计算不同用户之间相似性)(图文详解)

    不多说,直接上干货! 常见的推荐算法 1.基于关系规则的推荐 2.基于内容的推荐 3.人口统计式的推荐 4.协调过滤式的推荐 协调过滤算法,是一种基于群体用户或者物品的典型推荐算法,也是目前常用的推荐 ...

  3. spark MLlib 概念 5: 余弦相似度(Cosine similarity)

    概述: 余弦相似度 是对两个向量相似度的描述,表现为两个向量的夹角的余弦值.当方向相同时(调度为0),余弦值为1,标识强相关:当相互垂直时(在线性代数里,两个维度垂直意味着他们相互独立),余弦值为0, ...

  4. 【Math】余弦相似度 和 Pearson相关系数

    http://cucmakeit.github.io/2014/11/13/%E4%BF%AE%E6%AD%A3%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A ...

  5. 相似度度量:欧氏距离与余弦相似度(Similarity Measurement Euclidean Distance Cosine Similarity)

    在<机器学习---文本特征提取之词袋模型(Machine Learning Text Feature Extraction Bag of Words)>一文中,我们通过计算文本特征向量之间 ...

  6. java算法(1)---余弦相似度计算字符串相似率

    余弦相似度计算字符串相似率 功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中.这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据 ...

  7. 皮尔逊相关系数与余弦相似度(Pearson Correlation Coefficient & Cosine Similarity)

    之前<皮尔逊相关系数(Pearson Correlation Coefficient, Pearson's r)>一文介绍了皮尔逊相关系数.那么,皮尔逊相关系数(Pearson Corre ...

  8. 两矩阵各向量余弦相似度计算操作向量化.md

    余弦相似度计算: \cos(\bf{v_1}, \bf{v_2}) = \frac{\left( v_1 \times v_2 \right)}{||v_1|| * ||v_2|| } \cos(\b ...

  9. TF版本的Word2Vec和余弦相似度的计算

    前几天一个同学在看一段代码,内容是使用gensim包提供的Word2Vec方法训练得到词向量,里面有几个变量code.count.index.point看不懂,就向我求助,我大概给他讲了下code是哈 ...

随机推荐

  1. Metropolis-Hastings算法

    (学习这部分内容大约需要1.5小时) 摘要 马尔科夫链蒙特卡洛(Markov chain Monte Carlo, MCMC)是一种近似采样算法, 它通过定义稳态分布为 \(p\) 的马尔科夫链, 在 ...

  2. SpringMVC由浅入深day01_1springmvc框架介绍

    springmvc 第一天 springmvc的基础知识 课程安排: 第一天:springmvc的基础知识 什么是springmvc? springmvc框架原理(掌握) 前端控制器.处理器映射器.处 ...

  3. javascript 作用域、作用域链理解

    JavaScript作用域就是变量和函数的可访问范围. 1.变量作用域 在JavaScript中,变量作用域分为全局作用域和局部作用域. 全局作用域 任何地方都可以定义拥有全局作用域的变量 1.没有用 ...

  4. Spring Web 应用的最大败笔

    开发人员在使用Spring应用是非常擅长谈论依赖注入的好处.不幸的是,他们不是那么真的利用它的好处,如单一职责原则,分离关注原则.如果我们一起来看看大部分Spring的Web应用程序,常见的错误的设计 ...

  5. python --->字典 集合 学习笔记

    1.字典--->创建空字典:dict={} broa=["李宁",”耐克“,“阿迪达斯”,“鱼c工作室”] sloga=[“A”,“B”,“C”,“D”] dict={&qu ...

  6. Lua中的table构造式(table constructor)

    最简单的构造式就是一个空构造式{},用于创建一个空table. 构造式还可以用于初始化数组.例如,以下语句:days = {"Sunday", "Monday" ...

  7. java 对 汉字排序(按照拼音字母排序)

    业务场景: 一个list集合,里面add了若干个实体类,针对该实体类排序的属性为String. 使用技术,自定义list排序(JDK自带),重写Comparator接口的compare方法,汉字转拼音 ...

  8. linux添加静态路由

    1.使用route命令,查看本机路由直接输入route回车即可.route 命令参数: add     增加路由 del     删除路由 -net    设置到某个网段的路由 -host   设置到 ...

  9. IOS设计模式第七篇之观察者设计模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 观察者设计模式 在观察者设计模式里面,一个对象通知其他的对象一些状态的改变.涉及这些对象不需要知道另一个对象---因此鼓励解耦设计模式.这个设计模式 ...

  10. 【云迁移论文笔记】Cloud Migration Research:A Systematic Review

    Cloud Migration Research:A Systematic Review Author Info: Pooyan Jamshidi PhD Postdoctoral Researche ...