計算兩個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距離替換。