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

Cha*_*hao 1 pyspark apache-spark-mllib

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

1 - spatial.distance.cosine(xvec, yvec)
Run Code Online (Sandbox Code Playgroud)

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

Psi*_*dom 6

你可以使用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
Run Code Online (Sandbox Code Playgroud)

随着scipy:

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

cosine(x, y)
# 0.0028235350472619603
Run Code Online (Sandbox Code Playgroud)

  • @Psidom 为什么我不能将它应用于整个向量类型的列?像这样的东西`df_new = df_with_vectors.select("vector1", "vector2", "vector1.dot(vector2)/(vector1.norm(2)*vector2.norm(2)) as norm_src")`给出了一个错误`需要结构类型但得到了向量`。 (5认同)