使用DeepWalk從圖中提取特徵

2020-12-11 人工智慧遇見磐創

目錄

數據的圖示不同類型的基於圖的特徵 節點屬性 局部結構特徵 節點嵌入DeepWalk簡介在Python中實施DeepWalk以查找相似的Wikipedia頁面數據的圖示

當你想到「網絡」時,會想到什麼?通常是諸如社交網絡,網際網路,已連接的IoT設備,鐵路網絡或電信網絡之類的事物。在圖論中,這些網絡稱為圖

網絡是互連節點的集合。節點表示實體,它們之間的連接是某種關係。

例如,我們可以用圖的形式表示一組社交媒體帳戶:

節點是用戶的數字檔案,連接表示他們之間的關係,例如誰跟隨誰或誰與誰是朋友。

圖的用例不僅限於社交媒體!我們還可以使用圖和網絡表示其他類型的數據(並且在本文中我們將介紹一個獨特的行業用例)。

為什麼我們將數據表示為圖?

為什麼不僅僅使用典型的數據可視化技術來可視化數據?為什麼要更複雜並學習新概念?下面我們會給出答案。

圖數據集和資料庫可幫助我們應對在處理結構化數據時面臨的若干挑戰。這就是為什麼當今的主要科技公司,例如Google,Uber,Amazon和Facebook使用某種形式的圖的原因。

讓我們以一個例子來理解為什麼圖是數據的重要表示形式。看下圖:

這是一小部分Facebook用戶(a, B, C, D, E, F, G)的數據集。圖像的左半邊包含這個數據的表格形式。每一行代表一個用戶和他/她的一個朋友。

右半部分包含代表同一組用戶的圖。該圖的邊緣告訴我們,連接的節點是Facebook上的朋友。現在,讓我們解決一個簡單的查詢:

「找到用戶A的朋友和用戶A朋友的朋友。」

查看表格數據和上面的圖。哪種數據形式更適合回答此類查詢?

使用圖來解決該問題要容易得多,因為我們只需要遍歷從節點A長度為2的路徑(ABC和ADF),即可找到朋友和朋友的朋友。

因此,圖可以輕鬆捕獲節點之間的關係,這在常規數據結構中是一項艱巨的任務。現在,讓我們看看使用圖可以解決什麼樣的問題。

基於圖的特徵的不同類型

為了解決上述問題,我們無法將圖直接提供給機器學習模型。我們必須首先從中創建特徵,然後模型將使用這些特徵。

此過程類似於我們在自然語言處理(NLP)或計算機視覺中所做的過程。我們首先從文本或圖像中提取數字特徵,然後將這些特徵作為輸入提供給機器學習模型:

從圖中提取的特徵可以大致分為三類:

節點屬性:我們知道圖中的節點代表實體,並且這些實體具有自己的特徵屬性。我們可以將這些屬性用作每個節點的特徵。例如,在航空公司航線網絡中,節點將代表機場。這些節點將具有飛機容量,航站樓數量,著陸區等特徵。2.局部結構特點:節點的度(相鄰節點的數量),相鄰節點的平均度,一個節點與其他節點形成的三角形數,等等。節點嵌入:上面討論的特徵僅包含與節點有關的信息。它們不捕獲有關節點上下文的信息。在上下文中,我指的是周圍的節點。節點嵌入通過用固定長度向量表示每個節點,在一定程度上解決了這個問題。這些向量能夠捕獲有關周圍節點的信息(上下文信息)

用於學習節點嵌入的兩個重要的現代算法是DeepWalkNode2Vec。在本文中,我們將介紹並實現DeepWalk算法。

DeepWalk簡介

要了解DeepWalk,重要的是要正確理解詞嵌入及其在NLP中的使用方式。我建議在下面的文章中仔細閱讀Word2Vec的解釋:https://www.analyticsvidhya.com/blog/2019/07/how-to-build-recommendation-system-word2vec-python/?utmsource=blog&utmmedium=graph-feature-extraction-deepwalk

