GNN

圖神經網路。

分類器

屬性 labels_ 會將一個標籤指派給圖中的每個節點。

class sknetwork.gnn.GNNClassifier(dims: int | Iterable | None = None, layer_types: str | Iterable = 'Conv', activations: str | Iterable = 'ReLu', use_bias: bool | list = True, normalizations: str | Iterable = 'both', self_embeddings: bool | Iterable = True, sample_sizes: int | list = 25, loss: BaseLoss | str = 'CrossEntropy', layers: Iterable | None = None, optimizer: BaseOptimizer | str = 'Adam', learning_rate: float = 0.01, early_stopping: bool = True, patience: int = 10, verbose: bool = False)[source]

用於節點分類的圖神經網路。

參數:
  • dims (可疊代整數) – 各個層輸出的維度 (順向)。如果為整數,則為輸出層維度 (沒有隱藏層)。如果指定 則此參數為選用。

  • layer_types (可疊代字串) – 各層類型 (順向)。如果為字串,表示在每層使用相同類型。可以是 'Conv' (圖形卷積層,預設) 或 'Sage' (GraphSage)。

  • 啟動器 (可迭代字串) – 啟動器功能 (正向方向)。若為字串,則每層使用相同的啟動器功能。可以是 'Identity''Relu''Sigmoid''Softmax' (預設 = 'Relu')。

  • 使用偏差 (可迭代布林值) – 每層是否加上偏差值 (正向方向)。若 True,則每層使用偏差值。

  • 正規化 (可迭代字串) –訊息傳遞時鄰接矩陣的正規化 (正向方向)。若為字串,則每層使用相同的正規化類型。可以是 'left' (以度數進行左正規化)、'right' (以度數進行右正規化)、'both' (以度數的平方根進行對稱正規化,預設) 或 None (不正規化)。

  • 自我嵌入 (可迭代字串) – 訊息傳遞時是否為每個節點加上嵌入 (正向方向)。若 True,則每層加上自我嵌入。

  • 取樣大小 (可迭代整數) – 為每個節點取樣鄰域時的大小 (正向方向)。若為整數,則每層使用相同的取樣大小。僅使用於 'Sage' 類型的層。

  • 損失 (字串 (預設 = 'CrossEntropy') 或 BaseLoss) – 損失函數的名稱或自訂損失函數。

  • (可迭代None) – 自訂層 (正向方向)。若使用,則略過前一個參數。

  • 最佳化器 (字串最佳化器) –

    • 'Adam',隨機梯度最佳化器 (預設)。

    • 'GD',梯度下降法。

  • 學習率 (浮點數) – 學習率。

  • 早期停止 (布林值 (預設 = True)) – 是否使用早期停止來結束訓練。若 True,則當驗證得分經過 耐心 次反覆運算後沒有改善時,訓練便會終止。

  • 耐心 (整數 (預設 = 10)) – 在沒有改善的情況下等待的重複次數,才會停止擬合。

  • 詳細 (布林值) – 詳細模式。

變數:
  • conv1 (conv2, ...,) – 圖形卷積層。

  • output (np.ndarray) – GNN 輸出。

  • labels (np.ndarray) – 預測節點標籤。

  • history (dict) – 每個數據點的訓練歷程:{'embedding', 'loss', 'train_accuracy', 'val_accuracy'}。

範例

>>> from sknetwork.gnn.gnn_classifier import GNNClassifier
>>> from sknetwork.data import karate_club
>>> from numpy.random import randint
>>> graph = karate_club(metadata=True)
>>> adjacency = graph.adjacency
>>> labels_true = graph.labels
>>> labels = {i: labels_true[i] for i in [0, 1, 33]}
>>> features = adjacency.copy()
>>> gnn = GNNClassifier(dims=1, early_stopping=False)
>>> labels_pred = gnn.fit_predict(adjacency, features, labels, random_state=42)
>>> round(np.mean(labels_pred == labels_true), 2)
0.88
backward(features: csr_matrix, labels: ndarray, mask: ndarray)

計算反向傳遞。

參數:
  • features (sparse.csr_matrix) – 特徵,形狀為 (n_nodes, n_features) 的陣列。

  • labels (np.ndarray) – 標籤,形狀為 (n_nodes,) 的陣列。

  • mask (np.ndarray) – 布林值遮罩,形狀為 (n_nodes,) 的陣列。

fit(鄰接矩陣: csr_矩陣 | ndarray, 特徵: csr_矩陣 | ndarray, 標籤: ndarray, 循環次數: int = 100, 驗證: float = 0, 重新初始化: 布林值 = False, 隨機狀態: int | = None) GNNClassifier[來源]

