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】:您可以使用dot
和norm
方法轻松计算:
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中如何计算两个向量的余弦相似度?的主要内容,如果未能解决你的问题,请参考以下文章