热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sparkmllib协同过滤算法之如何实现基于余弦相似度的用户相似度计算

这篇文章主要介绍了sparkmllib协同过滤算法之如何实现基于余弦相似度的用户相似度计算,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅

这篇文章主要介绍了spark mllib 协同过滤算法之如何实现基于余弦相似度的用户相似度计算,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

运行代码如下

/**
  *  协同过滤算法,基于余弦相似度的用户相似度计算
  *  一般来说欧几里得相似度用来表现不同目标的绝对差异性,分析目标之间的相似性与差异情况.
  *  而余弦相似度更多的是对目标从前进趋势上进行区分.
  */
package spark.collaborativeFiltering

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

import scala.collection.mutable.Map

object sparkCollaborativeFiltering {
  val conf = new SparkConf()
    .setMaster("local")
    .setAppName("CollaborativeFilteringSpark ")	//设置环境变量
  val sc = new SparkContext(conf) //实例化环境
  val users = sc.parallelize(
      Array("张三","李四","王五","朱六","卓七")
    ) //设置用户
  val films = sc.parallelize(
      Array("飘","龙门客栈","罗密欧与朱丽叶","澳门风云","狼图腾")
    )	//设置电影名

  //使用一个source嵌套map作为姓名电影名和分值的存储
  val source = Map[String,Map[String,Int]]()
  val filmSource = Map[String,Int]()//设置一个用以存放电影分的map
  def getSource(): Map[String,Map[String,Int]] = {//设置电影评分
    val user1FilmSource = Map("飘" -> 2,"龙门客栈" -> 3,
      "罗密欧与朱丽叶" -> 1,"澳门风云" -> 0,"狼图腾" -> 1)
    val user2FilmSource = Map("飘" -> 1,"龙门客栈" -> 2,
      "罗密欧与朱丽叶" -> 2,"澳门风云" -> 1,"狼图腾" -> 4)
    val user3FilmSource = Map("飘" -> 2,"龙门客栈" -> 1,
      "罗密欧与朱丽叶" -> 0,"澳门风云" -> 1,"狼图腾" -> 4)
    val user4FilmSource = Map("飘" -> 3,"龙门客栈" -> 2,
      "罗密欧与朱丽叶" -> 0,"澳门风云" -> 5,"狼图腾" -> 3)
    val user5FilmSource = Map("飘" -> 5,"龙门客栈" -> 3,
      "罗密欧与朱丽叶" -> 1,"澳门风云" -> 1,"狼图腾" -> 2)
    source += ("张三" -> user1FilmSource)//对人名进行存储
    source += ("李四" -> user2FilmSource)
    source += ("王五" -> user3FilmSource)
    source += ("朱六" -> user4FilmSource)
    source += ("卓七" -> user5FilmSource)
    source			//返回嵌套map
  }

  //两两计算分值,采用余弦相似性
  def getCollaborateSource(user1:String,user2:String):Double = {
    val user1FilmSource = source.get(user1)
        .get.values.toVector	//获得第1个用户的评分
    val user2FilmSource = source.get(user2)
        .get.values.toVector	//获得第2个用户的评分
    val member = user1FilmSource.zip(user2FilmSource)
        .map(d => d._1 * d._2).reduce(_ + _)
        .toDouble//对公式分子部分进行计算,zip将若干RDD 压缩成一个RDD
    val temp1  = math.sqrt(user1FilmSource.map(num => {	//求出分母第1个变量值
        math.pow(num,2)	//数学计算
      }).reduce(_ + _))	//进行叠加
    val temp2  = math.sqrt(user2FilmSource.map(num => {//求出分母第2个变量值
        math.pow(num,2)//数学计算
      }).reduce(_ + _))//进行叠加
    val denominator = temp1 * temp2	//求出分母
    member / denominator//进行计算
  }

  def main(args: Array[String]) {
    getSource()		//初始化分数
    val name = "李四"    //设定目标对象
    users.foreach(user =>{//迭代进行计算
      println(name + " 相对于 " + user +"的相似性分数是:"+
      getCollaborateSource(name,user))
    })
  }
}

结果如图

spark mllib 协同过滤算法之如何实现基于余弦相似度的用户相似度计算

感谢你能够认真阅读完这篇文章,希望小编分享的“spark mllib 协同过滤算法之如何实现基于余弦相似度的用户相似度计算”这篇文章对大家有帮助,同时也希望大家多多支持编程笔记,关注编程笔记行业资讯频道,更多相关知识等着你来学习!


推荐阅读
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
author-avatar
Kevinczp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有