不多说,直接上干货!
常见的推荐算法
1、基于关系规则的推荐
2、基于内容的推荐
3、人口统计式的推荐
4、协调过滤式的推荐
协调过滤算法,是一种基于群体用户或者物品的典型推荐算法,也是目前常用的推荐算法中最常用和最经典的算法。
协调过滤算法主要有两种:
用户对物品: 考查具有相同爱好的用户对相同物品的评分标准进行计算;
物品对用户: 考查具有相同物质的物品从而推荐给选择了某件物品的用户。
相似度度量(基于欧几里得距离的相似度计算和基于余弦角度的相似度计算)
(1)、基于欧几里得距离的相似度计算
欧几里得,是三维空间中两个点的真实距离。
欧几里得相似度计算是一种基于用户之间直线距离的计算方式。在相似度计算中,不同的物品或者用户可以将其定义为不同的坐标点,而特定目标定位为坐标原点。
在实际应用中,常常使用欧几里得距离的倒数作为相似度,即 1/ (d+1) 作为近似值。
(2)、基于余弦角度的相似度计算
不同的物品或者用户作为不同的坐标点,但不能为坐标原点。
其实,还有其他的算法,也可以来相似度度量。
基于欧几里得距离的相似度计算和基于余弦角度的相似度计算的区别
欧几里得相似度是以目标绝对距离作为衡量的标准,余弦相似度以目标差异的大小作为衡量标准。
欧几里得相似度注重目标之间的差异,与目标在空间中的位置直接相关。余弦相似度是不同目标在空间中的夹角,更加表现在前进趋势上的差异。
欧几里得相似度和余弦相似度具有不同的计算方法和描述特征,一般来说,欧几里得相似度用来表现不同目标的绝对差异性,分析目标之间的相似度与差异情况。而余弦相似度更多的是对目标从方向趋势上区分,对特定坐标数字不敏感。
基于余弦相似度计算不同用户之间相似性
步骤是:
(1)输入数据
(2)建立相似度算法公式
(3)计算不同用户之间的相似度
CollaborativeFilteringSpark.scala
package zhouls.bigdata.chapter5 import org.apache.spark.{SparkConf, SparkContext} import scala.collection.mutable.Map object CollaborativeFilteringSpark { val conf = new SparkConf().setMaster("local").setAppName("CollaborativeFilteringSpark ") //设置环境变量 val sc = new SparkContext(conf) //实例化环境 val users = sc.parallelize(Array("aaa","bbb","ccc","ddd","eee")) //设置用户 val films = sc.parallelize(Array("smzdm","ylxb","znh","nhsc","fcwr")) //设置电影名 val source = Map[String,Map[String,Int]]() //使用一个source嵌套map作为姓名电影名和分值的存储 val filmSource = Map[String,Int]() //设置一个用以存放电影分的map def getSource(): Map[String,Map[String,Int]] = { //设置电影评分 val user1FilmSource = Map("smzdm" -> 2,"ylxb" -> 3,"znh" -> 1,"nhsc" -> 0,"fcwr" -> 1) val user2FilmSource = Map("smzdm" -> 1,"ylxb" -> 2,"znh" -> 2,"nhsc" -> 1,"fcwr" -> 4) val user3FilmSource = Map("smzdm" -> 2,"ylxb" -> 1,"znh" -> 0,"nhsc" -> 1,"fcwr" -> 4) val user4FilmSource = Map("smzdm" -> 3,"ylxb" -> 2,"znh" -> 0,"nhsc" -> 5,"fcwr" -> 3) val user5FilmSource = Map("smzdm" -> 5,"ylxb" -> 3,"znh" -> 1,"nhsc" -> 1,"fcwr" -> 2) source += ("aaa" -> user1FilmSource) //对人名进行存储 source += ("bbb" -> user2FilmSource) //