目錄
#基於圖的機器學習
什麼是圖嵌入?
圖嵌入的類型
節點嵌入
邊嵌入
圖嵌入
Python實作
總結
首頁 科技週邊 人工智慧 圖嵌入概述:節點、邊和圖嵌入方法及Python實現

圖嵌入概述:節點、邊和圖嵌入方法及Python實現

Apr 10, 2023 pm 05:31 PM
python 機器學習 圖嵌入

近年來基於圖的機器學習有了很大的發展。基於圖的方法在資料科學中的許多常見問題中都有應用,例如連結預測、社群發現、節點分類等。根據如何組織問題和所擁有的數據,有許多解決問題的方法。本文將提供一個基於圖的嵌入演算法的高層次的概述。最後也將介紹如何用Python庫(如node2vec)來在圖上產生各種嵌入。

圖嵌入概述:節點、邊和圖嵌入方法及Python實現


#基於圖的機器學習

人工智慧有各種分支,從推薦系統、時間序列、自然語言處理、電腦視覺、圖機器學習等。有多種方法可以透過基於圖的機器學習來解決常見問題。包括社群發現、連結預測、節點分類等。

與圖機器學習的一個主要問題是找到一種表示(或編碼)圖結構的方法,以便機器學習模型可以輕鬆地利用它[1]。一般情況下機器學習中解決這個問題需要透過與模型相關聯的結構化表格資料來學習某種表示,這在以前是透過統計測量或核函數來進行的。近年來趨勢已經轉向對圖進行編碼以產生嵌入向量來訓練機器學習模型。

機器學習模型的目標是訓練機器在資料集中大規模學習和模式識別。在處理圖時這一點會被放大,因為圖提供不同而複雜的結構,這是其他形式的資料(如文字、音訊或圖像)所不具備的。基於圖的機器學習可以偵測並解釋重複出現的潛在模式[2]。

我們可能對確定與社交網路上的使用者相關的人口統計資訊感興趣。人口統計資料包括年齡、性別、種族等。像Facebook或Twitter這樣的公司的社交媒體網絡範圍從數百萬-數十億的用戶和數萬億的邊。肯定會有幾個與該網路中使用者的人口統計資訊相關的模式,這些模式不容易透過人類或演算法檢測到,但模型應該能夠學習它們。類似地,我們可能想推薦一對用戶成為朋友,而他們目前還不是朋友。這就為連結預測(基於圖的機器學習的另一個應用)提供了素材。

什麼是圖嵌入?

特徵工程是指處理輸入資料形成一組特徵的常用方法,這些特徵提供了原始資料集的緊湊且有意義的表示。特徵工程階段的結果將作為機器學習模型的輸入。這是在表格結構化資料集的處理時必備的過程,但在處理圖資料時卻是一種難以執行的方法,因為需要找到一種方法來產生與所有圖資料相關聯的合適表示。

有多種方法可以從圖中產生表示結構資訊的特徵。最常見且最直接的方法是從圖中提取統計資料。這可以包括識別度分佈、page rank、centrality metrics、jaccard 分數等。然後透過內核函數將所需屬性合併到模型中,但是核函數的問題是產生結果的相關時間複雜度很高。

最近的研究趨勢已經轉向尋找有意義的圖表示,對圖生成嵌入表示。這些嵌入學習了保持網路原始結構的圖表示。我們可以將其視為旨在將離散圖轉換為連續域的映射函數。一旦學習了函數,就可以將其應用於圖,並且生成的映射可以用作機器學習演算法的特徵集 。

圖嵌入的類型

對圖的分析可以分解為 3 個粒度等級。節點層級、邊緣層級和圖層級(整個圖)。每個層級由產生嵌入向量的不同流程組成,所選過程應取決於正在處理的問題和資料。下面介紹的每個粒度等級的嵌入都有附圖來直觀地彼此不同。

節點嵌入

在節點級別,產生與圖中的每個節點關聯的嵌入向量。這個嵌入向量可以容納圖的表示和結構。本質上說彼此接近的節點也應該有彼此接近的向量。這是流行的節點嵌入模型(如Node2Vec)的基本原則之一。

圖嵌入概述:節點、邊和圖嵌入方法及Python實現

邊嵌入

在邊緣層中,產生一個與圖中的每條邊相關的嵌入向量。鏈路預測問題是使用邊嵌入的一個常見應用。連結預測是指預測一對節點之間是否有一條邊連接的可能性。這些嵌入可以學習圖提供的邊屬性。例如在一個社交網路圖中,可以有一個多邊圖,其中節點可以根據年齡範圍、性別等用邊連接。表示該邊的相關向量可以學習這些邊屬性。

圖嵌入概述:節點、邊和圖嵌入方法及Python實現

圖嵌入

