Pyspark 计算 RDD 中所有向量之间的自定义距离

Posted

技术标签:

【中文标题】Pyspark 计算 RDD 中所有向量之间的自定义距离【英文标题】:Pyspark calculate custom distance between all vectors in a RDD 【发布时间】:2017-03-07 22:10:13 【问题描述】:

我有一个由密集向量组成的 RDD,其中包含如下概率分布

[DenseVector([0.0806, 0.0751, 0.0786, 0.0753, 0.077, 0.0753, 0.0753, 0.0777, 0.0801, 0.0748, 0.0768, 0.0764, 0.0773]),
 DenseVector([0.2252, 0.0422, 0.0864, 0.0441, 0.0592, 0.0439, 0.0433, 0.071, 0.1644, 0.0405, 0.0581, 0.0528, 0.0691]),
 DenseVector([0.0806, 0.0751, 0.0786, 0.0753, 0.077, 0.0753, 0.0753, 0.0777, 0.0801, 0.0748, 0.0768, 0.0764, 0.0773]),
 DenseVector([0.0924, 0.0699, 0.083, 0.0706, 0.0766, 0.0708, 0.0705, 0.0793, 0.09, 0.0689, 0.0758, 0.0743, 0.0779]),
 DenseVector([0.0806, 0.0751, 0.0785, 0.0753, 0.077, 0.0753, 0.0753, 0.0777, 0.0801, 0.0748, 0.0768, 0.0764, 0.0773]),
 DenseVector([0.0806, 0.0751, 0.0786, 0.0753, 0.077, 0.0753, 0.0753, 0.0777, 0.0801, 0.0748, 0.0768, 0.0764, 0.0773])

我想计算一个向量和所有其他向量之间的相似性,并将结果存储在一个矩阵中。

我可以将完整的 RDD 转换为矩阵,然后获取每一行并计算与所有其他行的距离。我想知道是否有更有效的方法来使用 pyspark RDD 方法。

【问题讨论】:

【参考方案1】:

据我所知,没有用于在行之间进行余弦相似性的函数。所以你必须有点棘手才能到达你想要的地方。

首先使用rdd.cartesian(rdd) 以列格式创建行对,这将成对匹配所有行。接下来,您将需要定义一个余弦相似度函数并将其映射到 rdd。最后,将结果转换为 np.array 并重塑为 6x6。

例子:

def cos_sim(row):
    dot_product = row[0].dot(row[1])
    norm_a = np.sqrt(np.sum(row[0] * row[0]))
    norm_b = np.sqrt(np.sum(row[1] * row[1]))
    sim = dot_product / (norm_a * norm_b)
    return sim

rdd2 = rdd.cartesian(rdd)
cosine_similarities = rdd2.map(lambda x: cos_sim(x)).collect()
cosine_similariteis = np.array(cosine_similarities).reshape((6,6))

【讨论】:

谢谢。这会很有帮助,但会是一项繁重的任务。无论如何,我应该以其他方式表示数据以使任务更简单。

以上是关于Pyspark 计算 RDD 中所有向量之间的自定义距离的主要内容,如果未能解决你的问题,请参考以下文章

python - 如何将密集向量的RDD转换为pyspark中的DataFrame?

计算 PySpark DataFrame 列的模式?

PySpark:将 RDD 转换为数据框中的列

计算每个 pyspark RDD 分区中的元素数

在 python (pyspark) 中使用 combinebykey spark rdd 计算组上的聚合

pyspark RDD countByKey() 如何计算?