為了將事物置於上下文中,詞嵌入是文本的向量表示形式,它們捕獲上下文信息。讓我們看看下面的句子:

我乘巴士孟買我乘火車去孟買粗體字(公共汽車和火車)的向量將非常相似,因為它們出現在相同的上下文中,即粗體文本之前和之後的詞。該信息對於許多NLP任務非常有用,例如文本分類,命名實體識別,語言建模,機器翻譯等等。

我們還可以在每個節點的圖中捕獲此類上下文信息。但是,為了學習NLP空間中的詞嵌入,我們將句子提供給Skip-gram模型(淺層神經網絡)。句子是按一定順序排列的單詞序列。

因此,要獲得節點嵌入,我們首先需要安排圖中的節點序列。我們如何從圖中獲得這些序列?有一項針對該任務的技術稱為隨機遊走。

什麼是隨機遊走?

隨機遊走是一種從圖中提取序列的技術。我們可以使用這些序列來訓練一個skip-gram模型來學習節點嵌入。

讓我說明一下隨機遊走的工作原理。讓我們考慮下面的無向圖:

我們將在該圖上應用隨機遊走並從中提取節點序列。我們將從節點1開始,並覆蓋任意方向的兩條邊:

從節點1,我們可以轉到任何連接的節點(節點3或節點4)。我們隨機選擇了節點4。現在再次從節點4開始,我們不得不隨機選擇前進的方向。我們將轉到節點5。現在我們有3個節點的序列:[節點1 –節點4 –節點5]。

讓我們生成另一個序列,但是這次是從另一個節點生成的:

讓我們選擇節點15作為原始節點。從節點5和6,我們將隨機選擇節點6。然後從節點11和2,我們選擇節點2。新序列為[節點15 –節點6 –節點2]。

我們將對圖中的每個節點重複此過程。這就是隨機遊走技術的工作原理。

在生成節點序列之後,我們必須將它們提供給一個skip-gram模型以獲得節點嵌入。整個過程被稱為Deepwalk。

在下一節中,我們將在Wikipedia文章網絡上從頭開始實施DeepWalk。

在Python中實施DeepWalk以查找相似的Wikipedia頁面

我們將使用Wikipedia文章圖,並使用DeepWalk從中提取節點嵌入。然後,我們將使用這些嵌入來查找相似的Wikipedia頁面。

我們不會觸及這些文章中的任何文本。我們的目標是純粹基於圖的結構來計算頁面之間的相似度。

但是,等等。我們如何以及在何處獲得Wikipedia圖數據集?Seealsology這個出色的工具將為我們提供幫助。這有助於我們從任何Wikipedia頁面創建圖。你甚至可以提供多個Wikipedia頁面作為輸入。這是該工具的屏幕截圖:

如果一個頁面連結到另一個頁面,就會有一個圖表示兩個頁面之間的聯繫。

看看在Seealsology中該圖的形成方式。值得一看:https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2019/11/graphbuildup.mp4?=1

圖中的節點非常接近,並不一定意味著它們在語義上相似。因此,需要在向量空間中表示這些節點,我們可以在其中識別相似的節點。

當然,我們可以使用其他方法來完成此任務。例如,我們可以解析這些節點(Wikipedia頁面)中的所有文本,並在詞嵌入的幫助下用向量表示每個頁面。然後,我們可以計算這些向量之間的相似度以找到相似的頁面。但是,這種基於NLP的方法存在一些缺點:

如果有數百萬個節點,那麼我們需要大量的計算能力來解析文本並從所有這些節點或頁面中學習詞嵌入這種方法不會捕獲這些頁面之間連接的信息。例如,一對直接連接的頁面可能比一對間接連接的頁面具有更強的關係這些缺點可以通過圖和節點嵌入輕鬆解決。因此,一旦你的圖準備就緒,就可以從Seealsology下載TSV文件。在此文件中,每一行都是一對節點。我們將使用此數據來重構圖,並在其上應用DeepWalk算法以獲得節點嵌入。

導入所需的Python庫

