2016-04-19 5 views
1

私はからのRDDを持っていて、(id, array("d", (...)))という形でRDDを返します。例えば:RDD内のすべての配列の組み合わせを関連付ける方法は?

(1, array("d", (0, 1, 2))) 
(2, array("d", (4, 3, 2))) 
(3, array("d", (5, 3, 0))) 
... 

Iは、次いで、各アレイとの間のペアワイズ相関を計算し、各idそのアレイ最も高い相関を有する別idため戻りたいです。

+0

私はそれの数学一部をすることができます理解していませんよねえあなたは素人の言葉でそれを説明します。 – Vishnu667

答えて

1

最初に必要なのは、同じ場所にある「対角線」を除いて、すべての要素のペアを取得することです。

>>> rdd.cartesian(rdd).filter(lambda (x, y): x != y).collect() 
[((1, array('d', [0.0, 1.0, 2.0])), (2, array('d', [4.0, 3.0, 2.0]))),  
((1, array('d', [0.0, 1.0, 2.0])), (3, array('d', [5.0, 3.0, 0.0]))), 
((2, array('d', [4.0, 3.0, 2.0])), (1, array('d', [0.0, 1.0, 2.0]))), 
((3, array('d', [5.0, 3.0, 0.0])), (1, array('d', [0.0, 1.0, 2.0]))), 
((2, array('d', [4.0, 3.0, 2.0])), (3, array('d', [5.0, 3.0, 0.0]))), 
((3, array('d', [5.0, 3.0, 0.0])), (2, array('d', [4.0, 3.0, 2.0])))] 

次に、相関を計算し、最後のステップに備えて並べ替える機能。 「相関」とは、numpy.correlateによって行われることを意味しているとしましょう。

def corr_pair(((id1, a1), (id2, a2))): 
    return id1, (id2, np.correlate(a1, a2)[0]) 

>>> rdd.cartesian(rdd).filter(lambda (p1, p2): p1 != p2).map(corr_pair).collect() 
[(1, (2, 7.0)), (1, (3, 3.0)), (2, (1, 7.0)), (3, (1, 3.0)), (2, (3, 29.0)), (3, (2, 29.0))] 

各第一IDとの最大の相関と第二のIDを取得するには、あなたがreduceByKeyを使用し、常に1より大きくしておくことができます。

def keep_higher((id1, c1), (id2, c2)):  
    if c1 > c2: 
     return id1, c1 
    else: 
     return id2, c2 

>>> rdd.cartesian(rdd).filter(lambda (x, y): x != y).map(corr_pair).reduceByKey(keep_higher).collect() 
[(1, (2, 7.0)), (2, (3, 29.0)), (3, (2, 29.0))] 
関連する問題