Spark Mllib里相似度度量(基于余弦相似度计算不同用户之间相似性)(图文详解)...

本文介绍了推荐算法中的协调过滤,并重点讲解了基于欧几里得距离和余弦角度的相似度计算,特别是详细阐述了如何使用余弦相似度计算不同用户之间的相似性。通过示例代码展示了在Spark MLlib中实现这一过程的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

  不多说,直接上干货!

 

 

 

常见的推荐算法

  1、基于关系规则的推荐

  2、基于内容的推荐

  3、人口统计式的推荐

  4、协调过滤式的推荐

 

 

 

  协调过滤算法,是一种基于群体用户或者物品的典型推荐算法,也是目前常用的推荐算法中最常用和最经典的算法。

   协调过滤算法主要有两种:

    用户对物品:  考查具有相同爱好的用户相同物品的评分标准进行计算;

    物品对用户:  考查具有相同物质的物品从而推荐选择了某件物品的用户。

 

 

 

 

 

相似度度量(基于欧几里得距离的相似度计算和基于余弦角度的相似度计算)

    (1)、基于欧几里得距离的相似度计算

        欧几里得,是三维空间中两个点的真实距离。

        欧几里得相似度计算是一种基于用户之间直线距离的计算方式。在相似度计算中,不同的物品或者用户可以将其定义为不同的坐标点,而特定目标定位为坐标原点

        在实际应用中,常常使用欧几里得距离的倒数作为相似度,即 1/ (d+1) 作为近似值。

 

    (2)、基于余弦角度的相似度计算    

        不同的物品或者用户作为不同的坐标点,但不能为坐标原点。

 

 

 

 

   其实,还有其他的算法,也可以来相似度度量

 

 

 

 

 

 

 

 

  

 

基于欧几里得距离的相似度计算和基于余弦角度的相似度计算的区别

  欧几里得相似度是以目标绝对距离作为衡量的标准,余弦相似度以目标差异的大小作为衡量标准。

  欧几里得相似度注重目标之间的差异,与目标在空间中的位置直接相关。余弦相似度是不同目标在空间中的夹角,更加表现在前进趋势上的差异。

  欧几里得相似度和余弦相似度具有不同的计算方法和描述特征,一般来说,欧几里得相似度用来表现不同目标的绝对差异性,分析目标之间的相似度与差异情况。而余弦相似度更多的是对目标从方向趋势上区分,对特定坐标数字不敏感。

 

 

 

 

 

基于余弦相似度计算不同用户之间相似性

  步骤是:  

  (1)输入数据  

  (2)建立相似度算法公式

  (3)计算不同用户之间的相似度

 

 

 

 

 

 

 

 

 

   CollaborativeFilteringSpark.scala

package zhouls.bigdata.chapter5


import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable.Map


object CollaborativeFilteringSpark {
  val conf = new SparkConf().setMaster("local").setAppName("CollaborativeFilteringSpark ")    //设置环境变量
  val sc = new SparkContext(conf)                                 //实例化环境
  val users = sc.parallelize(Array("aaa","bbb","ccc","ddd","eee"))       //设置用户
  val films = sc.parallelize(Array("smzdm","ylxb","znh","nhsc","fcwr"))    //设置电影名
   
  val source = Map[String,Map[String,Int]]()                //使用一个source嵌套map作为姓名电影名和分值的存储
   val filmSource = Map[String,Int]()                     //设置一个用以存放电影分的map
   def getSource(): Map[String,Map[String,Int]] = {            //设置电影评分
     val user1FilmSource = Map("smzdm" -> 2,"ylxb" -> 3,"znh" -> 1,"nhsc" -> 0,"fcwr" -> 1)
     val user2FilmSource = Map("smzdm" -> 1,"ylxb" -> 2,"znh" -> 2,"nhsc" -> 1,"fcwr" -> 4)
     val user3FilmSource = Map("smzdm" -> 2,"ylxb" -> 1,"znh" -> 0,"nhsc" -> 1,"fcwr" -> 4)
     val user4FilmSource = Map("smzdm" -> 3,"ylxb" -> 2,"znh" -> 0,"nhsc" -> 5,"fcwr" -> 3)
     val user5FilmSource = Map("smzdm" -> 5,"ylxb" -> 3,"znh" -> 1,"nhsc" -> 1,"fcwr" -> 2)
     source += ("aaa" -> user1FilmSource)                //对人名进行存储
     source += ("bbb" -> user2FilmSource)                 //
Spark MLlib是一个基于Spark的机器学习库,其中包含了许多常用的机器学习算法,包括余弦相似度计算。下面是使用Spark MLlib计算余弦相似度的示例代码: ```python from pyspark.ml.feature import Normalizer from pyspark.ml.linalg import Vectors from pyspark.sql.functions import udf from pyspark.sql.types import DoubleType # 创建一个DataFrame,包含两个向量 data = [(Vectors.dense([1.0, 2.0, 3.0]), Vectors.dense([4.0, 5.0, 6.0])), (Vectors.dense([4.0, 5.0, 6.0]), Vectors.dense([7.0, 8.0, 9.0])), (Vectors.dense([1.0, 1.0, 1.0]), Vectors.dense([2.0, 2.0, 2.0]))] df = spark.createDataFrame(data, ["vec1", "vec2"]) # 创建一个Normalizer对象,用于对向量进行归一化 normalizer = Normalizer(inputCol="vec1", outputCol="normVec1") df = normalizer.transform(df) normalizer = Normalizer(inputCol="vec2", outputCol="normVec2") df = normalizer.transform(df) # 定义一个UDF,用于计算余弦相似度 def cosine_similarity(v1, v2): return float(v1.dot(v2) / (v1.norm(2) * v2.norm(2))) cosine_similarity_udf = udf(cosine_similarity, DoubleType()) # 计算余弦相似度 df = df.withColumn("similarity", cosine_similarity_udf("normVec1", "normVec2")) df.show() ``` 输出结果如下: ``` +-------------+-------------+--------------------+--------------------+-------------------+ | vec1| vec2| normVec1| normVec2| similarity| +-------------+-------------+--------------------+--------------------+-------------------+ |[1.0,2.0,3.0]|[4.0,5.0,6.0]|[0.26726124191242...|[0.45584230583855...| 0.9746318461970762| |[4.0,5.0,6.0]|[7.0,8.0,9.0]|[0.45584230583855...|[0.50257071116331...| 0.9970544855015815| |[1.0,1.0,1.0]|[2.0,2.0,2.0]|[0.57735026918962...|[0.57735026918962...|0.9999999999999998 | +-------------+-------------+--------------------+--------------------+-------------------+ ``` 可以看到,我们首先创建了一个包含两个向量的DataFrame,然后使用Normalizer对向量进行归一化,最后定义了一个UDF用于计算余弦相似度,并将其应用到DataFrame中。输出结果中,similarity列即为计算得到的余弦相似度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值