当前位置: 首页 > 知识库问答 >
问题:

两个pyspark数据帧的余弦相似性

堵彬彬
2023-03-14

我有一个PySpark数据帧,df1,看起来像:

CustomerID  CustomerValue CustomerValue2 
12          .17           .08

我有第二个PySpark数据帧,df2

 CustomerID  CustomerValue CustomerValue
 15          .17           .14
 16          .40           .43
 18          .86           .09

我想得到两个数据帧的余弦相似性。并有类似的东西

 CustomerID  CustomerID   CosineCustVal CosineCustVal
 15          12           1            .90
 16          12           .45          .67
 18          12           .8           .04

共有1个答案

司空玮
2023-03-14

只能计算两个向量的余弦相似度,不能计算两个数的余弦相似度。也就是说,如果名为CustomerValue的列是一个向量的不同组成部分,该向量表示您想要获取两个客户之间相似性的要素,您可以通过转置数据框,然后在CuatomerValues上执行连接来实现。

可以通过分解来完成转置(有关转置数据框的更多详细信息,请单击此处):

from pyspark.sql import functions as F

kvs = F.explode(F.array([
        F.struct(F.lit(c).alias('key'), F.columm(c).alias('value')) for c in ['CustomerValue1', 'CustomerValue2']
      ])).alias('kvs')

dft1 = (df1.select(['CustomerID', kvs])
        .select('CustomerID', F.column('kvs.name').alias('column_name'), F.column('kvs.value').alias('column_value'))
        )
dft2 = (df2.select(['CustomerID', kvs])
        .select('CustomerID', F.column('kvs.name').alias('column_name'), F.column('kvs.value').alias('column_value'))
        )

其中dft1dft2

dft2 = (dft2.withColumnRenamed('CustomerID', 'CustomerID2')
        .withColumnRenamed('column_value', 'column_value2')
       )
cosine = (dft1.join(dft2, dft1.column_name = dft2.column_name)
          .groupBy('CustomerID' , 'CustomerID2')
          .agg(F.sum(F.column('column_value')*F.column('column_value2')).alias('cosine_similarity'))
         )

现在,在< code>cosine中有三列:来自第一个和第二个数据帧的CustomerID以及余弦相似性(假设这些值首先被标准化)。这样做的好处是,您只有具有非零相似性的CustomerID对的行(在某些CustomerID的值为零的情况下)。举个例子:

DF1:

CustomerID CustomerValue CustomerValue2
12         .17           .08

df2:

CustomerID CustomerValue CustomerValue
15         .17           .14
16         .40           .43
18         .86           .09

余弦:

CustomID CustomID2 cosine_similarity
12       15        .0401
12       16        .1024
12       18        .1534

当然,这些还不是真正的余弦相似之处,您需要先对值进行规范化。您可以通过以下方式对组执行此操作:

(df.groupBy('CustomerID')
 .agg(F.sqrt(F.sum(F.column('column_value')*F.column('column_value'))).alias('norm'))
 .select('CustomerID', F.column('column_name'), (F.column('column_value')/F.column('norm')).alias('column_value_norm'))
)

归一化列后,余弦相似性如下:

CustomID CustomID2 cosine_similarity
12       15        .970
12       16        .928
12       18        .945

较大的相似性值是由于低维(仅两个组件)。

 类似资料:
  • 问题内容: 我计算了两个文档的tf / idf值。以下是tf / idf值: 这些文件就像: 如何使用这些值来计算余弦相似度? 我知道我应该计算点积,然后找到距离并除以点积。如何使用我的值来计算? 还有一个问题: 两个文档的字数相同是否重要? 问题答案: a * b是点积 一些细节: 是。在某种程度上,a和b必须具有相同的长度。但是a和b通常具有稀疏表示,您只需要存储非零条目,就可以更快地计算范数

  • 我有一个PySpark数据帧,df1,看起来像: 我有第二个PySpark数据帧,df2 我想将df1的所有列(我有两列以上)与客户ID上的df2连接值相乘

  • 我有一个PySpark数据帧,df1,看起来像: 我想得到两个数据帧的余弦相似性。并有类似的东西 我有一个python函数,它接收数字/数字数组,如下所示: 如何使用udf在我的数据帧中创建余弦_sim列?可以传递几列而不是一列给udf余弦_sim函数吗?

  • 问题内容: 我有一个数据集,其中包含工人及其年龄,性别,地址等人口统计信息及其工作地点。我从数据集创建了一个RDD,并将其转换为DataFrame。 每个ID有多个条目。因此,我创建了一个DataFrame,其中仅包含工人的ID和他/她工作过的各个办公室位置。 我想根据他们的办公地点来计算每个工人与其他每个工人之间的余弦相似度。 因此,我遍历了DataFrame的各行,从DataFrame检索了一

  • 问题内容: 如何找到向量之间的余弦相似度? 我需要找到相似性来衡量两行文本之间的相关性。 例如,我有两个句子: 用户界面系统 用户界面机 …及其在tF-idf之后的向量,然后使用LSI进行标准化,例如 和。 如何测量这些向量之间的相似性? 问题答案: 我最近在大学的信息检索部门做了一些tf-idf的工作。我使用了这种余弦相似度方法,该方法使用Jama:Java Matrix Package 。 有

  • 我试图用余弦相似性来找出两个文本文件的相似性。当我提供文本时,我可以发现这一点。但我想在阅读完电脑中的文本文件后得到结果。