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


推荐阅读
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • JavaScript中的数组是数据集合的核心结构之一,内置了多种实用的方法。掌握这些方法不仅能提高开发效率,还能显著提升代码的质量和可读性。本文将详细介绍数组的创建方式及常见操作方法。 ... [详细]
  • 本文探讨了在Django项目中,如何在对象详情页面添加前后导航链接,以提升用户体验。文章详细描述了遇到的问题及解决方案。 ... [详细]
  • 本文详细介绍了如何检查和配置电脑上的PHP环境,包括位数、运行支持以及文件格式的打开方式。适合初学者了解PHP的基础知识和操作方法。 ... [详细]
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
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社区 版权所有