热门标签 | 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 协同过滤算法之如何实现基于余弦相似度的用户相似度计算”这篇文章对大家有帮助,同时也希望大家多多支持编程笔记,关注编程笔记行业资讯频道,更多相关知识等着你来学习!


推荐阅读
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
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社区 版权所有