依據資料調整模型並儲存訓練好的參數。

參數:
  • 鄰接矩陣 (sparse.csr_matrix) – 圖形的鄰接矩陣。

  • 特徵 (sparse.csr_matrix, np.ndarray) – 形狀為 \((n, d)\) 的輸入特徵,其中 \(n\) 為圖中節點的數量,而 \(d\) 為特徵空間的大小。

  • 標籤 (dict, np.ndarray) – 已知的標籤。忽略負值。

  • 循環次數 (int (預設 = 100)) – 循環次數(遍歷整個圖表)。

  • 驗證 (float) – 用於驗證的訓練集比例(介於 0 到 1 之間)。

  • reinit (bool (預設 = False)) – 若為 True,則重新初始化 GNN 可訓練參數(權重和偏置)。

  • random_state (int) – 隨機種子,用於在多次執行中產生可重現的結果。

fit_predict(*args, **kwargs) ndarray

將演算法擬合到資料並傳回標籤。與 fit 方法相同的參數。

傳回::

labels – 節點的標籤。

傳回型別::

np.ndarray

fit_predict_proba(*args, **kwargs) ndarray

將演算法擬合到資料並傳回標籤的機率分佈。與 fit 方法相同的參數。

傳回::

probs – 標籤的機率分布。

傳回型別::

np.ndarray

fit_transform(*args, **kwargs) ndarray

將演算法擬合到資料並傳回節點的嵌入。與 fit 方法相同的參數。

傳回::

embedding – 節點的嵌入。

傳回型別::

np.ndarray

forward(adjacency: list | csr_matrix, features: csr_matrix | ndarray) ndarray[source]

執行圖形上的前進傳遞並傳回輸出。

參數:
  • 鄰接矩陣 (Union[list, sparse.csr_matrix]) – 鄰接矩陣或採樣鄰接矩陣清單。

  • 特徵 (sparse.csr_matrix, np.ndarray) – 特徵,形狀為 (n_nodes, n_features) 的陣列。

傳回::

輸出 – GNN 的輸出。

傳回型別::

np.ndarray

get_params()

以字典形式取得參數。

傳回::

params – 演算法的參數。

傳回型別::

dict

predict()

傳回預測的標籤。

predict_proba()

傳回標籤上的機率分佈。

print_log(*args)

填入文字到 log 中。

set_params(params: dict) Algorithm

設定演算法的參數。

參數:

params (dict) – 演算法的參數。

傳回::

self

傳回型別::

Algorithm

transform()

傳回節點內嵌。

卷積層

類別 sknetwork.gnn.Convolution(layer_type: str, out_channels: int, activation: BaseActivation | str | None = 'Relu', use_bias: bool = True, normalization: str = 'both', self_embeddings: bool = True, sample_size: int | None = None, loss: BaseLoss | str | None = None)[原始碼]

圖形捲積層。

將以下函式應用至嵌入 \(X\)

\(\sigma(\bar AXW + b)\),

其中 \(\bar A\) 是正規化鄰接矩陣(可能插入自嵌入),\(W\)\(b\) 是可訓練參數,\(\sigma\) 是激活函數。

