2016-04-19 3 views
1

Ich habe eine RDD von model.productFeatures(), die eine RDD in Form von (id, array("d", (...))) zurückgibt. Zum Beispiel:Wie korreliert man alle Kombinationen von Arrays in einer RDD?

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

würde Ich mag die paarweisen Korrelation zwischen jedem Array berechnen, kehrt dann für jeden id eine andere id deren Anordnung hat die höchste Korrelation.

+0

Hey, ich bin nicht zu verstehen, die Mathematik ein Teil davon kann Sie erklären es in Laiensprache. – Vishnu667

Antwort

1

Das erste, was Sie brauchen, ist, alle Paare von Elementen zu bekommen, außer der "Diagonale", wo sie gleich sind.

>>> 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])))] 

Dann eine Funktion, um die Korrelation zu berechnen und neu anzuordnen, um sich auf den letzten Schritt vorzubereiten. Nehmen wir an, mit "Korrelation" meinen Sie, was von numpy.correlate gemacht wird.

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))] 

Um die zweite ID mit der maximalen Korrelation mit jedem ersten ID zu erhalten, können Sie reduceByKey verwenden und immer die größere:

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))] 
Verwandte Themen