PySpark中如何计算两个向量的余弦相似度?

Posted

技术标签:

【中文标题】PySpark中如何计算两个向量的余弦相似度?【英文标题】:How to calculate the cosine similarity of two vectors in PySpark? 【发布时间】:2017-10-15 03:34:15 【问题描述】:

我即将在 PySpark 中计算两个向量的余弦相似度,比如

1 - spatial.distance.cosine(xvec, yvec)

但 scipy 似乎不支持 pyspark.ml.linalg.Vector 类型。

【问题讨论】:

【参考方案1】:

您可以使用dotnorm 方法轻松计算:

from pyspark.ml.linalg import Vectors
x = Vectors.dense([1,2,3])
y = Vectors.dense([2,3,5])

1 - x.dot(y)/(x.norm(2)*y.norm(2))
# 0.0028235350472619603

使用 scipy

from scipy.spatial.distance import cosine
​
x = np.array([1,2,3])
y = np.array([2,3,5])

cosine(x, y)
# 0.0028235350472619603

【讨论】:

@Psidom 为什么我不能将它应用于整个向量类型的列?像df_new = df_with_vectors.select("vector1", "vector2", "vector1.dot(vector2)/(vector1.norm(2)*vector2.norm(2)) as norm_src") 这样的东西会给出need struct type but got vector 的错误。

以上是关于PySpark中如何计算两个向量的余弦相似度?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算两个向量的余弦相似度?

Spark笔记(1) :余弦相似度计算

Java根据余弦定理计算文本相似度

智能推荐算法基础-余弦相似度计算

计算两个向量的余弦相似度

计算两个向量的余弦相似度