2017-03-07 126 views
1

所有向量之間的自定義距離我有一個RDD選自包含如下Pyspark計算在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方法來實現這一點。

回答

0

據我所知,沒有一個功能可以在行之間進行餘弦相似。所以你必須有點棘手才能到達你想要的地方。

首先使用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)) 
+0

謝謝。這會有所幫助,但是這會是一項緊迫的任務。無論如何,我應該代表數據來使任務更簡單。 – user2825083