import networkx as nximport pandas as pdimport numpy as npimport randomfrom tqdm import tqdmfrom sklearn.decomposition import PCAimport matplotlib.pyplot as plt%matplotlib inline加載數據集

你可以從這裡下載.tsv文件:https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2019/11/space_data.zip

df = pd.read_csv("space_data.tsv", sep = "\t")df.head()Output:

目標都包含Wikipedia實體。對於所有行,目標實體在源實體的Wikipedia頁面有其超連結。

構造圖

G = nx.from_pandas_edgelist(df, "source", "target", edge_attr=True, create_using=nx.Graph())讓我們檢查圖中的節點數:

len(G)Output: 2088

我們將處理2,088個Wikipedia頁面。

隨機遊走

在這裡,我定義了一個函數,將節點和被遍歷的路徑的長度作為輸入。它將從指定的輸入節點以隨機的方式穿過連接節點。最後,它將返回遍歷節點的順序:

def get_randomwalk(node, path_length): random_walk = [node] for i in range(path_length-1): temp = list(G.neighbors(node)) temp = list(set(temp) - set(random_walk)) if len(temp) == 0: break random_node = random.choice(temp) random_walk.append(random_node) node = random_node return random_walk讓我們來試試節點「space exploration」這個函數:

get_randomwalk('space exploration', 10)輸出

在這裡,我已指定要遍歷的長度為10。你可以更改此數字並進行操作。接下來,我們將捕獲數據集中所有節點的隨機遊走序列:

# 從圖獲取所有節點的列表all_nodes = list(G.nodes())random_walks = []for n in tqdm(all_nodes): for i in range(5): random_walks.append(get_randomwalk(n,10))# 序列個數len(random_walks)輸出: 10,440

因此,將遍歷長度設置為10,我們得到了10,440個節點的隨機遊動序列。我們可以將這些序列用作skip-gram模型的輸入,並提取該模型學習到的權重。

from gensim.models import Word2Vecimport warningswarnings.filterwarnings('ignore')DeepWalk

接下來,我們將使用隨機遊走訓練skip-gram模型:

# 訓練skip-gram (word2vec)模型model = Word2Vec(window = 4, sg = 1, hs = 0, negative = 10, # 負採樣 alpha=0.03, min_alpha=0.0007, seed = 14)model.build_vocab(random_walks, progress_per=2)model.train(random_walks, total_examples = model.corpus_count, epochs=20, report_delay=1)現在,圖中的每個節點都由固定長度(100)的向量表示。讓我們找出與「space tourism」最相似的頁面:

model.similar_by_word('space tourism')輸出:

很有趣!所有這些頁面都是與民用太空旅行相關的主題。可以為其他實體提取類似的節點。

現在,我想看看我們的節點嵌入如何捕獲不同節點之間的相似性。我已經從圖中挑選了一些節點,並將它們繪製在二維空間中:

terms = ['lunar escape systems','soviet moonshot', 'soyuz 7k-l1', 'moon landing','space food', 'food systems on space exploration missions', 'meal, ready-to-eat','space law', 'metalaw', 'moon treaty', 'legal aspects of computing','astronaut training', 'reduced-gravity aircraft', 'space adaptation syndrome', 'micro-g environment']下面我定義了一個函數,該函數將在二維空間中繪製所選節點的向量:

def plot_nodes(word_list): X = model[word_list] # 減少維度為2 pca = PCA(n_components=2) result = pca.fit_transform(X) plt.figure(figsize=(12,9)) # 創建一個散點圖的投影 plt.scatter(result[:, 0], result[:, 1]) for i, word in enumerate(word_list): plt.annotate(word, xy=(result[i, 0], result[i, 1])) plt.show()讓我們繪製選定的節點:

plot_nodes(terms)輸出

看起來不錯!如你所見,相似的Wikipedia實體被分組在一起。例如,「soviet moonshot」,「soyuz 7k-l1」,「moon landing」和「lunar escape systems」都嘗試登陸月球。