圖層級的嵌入並不常見,它們包括產生一個表示每個圖的嵌入向量。例如一個有多個子圖的大圖,每個對應的子圖都有一個表示圖結構的嵌入向量。分類問題是圖嵌入可能有用的常見應用。這些類型的問題將包括將圖表分類到特定類別。

圖嵌入概述:節點、邊和圖嵌入方法及Python實現

Python實作

使用python程式碼實作我們需要以下的這些函式庫

Pythnotallow=3.9
 networkx>=2.5
 pandas>=1.2.4
 numpy>=1.20.1
 node2vec>=0.4.4
 karateclub>=1.3.3
 matplotlib>=3.3.4
登入後複製

如果您沒有安裝node2vec包,請參考它的文件。安裝karateclub包,也類似

節點嵌入

import random
 import networkx as nx
 import matplotlib.pyplot as plt
 
 from node2vec import Node2Vec
 from node2vec.edges import HadamardEmbedder
 from karateclub import Graph2Vec
 
 plt.style.use("seaborn")
 
 # generate barbell network
 G = nx.barbell_graph(
m1 = 13,
m2 = 7
 )
 
 # node embeddings
 def run_n2v(G, dimensions=64, walk_length=80, num_walks=10, p=1, q=1, window=10):
"""
Given a graph G, this method will run the Node2Vec algorithm trained with the
appropriate parameters passed in.
 
Args:
G (Graph) : The network you want to run node2vec on
 
Returns:
This method will return a model
 
Example:
G = np.barbell_graph(m1=5, m2=3)
mdl = run_n2v(G)
"""
 
mdl = Node2Vec(
G,
dimensions=dimensions,
walk_length=walk_length,
num_walks=num_walks,
p=p,
q=q
)
mdl = mdl.fit(window=window)
return mdl
 
 mdl = run_n2v(G)
 
 # visualize node embeddings
 x_coord = [mdl.wv.get_vector(str(x))[0] for x in G.nodes()]
 y_coord = [mdl.wv.get_vector(str(x))[1] for x in G.nodes()]
 
 plt.clf()
 plt.scatter(x_coord, y_coord)
 plt.xlabel("Dimension 1")
 plt.ylabel("Dimension 2")
 plt.title("2 Dimensional Representation of Node2Vec Algorithm on Barbell Network")
 plt.show()
登入後複製

圖嵌入概述:節點、邊和圖嵌入方法及Python實現

#上圖是由barbell graph 產生的節點嵌入可視,有許多計算節點嵌入的方法,如node2vec、deep walk、random walks等。這裡使用node2vec。

邊嵌入

edges_embs = HadamardEmbedder(
keyed_vectors=mdl.wv
 )
 
 # visualize embeddings
 coordinates = [
edges_embs[(str(x[0]), str(x[1]))] for x in G.edges()
 ]
 
 plt.clf()
 plt.scatter(coordinates[0], coordinates[1])
 plt.xlabel("Dimension 1")
 plt.ylabel("Dimension 2")
 plt.title("2 Dimensional Representation of Edge Embeddings on Barbell Network")
 plt.show()
登入後複製

圖嵌入概述:節點、邊和圖嵌入方法及Python實現

#透過barbell graph查看邊嵌入的視覺化,Hammard Embedder的原始碼可以在這裡找到(https ://github.com/eliorc/node2vec/blob/master/node2vec/edges.py#L91)。

圖嵌入

n_graphs = 10
 Graphs = [
nx.fast_gnp_random_graph(
n = random.randint(5,15),
p = random.uniform(0,1)
) for x in range(n_graphs)
 ]
 
 g_mdl = Graph2Vec(dimensions=2)
 g_mdl.fit(Graphs)
 g_emb = g_mdl.get_embedding()
 
 x_coord = [vec[0] for vec in g_emb]
 y_coord = [vec[1] for vec in g_emb]
 
 plt.clf()
 plt.scatter(x_coord, y_coord)
 plt.xlabel("Dimension 1")
 plt.ylabel("Dimension 2")
 plt.title("2 Dimensional Representation of Graph Embeddings on Randomly Generated Networks")
 plt.show()
登入後複製

圖嵌入概述:節點、邊和圖嵌入方法及Python實現

#這是一個由隨機產生的圖的圖嵌入可視化,graph2vec演算法的源代碼可以在這裡找到。 (https://karateclub.readthedocs.io/en/latest/_modules/karateclub/graph_embedding/graph2vec.html)

總結

#嵌入是一個將離散圖對應到向量表示的函數。從圖資料中可以產生多種形式的嵌入,節點嵌入、邊嵌入和圖嵌入。所有三種類型的嵌入都提供了一種向量表示,將圖的初始結構和特徵映射到X維的數值。

以上是圖嵌入概述:節點、邊和圖嵌入方法及Python實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

See all articles