文档章节

spark mllib 协同过滤算法,基于余弦相似度的用户相似度计算

ericSM
 ericSM
发布于 2016/07/27 16:35
字数 675
阅读 1787
收藏 2

运行代码如下

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

结果如图

© 著作权归作者所有

ericSM
粉丝 17
博文 142
码字总数 154379
作品 0
南京
项目经理
私信 提问
Spark机器学习之协同过滤算法

Spark机器学习之协同过滤算法     一)、协同过滤       1.1 概念                协同过滤是一种借助"集体计算"的途径。它利用大量已有的用户偏好来估计用户对其未...

xiaomin0322
2018/06/28
50
0
Spark MLlib 之 大规模数据集的相似度计算原理探索

无论是在ICF还是UCF或者基于内容的推荐,最基本的环节都是计算相似度。如果样本特征维度很高或者的维度很大,都会导致无法直接计算。设想一下100w*100w的二维矩阵,计算相似度怎么算? 更多内...

xingoo
2018/07/11
0
0
基于Spark的机器学习实践 (二) - 初识MLlib

1 MLlib概述 1.1 MLlib 介绍 ◆ 是基于Spark core的机器学习库,具有Spark的优点 ◆ 底层计算经过优化,比常规编码效率往往要高 ◆ 实现了多种机器学习算法,可以进行模型训练及预测 1.2 Spark ...

javaedge
04/09
0
0
Spark MLlib系列(二):基于协同过滤的电影推荐系统

前言 随着大数据时代的到来,数据当中挖取金子的工作越来越有吸引力。利用Spark在内存迭代运算、机器学习领域强悍性能的优势,使用spark处理数据挖掘问题就显得很有实际价值。这篇文章给大家...

xiaomin0322
2018/06/28
247
0
Spark2.1.0之模块设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/80386736 在阅读本文之前,读者最好已经阅读了《Spark2.1.0之初识Spark》和《Spark...

泰山不老生
2018/06/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么Netty的FastThreadLocal速度快

前言 最近在看netty源码的时候发现了一个叫FastThreadLocal的类,jdk本身自带了ThreadLocal类,所以可以大致想到此类比jdk自带的类速度更快,主要快在什么地方,以及为什么速度更快,下面做一...

ksfzhaohui
5分钟前
1
0
资治通鉴解析:无论什么条件,要挟权力做出承诺,都会被清算

电影《满城尽带黄金甲》里有句经典的名言“朕赐给你的,才是你的。朕不给你的,你不能抢。”之所以这段话有名,核心的就是,它揭示了这样一个权力心思:无论什么情况,权力的行使,都不愿意受...

太空堡垒185
9分钟前
1
0
CSS技巧之向下箭头

本文转载于:专业的前端网站➫CSS技巧之向下箭头 思路: 使用◇符号(可在输入法的软键盘找到该符号),使用定位选择位置,并隐藏溢出的上半部分 细点: 1.使用i标签的楷体属性把◇变大 2.给i...

前端老手
25分钟前
1
0
SpringCloud alibaba微服务之NACOS多环境配置整合

前言 伴随着spring cloud alibaba 登上主板以后,我就去了解下感觉还是蛮不错的。说实话第一次看见Nacos好长一段时间连读法都不知道...(/nɑ:kəʊs/)。按照官方的话说Nacos是:一个更易于...

攻城狮-飞牛
28分钟前
2
0
tcpdump

tcpdump -A -s0 port 21011 -i any (1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型 (2)-i eth1 : 只抓经过接口eth1的包 (3)-t : 不显...

mskk
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部