VHRanger/nodevectors

(目前能找到單機效能最高並且不要求GPU的graph embedding library了,不過可惜沒有實現全。。。不過話說目前graph embedding的library就沒有實現全的;graphvite號稱直接透過cuda來寫graph embedding的邏輯,但是他們家的library我一直沒能裝上。。。)

1、link prediction:透過移除graph中的部分edges,然後我們去預測被移除了edge的兩個節點是否存在edges,這樣就把問題轉化為一個二分類問題了,可以使用邏輯迴歸或者lightgbm來完成,具體的做法就是:

(1)存在edge的兩個節點對為正樣本,標籤為1;

(2)不存在edges的兩個節點為負樣本,標籤為0,這裡的問題在於我們如何選擇,簡單的做法就是graph上仍以兩個節點進行組合成node pairs,然後存在edge的node pairs移除,剩下不存在的就都是負樣本了;但是這樣構造出來的node pairs會非常多,比如100個節點,則有100*(100-1)=9900種組合,針對這種情況,合適的做法就是隨機取樣了,取樣一部分負樣本即可;這裡的取樣策略可以是簡單隨機 或者根據節點的度 加權度等方式進行有偏取樣

最後我們可以透過auc、f1score等方式來評估;

這種方法對標籤沒有依賴性,最靈活;

2、圖聚類(在帶有社群/聚類標籤的圖形上),我們在graph embedding結果上使用分層的聚類聚類,並測量graph embeding的聚類結果與網路中實際社群的重疊。

選擇分層的層次聚類是因為它是確定性的,並且對聚類形狀或縮放或嵌入度量空間不敏感

。我們用RAND指數,相互資訊得分和Fowlkes-Mallows得分來測量重疊(這些也是常規的無監督聚類裡使用的評估指標)。這類方法需要具有社群的標籤,即哪些節點屬於一個社群,將graph embedding的分層聚類結果與社群標籤做比較,如果沒有社群標籤可以考慮使用社群發現演算法來計算社群標籤;

3、直接對標下游任務,這種適用於存在較多標籤的情況,即每一個節點都有標籤存在,那麼graph embedding之後,embedding的結果對應的就是原始節點的標籤了,此時我們可以根據下游任務的評估指標來判定embedding的效果,這也是針對下游任務最好的度量方式,不過需要大量的已知標籤的支援,並且涉及到上游embedding和下游模型訓練兩個過程,時間開銷較大。