一對一般性有標籤圖(Graph)的相似度函數

計算兩個Graph的相似性指數,這問題其實就是把高階的張量用一種映射成爲一個標量,來提取差異信息。

提取完美結構差異信息是個NP難問題。在多項式時間內有各種不同的映射方法,可獲得不完全信息的近似解。

高階張量映射成標量,也可以說是降維。把高維信息可以有不同的投影方式投影,完成降維。每種投影都是不完全信息,對應一種網絡特徵。一個好的投影方式可以獲得儘可能全面的信息。

我在此給出了一種相似度函數的實現。源碼放在GitHub上,GitHub - fsssosei/similarity_index_of_label_graph: This is the package used to calculate the similarity index of the label graph pairs.

簡單的說是兩個步驟:

1. 先把兩個圖(Graph)向量化,也就是“圖嵌入向量”;

2. 再對兩個向量進行度量計算,得到最終結果。

對於步驟一,我選擇了一種有關平均最短路徑長度的核,是基於點向量(Node embedding)的方法。

在完成步驟一,對Graph的變換後得到兩個向量。

然後在步驟二中我選用了pearson相關係數爲基礎的度量函數(直接pearson相關係數對一些特徵向量無法區分,所以增加了特別的處理步驟,有效的細分映射特徵),來對兩個向量做度量,得到最終的標量值。

這整個算法的時間複雜度是 O(V^2*log(V)+VE)。

已經發布到了PyPI上,可以很方便的安裝分發:

pip install similarity-index-of-label-graph

similarity_index_of_label_graph包是很易用的。

先在程序裏導入:

from similarity_index_of_label_graph_package import similarity_index_of_label_graph_class

再創建一個這個類的實例對象:

similarity_index_of_label_graph = similarity_index_of_label_graph_class()

然後就可以調用此實例對象:

similarity_index_of_label_graph(G1, G2)

對兩個圖計算了。

我把這個實現寫成一個類,而不是一個函數,是爲了可以很方便替換掉任意一個步驟裏所用的方法。

比如步驟一里可以用隨機漫步核替換,步驟二里可以用energy距離替換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章