這就是為什麼DeepWalk嵌入如此有用的原因。我們可以使用這些嵌入來解決與圖相關的多個問題,例如連結預測,節點分類,問題解答系統等等。

請執行下面的代碼。它會產生隨機遊走序列和獲取類似的節點使用DeepWalk一個輸入節點。

# importing required librariesimport pandas as pdimport networkx as nximport numpy as npimport randomfrom tqdm import tqdmfrom sklearn.decomposition import PCAimport pprintfrom gensim.models import Word2Vecimport warningswarnings.filterwarnings('ignore')# read the datasetdf = pd.read_csv("space_data.tsv", sep = "\t")print(df.head())G = nx.from_pandas_edgelist(df, "source", "target", edge_attr=True, create_using=nx.Graph())G = nx.from_pandas_edgelist(df, "source", "target", edge_attr=True, create_using=nx.Graph())print('The number of nodes in pur graph: ',len(G))def get_randomwalk(node, path_length): random_walk = [node] for i in range(path_length-1): temp = list(G.neighbors(node)) temp = list(set(temp) - set(random_walk)) if len(temp) == 0: break random_node = random.choice(temp) random_walk.append(random_node) node = random_node return random_walkprint('\n\nRandom sequence of nodes generated from Random Walk\n\n')while True: first_node = input("Enter name of first node (for example 'space exploration') : ") if len(first_node) > 0: breakpprint.pprint(get_randomwalk(first_node, 10))# 從圖中獲取所有節點的列表all_nodes = list(G.nodes())random_walks = []for n in tqdm(all_nodes): for i in range(5): random_walks.append(get_randomwalk(n,10))# 序列長度len(random_walks)# 訓練skip-gram (word2vec)模型model = Word2Vec(window = 4, sg = 1, hs = 0, negative = 10, # 負採樣 alpha=0.03, min_alpha=0.0007, seed = 14)model.build_vocab(random_walks, progress_per=2)model.train(random_walks, total_examples = model.corpus_count, epochs=20, report_delay=1)print('\n\n Get similar nodes\n\n')while True: any_node = input("Enter name of any node (for example 'space toursim') : ") if len(any_node) > 0: breakpprint.pprint(model.similar_by_word(any_node))結尾

我真的很喜歡在本文中探索DeepWalk中的圖形數據,我迫不及待地想嘗試其他圖形算法。在接下來的幾周裡,繼續關注這個系列吧!

完整代碼:https://github.com/prateekjoshi565/DeepWalk。

