//实例化环境
val conf=new SparkConf()
.setAppName("ConsineSimilar")
.setMaster("local")
val sc=new SparkContext(conf)
//初始化用户
val users=sc.parallelize(Array("aaa","bbb","ccc","ddd","eee"))
//设置电影名
val films=sc.parallelize(Array("smzdm","yixb","znh","nhsc","fcwr"))
下面是核心代码,使用余弦相似度公式来计算不同用户之间的相似度。
/**
* 计算余弦相似性
* @param user1
* @param user2
* @return
*/
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(num=>num._1*num._2).reduce(_+_).toDouble
//求出分母第一个变量的值
val temp1 = math.sqrt(user1FilmSource.map(num => {
math.pow(num, 2)
}).reduce(_+_)).toDouble
//求出分母第二个变量的值
val temp2 = math.sqrt(user2FileSource.map(num => {
math.pow(num,2)
}).reduce(_+_)).toDouble
//求出分母
val denominator = temp1*temp2
//返回结果
member/denominator
}
主函数:
def main(args: Array[String]): Unit = {
//初始化分数
getSource()
//设定目标对象
val name="bbb"
//迭代进行计算
users.foreach(user=>{
println(name + " 相对于 "+user +"的相似性分数为: "+getCollaborateSource(name,user))
})
val frist=users.sortBy((user=>getCollaborateSource(name,user)),false,1).first()
println("-----------------------------------------------------------")
println("相似度最高的用户为:"+frist)
}