參數:
  • layer_type (str) – 層類型。可以是 'Conv',卷積運算子,如同 [1] 中所述,或是 'Sage',如同 [2] 中所述。

  • out_channels (int) – 輸出的維度。

  • activation (str (預設值 = 'Relu') 或自訂激活。) – 激活函數。如果是字串,可以使用 'Identity''Relu''Sigmoid''Softmax'

  • use_bias (bool (預設值 = )) – 如果 ,新增偏差向量。

  • normalization (str (預設值 = 'both')) – 傳遞訊息時,鄰接矩陣的正規化。可以使用 ‘left’` (依據度數進行左正規化),'right' (依據度數進行右正規化),'both' (依據度數的平方根對稱正規化,預設值) 或 None (不正規化)。

  • self_embeddings (bool (預設值 = )) – 如果 ,除了相鄰的嵌入之外,考慮加入圖形中每個節點的自嵌入。

  • sample_size (int (預設值 = 25)) – 對每個節點抽樣的鄰域大小。僅用於 'Sage' 層。

變數:
  • weight (np.ndarray,) – 可訓練權重矩陣。

  • bias (np.ndarray) – 偏差向量。

  • embedding (np.ndarray) – 節點的嵌入(在激活之前)。

  • output (np.ndarray) – 層的輸出(在激活之後)。

參考文獻

[1] Kipf, T., & Welling, M. (2017). 以圖形卷積網路進行半監督分類。 第五屆表示學習國際研討會。

[2] Hamilton, W. Ying, R., & Leskovec, J. (2017) 大型圖形上的歸納表示學習。 NIPS

forward(adjacency: csr_matrix | ndarray, features: csr_matrix | ndarray) ndarray[原始程式碼]

計算圖卷積。

參數:
  • adjacency – 圖的鄰接矩陣。

  • 特徵 (sparse.csr_matrix, np.ndarray) – 形狀為 \((n, d)\) 的輸入特徵,其中 \(n\) 為圖中節點的數量,而 \(d\) 為特徵空間的大小。

傳回::

output – 層的輸出。

傳回型別::

np.ndarray

啟動函數

class sknetwork.gnn.BaseActivation(name: str = 'custom')[原始程式碼]

啟動函數的基本類別。:param name: 啟動函數的名稱。:type name: str

static gradient(signal: ndarray, direction: ndarray) ndarray[原始程式碼]

啟動函數的梯度。

參數:
  • signal (np.ndarray, shape (n_samples, n_channels)) – 輸入訊號。

  • direction (np.ndarray, shape (n_samples, n_channels)) – 擷取梯度的方向。

傳回::

gradient – 梯度。

傳回型別::

np.ndarray, shape (n_samples, n_channels)

static output(signal: ndarray) ndarray[source]

激活函數的輸出。

參數:

signal (np.ndarray, shape (n_samples, n_channels)) – 輸入訊號。

傳回::

output – 輸出訊號。

傳回型別::

np.ndarray, shape (n_samples, n_channels)

class sknetwork.gnn.ReLu[source]

ReLu(Rectified Linear Unit)激活函數

\(\sigma(x) = \max(0, x)\)

static gradient(signal: ndarray, direction: ndarray) ndarray[source]

ReLu 函數的梯度。

static output(signal: ndarray) ndarray[source]

ReLu 函數的輸出。

class sknetwork.gnn.Sigmoid[source]

Sigmoid 激活函數

\(\sigma(x) = \frac{1}{1+e^{-x}}\) 又稱為 logisitic 函數。

靜態 梯度(訊號: ndarray, 方向: ndarray) ndarray[來源]

Sigmoid 函式的梯度。

靜態 輸出(訊號: ndarray) ndarray[來源]

Sigmoid 函式的輸出。

類別 sknetwork.gnn.Softmax[來源]

Softmax 啟用函式

\(\sigma(x) = (\frac{e^{x_1}}{\sum_{i=1}^N e^{x_i})},\ldots,\frac{e^{x_N}}{\sum_{i=1}^N e^{x_i})})\)

其中 \(N\) 為通道數量。

靜態 梯度(訊號: ndarray, 方向: ndarray) ndarray[來源]

Softmax 函式的梯度。

靜態 輸出(訊號: ndarray) ndarray[來源]

Softmax 函式的輸出(行總和為 1)。

損失函數

類別 sknetwork.gnn.BaseLoss(name: 字串 = 'custom')[來源]

損失函數的基本類別。

靜態 梯度(訊號: ndarray, 方向: ndarray) ndarray

啟動函數的梯度。

參數:
  • signal (np.ndarray, shape (n_samples, n_channels)) – 輸入訊號。

  • direction (np.ndarray, shape (n_samples, n_channels)) – 擷取梯度的方向。

傳回::

gradient – 梯度。

傳回型別::

np.ndarray, shape (n_samples, n_channels)

靜態 損失(訊號: ndarray, 標籤: ndarray) 浮點數[來源]

取得損失值。

參數:
  • 訊號 (np.ndarray, 形狀 (範例數, 頻道數)) – 輸入訊號 (在啟用前)。

  • 標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。

靜態 loss_gradient(訊號: ndarray, 標籤: ndarray) ndarray[來源]

損失函數的梯度。

參數:
  • signal (np.ndarray, shape (n_samples, n_channels)) – 輸入訊號。

  • 標籤np.ndarray形狀n_samples)– 真實標籤。

傳回::

gradient – 梯度。

傳回型別::

np.ndarray, shape (n_samples, n_channels)

static 輸出(訊號: ndarray) ndarray

激活函數的輸出。

參數:

signal (np.ndarray, shape (n_samples, n_channels)) – 輸入訊號。

傳回::

output – 輸出訊號。

傳回型別::

np.ndarray, shape (n_samples, n_channels)

類別 sknetwork.gnn.交叉熵損失[來源]

帶有 softmax 啟用的交叉熵損失。

對於具有值 \(x\) 和真實標籤 \(y\) 的單一樣本,交叉熵損失為

\(-\sum_i 1_{\{y=i\}} \log (p_i)\)

其中

\(p_i = e^{x_i} / \sum_j e^{x_j}\).

對於 \(n\) 個樣本,傳回平均損失。

static 梯度(訊號: ndarray, 方向: ndarray) ndarray

Softmax 函式的梯度。

static 損失(訊號: ndarray, 標籤: ndarray) 浮點數[來源]

取得損失值。

參數:
  • 訊號np.ndarray形狀n_samplesn_channels)– 輸入訊號(在啟用之前)。通道數量至少必須為 2。

  • 標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。

傳回::

– 損失值。

傳回型別::

浮點數

靜態 損失函數梯度(訊號 ndarray, 標籤 ndarray) ndarray[來源]

取得損失函數的梯度(包含活化函數)。

參數:
  • 訊號 (np.ndarray, 形狀 (範例數, 頻道數)) – 輸入訊號 (在啟用前)。

  • 標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。

傳回::

梯度 – 損失函數的梯度。

傳回型別::

浮點數

靜態 輸出(訊號 ndarray) ndarray

Softmax 函式的輸出(行總和為 1)。

類別 sknetwork.gnn.二元交叉熵[來源]

具有 sigmoid 活化函數的二元交叉熵損失。

對於具有真實標籤 \(y\) 和預測機率 \(p\) 的單一樣本,二元交叉熵損失為

\(-y \log (p) - (1-y) \log (1 - p).\)

對於 \(n\) 個樣本,傳回平均損失。

靜態 梯度(訊號 ndarray, 方向 ndarray) ndarray

Sigmoid 函式的梯度。

靜態 損失函數(訊號: ndarray, 標籤: ndarray) 浮點數[原始碼]

取得損失值。

參數:
  • 訊號np.ndarray形狀n_samplesn_channels)– 輸入訊號(在啟用之前)。通道數量至少必須為 2。

  • 標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。

傳回::

– 損失值。

傳回型別::

浮點數

靜態 損失函數梯度(訊號: ndarray, 標籤: ndarray) ndarray[原始碼]

取得損失函數的梯度(包含活化函數)。

參數:
  • 訊號 (np.ndarray, 形狀 (範例數, 頻道數)) – 輸入訊號 (在啟用前)。

  • 標籤 (np.ndarray, 形狀 (範例數)) – 正確標籤。

傳回::

梯度 – 損失函數的梯度。

傳回型別::

浮點數

靜態 輸出(訊號: ndarray) ndarray

Sigmoid 函式的輸出。

最佳化器

類別 sknetwork.gnn.基本最佳化器(學習率)[原始碼]

最佳化器的基本類別。

參數:

learning_rate (浮點數 (預設 = 0.01)) – 更新權重的學習率。

步驟(gnn: 基本 GNN)[原始碼]

根據梯度值更新模型參數。

參數:

gnn (基本 GNN 分類器) – 包含待更新參數的模型。

類別 sknetwork.gnn.ADAM(學習率 浮點數 = 0.01, 貝塔 1 浮點數 = 0.9, 貝塔 2 浮點數 = 0.999, epsilon 浮點數 = 1e-08)[原始碼]

Adam 優化器。

參數:
  • learning_rate (浮點數 (預設 = 0.01)) – 更新權重的學習率。

  • 貝塔 1 (浮點數) – 用來計算梯度執行平均的係數。

  • 貝塔 2 (浮點數) – 用來計算梯度執行平均的係數。

  • epsilon (浮點數 (預設 = 1e-8)) – 加到分母的項目以提升穩定性。

參考文獻

Kingma, D. P., & Ba, J. (2014)。Adam:一種用於隨機最佳化的方法。第 3 屆學習表徵國際會議。

步驟(gnn BaseGNN)[原始碼]

根據梯度值和參數更新模型參數。

參數:

gnn (BaseGNNClassifier) – 包含要更新參數的模型。

類別 sknetwork.gnn.GD(學習率 浮點數 = 0.01)[原始碼]

梯度下降優化器。

參數:

learning_rate (浮點數 (預設 = 0.01)) – 更新權重的學習率。

step(gnn: BaseGNN)[source]

根據梯度值更新模型參數。

參數:

gnn (基本 GNN 分類器) – 包含待更新參數的模型。