相關焦點

  • DeepWalk:圖網絡與NLP的巧妙融合
    enjoy~TL;DRDeepWalk是首次將深度學習技術(無監督學習)引入到網絡分析(network analysis)中的工作,它的輸入是一個圖,最終目標就是獲得網絡圖中每個結點的向量表示 如下所示是論文中給出的Karate network例子。
  • 圖神經網絡-圖遊走算法核心代碼DeepWalk實現
    本文主要涉及圖遊走算法DeepWalk的代碼實現。1.
  • 神經網絡圖的簡介(基本概念,DeepWalk以及GraphSage算法)
    在節點分類問題中,每個節點v都可以用其特徵x_v表示並且與已標記的標籤t_v相關聯。給定部分標記的圖G,目標是利用這些標記的節點來預測未標記的節點標籤。 它通過學習得到每個節點的d維向量(狀態)表示h_v,同時包含其鄰居的信息。
  • 網絡表達學習系列(一):深度遊走(Deepwalk)
    網絡表達學習的目標是將一個複雜網絡中的結點和邊的信息都通過向量來表達,我們通過算法可以學習出這些向量,因此這些向量中包含著網絡的結構信息。學習得到的向量可以作為圖的特徵用在基於圖的各種任務上,比如連接預測,節點分類,社區發現以及可視化等問題上。網絡表達學習本質上是將網絡進行降維從而更好地利用其它模型來處理網絡數據。
  • 【Graph Embedding】DeepWalk算法原理,實現和應用
    圖表示學習我們都知道在數據結構中,圖是一種基礎且常用的結構。現實世界中許多場景可以抽象為一種圖結構,如社交網絡,交通網絡,電商網站中用戶與物品的關係等。目前提到圖算法一般指:1. 經典數據結構與算法層面的:最小生成樹 (Prim,Kruskal,...) ,最短路 (Dijkstra,Floyed,...)
  • ORB特徵提取
    ORB算法對FAST和BRIEF的改進包括:提出一種基於學習的降低BRIEF特徵描述子相關性的方法,得到可區分性更好的rBRIEFT特徵描述子2 oFAST:Oriented FASTORB使用FAST算法檢測鍵關點,論文中使用FAST-9得到了很好的效果。
  • 如何使用特徵提取技術降低數據集維度
    如果這些特徵數量與數據集中存儲的觀察值數量相差無幾(或者前者比後者更多)的話,很可能會導致機器學習模型過度擬合。為避免此類問題的發生,需採用正則化或降維技術(特徵提取)。在機器學習中,數據集的維數等於用來表示它的變量數。
  • 庖丁解牛,原來CNN是這樣提取圖像特徵的!
    答案當然是圖像特徵了。將一張圖像看做是一個個像素值組成的矩陣,那麼對圖像的分析就是對矩陣的數字進行分析,而圖像的特徵,就隱藏在這些數字規律中。深度學習對外推薦自己的一個很重要的點——深度學習能夠自動提取特徵。本文主要介紹卷積層提取特徵的原理過程,文章通過幾個簡單的例子,展示卷積層是如何工作的,以及概述了反向傳播的過程,將讓你對卷積神經網絡CNN提取圖像特徵有一個透徹的理解。
  • 圖像特徵提取三大法寶:HOG特徵,LBP特徵,Haar特徵
    則一塊的特徵數為:3*3*9;(5)收集HOG特徵最後一步就是將檢測窗口中所有重疊的塊進行HOG特徵的收集,並將它們結合成最終的特徵向量供分類使用。(6)那麼一個圖像的HOG特徵維數是多少呢?圖 2.5 給出了求取旋轉不變的 LBP 的過程示意圖,圖中算子下方的數字表示該算子對應的 LBP值,圖中所示的 8 種 LBP模式,經過旋轉不變的處理,最終得到的具有旋轉不變性的 LBP值為 15。也就是說,圖中的 8種 LBP 模式對應的旋轉不變的 LBP模式都是00001111。
  • 三種用Python從圖像數據中提取特徵的技術
    2.在Python中讀取圖像數據3.從圖像數據中提取特徵的方法#1:灰度像素值特徵4.從圖像數據中提取特徵的方法#2:通道的平均像素值5.從圖像數據中提取特徵的方法#3:提取邊緣機器是如何存儲圖像的在實時編碼窗口中嘗試使用此方法提取特徵。但結果只有一個通道或灰度圖像,對於彩色圖像是否也可以這樣呢?來看看吧!
  • DF-SLAM:一種深度特徵提取方法
    Kang , Jieqi Shi , Xueming Li , Yang Liu , and Xiao Liu來源:arvix 2019編譯:wyc問題傳統的SLAM系統主要關注幾何信息,但是對於非幾何模型不能更好的定位和建圖.
  • OPENCV特徵點提取算法對比
    除了我們熟知的SIFT、SURF、ORB等特徵點提取算法,OpenCV中還提供了十餘種特徵點提取算法。最近在整理以往的ppt和報告,看到其中一頁ppt,發現已經忘得差不多了,就再寫篇博客複習下好了,這篇博客注重對比,技術方面的內容不會太過細緻,希望能有幫助。當然,文章末尾會提供這些算法OpenCV調用的實例代碼。
  • 提取圖像數據的特徵,讓機器「看見」
    ,基於結構形態的特徵提取與基於幾何分布的特徵提取。[ 導語 ] 人眼可以看到圖像的視覺信息,包括顏色特徵、紋理特徵、形狀特徵和空間關係特徵,但這種信息並不能讓計算機「看見」。想要讓計算機處理這種視覺信息,就要將圖像的視覺信息轉化成計算機能夠識別和處理的定量形式,也就是圖像特徵提取。下面將介紹兩種方法--基於結構形態的特徵提取與基於幾何分布的特徵提取。
  • 「AI自動提取特徵」的簡易範例*
    這稱為:自動提取特徵。本文將藉由很簡單的範例來展示「自動提取特徵」,以便充分發揮各種AI模型的特色,來促進特徵提取的效率。接下來,將介紹更密切的分工合作模式:讓學習自動提取特徵,人們就不必去做萃取特徵的工作了,就更輕鬆了。  2 AI自動提取特徵  現在可以進一步傳授更多智能給AI,讓AI可以代替人們現在的工作:人工提取特徵。於是,就來說明如何教導AI去自動提取特徵。
  • PHM建模方法論之「 數據特徵提取 」
    數據特徵提取步驟是整個過程的第3步,目的是通過採用合適的數據分析方法,從原始數據中提取與建模相關的有效特徵來建立模型。常用的特徵提取方法,包括時域特徵提取,頻域特徵提取,以及時頻域特徵提取。時域特徵提取通常包括的參數較多,比如有RMS(有效值)、峰峰值、峭度、裕度、歪度、均值、均方根、脈衝因數、波形因數、波峰因數等等。 上圖展示了4種不同健康條件下軸承的振動信號。
  • 目標檢測的圖像特徵提取之 HOG特徵
    在圖像的紋理強度中,局部的表層曝光貢獻的比重較大,所以,這種壓縮處理能夠有效地降低圖像局部的陰影和光照變化。因為顏色信息作用不大,通常先轉化為灰度圖;     Gamma壓縮公式:則一塊的特徵數為:3*3*9; (5)收集HOG特徵      最後一步就是將檢測窗口中所有重疊的塊進行HOG特徵的收集,並將它們結合成最終的特徵向量供分類使用。    (6)那麼一個圖像的HOG特徵維數是多少呢?
  • 基於協方差矩陣的目標特徵提取與跟蹤
    該方法在確定融合了LBP紋理特徵的目標特徵向量基礎上,建立目標區域協方差矩陣作為模板矩陣,並從下一幀中提取協方差矩陣,與模板矩陣進行矩陣相似性度量,形成相似度矩陣,使用閾值進行矩陣元素的選擇,並計算剩餘元素的權值,再按重心公式確定跟蹤中心點。實驗結果表明:在較複雜環境中,可以對目標的旋轉、遮擋和形狀變化進行具有更高準確度的跟蹤,驗證了該方法的有效性。
  • LBP特徵的描述、原理以及特徵向量進行提取的步驟解析
    而且,提取的特徵是圖像的局部的紋理特徵; 1、LBP特徵的描述 原始的LBP算子定義為在3*3的窗口內,以窗口中心像素為閾值,將相鄰的8個像素的灰度值與其進行比較,若周圍像素值大於中心像素值,則該像素點的位置被標記為1,否則為0。
  • 語音識別算法有哪些_語音識別特徵提取方法
    (2)感知線性預測係數(PerceptualLinearPredictive,PLP)   一種基於聽覺模型的特徵參數。該參數是一種等效於LPC的特徵,也是全極點模型預測多項式的一組係數。不同之處是PLP是基於人耳聽覺,通過計算應用到頻譜分析中,將輸入語音信號經過人耳聽覺模型處理,替代LPC所用的時域信號,這樣的優點是有利於抗噪語音特徵的提取。
  • 倫敦帝國學院提出局部特徵提取新模式D2D:先描述後檢測
    提到局部特徵提取,傳統方法如SIFT等往往是先檢測關鍵點,然後以關鍵點為中心計算特徵描述,近年來出現了一些檢測和描述聯合計算的方法,如 SuperPoint、 D2-Net 、 R2D2等,如下圖:作者認為特徵描述部分本就含有巨大信息量,本身就能代表著某個位置像素的顯著程度,為什麼不先計算得到大量的密集特徵描述再從中篩選關鍵點呢