2016-04-22 240 views
2

我有一個非常大的圖。節點之間有鏈接。最初每個邊都有重量1。我必須根據變換後的鄰接矩陣更新邊的權重。如何根據鄰接矩陣有效更新權重?

enter image description here

其中A是Adjcency矩陣。節點(i,j)中的新權重將由M(i,j)給出。

我必須在Graphx中執行此操作。我如何做到這一點?

我的方法:找到每個節點的所有相鄰節點,並在內部加入them.in對。然後更新每個節點的權重。

但我對在Graphx中編寫高效的代碼感到困惑。 我該怎麼做呢?代碼捕捉是讚賞。

+1

除了「給我代碼」之外,你真正的問題是什麼? –

+0

當你打開我們的代碼時,我們是否可以在課堂上分享'A'? –

+0

爲什麼它需要是graphx? – eliasah

回答

2

有關使用GraphX高效處理稀疏矩陣的示例,請參閱GraphX的SVD ++實現的源代碼。

https://github.com/apache/spark/blob/branch-1.6/graphx/src/main/scala/org/apache/spark/graphx/lib/SVDPlusPlus.scala

基本上,它只是使用aggregateMessages(),所以在每鄰接矩陣的非零條目一個消息被髮送到鄰近的頂點 - 從而避免即使考慮(加工)的零值鄰接矩陣的條目。

EDIT(附加信息):

首先,你要準備什麼是會得到存儲在每個頂點,也是你要如何收集這些信息來產生M(I,J)在結束。請注意分母中的兩個規範,| A(:,i)|和| A(:,j)|被反覆使用。如果圖中有n個頂點(也就是說,如果A是一個n×n矩陣),那麼即使存在n(A,i), s來計算。對於每個頂點i來說,一個好的計劃是存儲兩個向量(例如,在兩個數組[2]的Tuple2中):| A(:,i)|和[,...,](稱之爲Vi)。然後在最後,你將通過從你的graph.vertices()中提取這些信息來計算M,並將它合併爲M來生成M(012)。簡單。對於每個頂點i,這只是入站邊的數量。 (要看到這一點,請考慮A是一個鄰接矩陣並繪製圖表意味着什麼。)

Vi有點複雜,但並不過分。首先,對於每個頂點,我們需要提出一個向量,而不僅僅是像我們爲| A(:,i)|所做的一樣。並且該長度爲n的矢量的每個分量都將需要多達潛在的n個輸入。回想一下鄰接矩陣背後的含義,爲了計算Vi的第j個分量(也就是n個乘積的和),我們只需要在某個頂點k有一個邊的時候添加一個1我和j。因此,您可以採用的方法是連續兩次使用aggregateMessages:沿着邊緣向後傳輸相鄰頂點。要使用一些非常鬆散的術語:首先從j個頂點到k個頂點,然後從k個頂點到i個頂點。這樣,每個頂點都在兩跳內知道所有鄰居(如果A稀疏,每個頂點都可以累積那麼多信息)。這將允許你計算Vi。

+0

感謝您的回覆。當我想更新邊的權重時,聚合消息有效。但是我想計算公式中所示的兩列鄰接矩陣的餘弦並更新相應的權重。那麼我如何實現這一目標呢? – Amnesiac

+0

更新了我的回答,以概述可能的具體方法。 –