启发式指标类
commonNeighbors
、Jaccard
、Resource
、Preferential
、Adamic
是社交网络分析中常用的节点相似性度量方法。
-
Common Neighbors
(共同邻居):共同邻居是指两个节点之间共同拥有的邻居节点。该度量方法认为共同邻居越多,两个节点之间的相似性越高。 -
Jaccard
(杰卡德相似系数):杰卡德相似系数是指两个节点邻居集合的交集大小与并集大小的比值。它衡量了两个节点之间邻居节点的共享程度。 -
Resource Allocation
(资源分配指数):资源分配指数考虑了两个节点之间的共同邻居,并为共同邻居节点分配一定的资源。该度量方法认为与稀有共同邻居相连的节点对之间的相似性更高。 -
Preferential Attachment
(优先连接度):优先连接度基于节点的度数,认为节点的相似性与其度数的乘积成正比。该度量方法假设节点越受欢迎(即具有更高的度数),与其相连的节点对之间的相似性越高。 -
Adamic-Adar
(阿达姆-阿达尔指数):阿达姆-阿达尔指数考虑了两个节点之间的共同邻居,并对共同邻居节点的度数取倒数。它认为度数较低的共同邻居对于节点相似性的贡献更大。
用于计算节点对之间的相似性或预测潜在边的存在。它们在社交网络分析、推荐系统、链接预测等领域都有广泛的应用。
以下是各个节点相似性度量方法的公式:
-
Common Neighbors
(共同邻居):
公式: s i m C N ( u , v ) = ∣ Γ ( u ) ∩ Γ ( v ) ∣ sim_{CN}(u, v) = |\Gamma(u) \cap \Gamma(v)| simCN(u,v)=∣Γ(u)∩Γ(v)∣
其中, s i m C N ( u , v ) sim_{CN}(u, v) simCN(u,v)表示节点u和节点v之间的共同邻居数量, Γ ( u ) \Gamma(u) Γ(u)表示节点u的邻居集合, Γ ( v ) \Gamma(v) Γ(v)表示节点v的邻居集合。 -
Jaccard
(杰卡德相似系数):
公式: s i m J ( u , v ) = ∣ Γ ( u ) ∩ Γ ( v ) ∣ ∣ Γ ( u ) ∪ Γ ( v ) ∣ sim_{J}(u, v) = \frac{|\Gamma(u) \cap \Gamma(v)|}{|\Gamma(u) \cup \Gamma(v)|} simJ(u,v)=∣Γ(u)∪Γ(v)∣∣Γ(u)∩Γ(v)∣
其中, s i m J ( u , v ) sim_{J}(u, v) simJ(u,v)表示节点u和节点v之间的杰卡德相似系数, ∣ Γ ( u ) ∩ Γ ( v ) ∣ |\Gamma(u) \cap \Gamma(v)| ∣Γ(u)∩Γ(v)∣表示节点u和节点v之间的共同邻居数量, ∣ Γ ( u ) ∪ Γ ( v ) ∣ |\Gamma(u) \cup \Gamma(v)| ∣Γ(u)∪Γ(v)∣表示节点u和节点v的邻居节点的并集大小。 -
Resource Allocation
(资源分配指数):
公式: s i m R A ( u , v ) = ∑ z ∈ Γ ( u ) ∩ Γ ( v ) 1 ∣ Γ ( z ) ∣ sim_{RA}(u, v) = \sum_{z \in \Gamma(u) \cap \Gamma(v)} \frac{1}{|\Gamma(z)|} simRA(u,v)=∑z∈Γ(u)∩Γ(v)∣Γ(z)∣1
其中, s i m R A ( u , v ) sim_{RA}(u, v) simRA(u,v)表示节点u和节点v之间的资源分配指数, Γ ( u ) \Gamma(u) Γ(u)表示节点u的邻居集合, Γ ( v ) \Gamma(v) Γ(v)表示节点v的邻居集合, ∣ Γ ( z ) ∣ |\Gamma(z)| ∣Γ(z)∣表示节点z的度数。 -
Preferential Attachment
(优先连接度):
公式: s i m P A ( u , v ) = ∣ Γ ( u ) ∣ ⋅ ∣ Γ ( v ) ∣ sim_{PA}(u, v) = |\Gamma(u)| \cdot |\Gamma(v)| simPA(u,v)=∣Γ(u)∣⋅∣Γ(v)∣
其中, s i m P A ( u , v ) sim_{PA}(u, v) simPA(u,v)表示节点u和节点v之间的优先连接度, ∣ Γ ( u ) ∣ |\Gamma(u)| ∣Γ(u)∣表示节点u的度数, ∣ Γ ( v ) ∣ |\Gamma(v)| ∣Γ(v)∣表示节点v的度数。 -
Adamic-Adar
(阿达姆-阿达尔指数):
公式: s i m A A ( u , v ) = ∑ z ∈ Γ ( u ) ∩ Γ ( v ) 1 log ∣ Γ ( z ) ∣ sim_{AA}(u, v) = \sum_{z \in \Gamma(u) \cap \Gamma(v)} \frac{1}{\log{|\Gamma(z)|}} simAA(u,v)=∑z∈Γ(u)∩Γ(v)log∣Γ(z)∣1
其中, s i m A A ( u , v ) sim_{AA}(u, v) simAA(u,v)表示节点u和节点v之间的阿达姆-阿达尔指数, Γ ( u ) \Gamma(u) Γ(u)表示节点u的邻居集合, Γ ( v ) \Gamma(v) Γ(v)表示节点v的邻居集合, ∣ Γ ( z ) ∣ |\Gamma(z)| ∣Γ(z)∣表示节点z的度数, log ∣ Γ ( z ) ∣ \log{|\Gamma(z)|} log∣Γ(z)∣表示节点z的度数的对数。
启发式指标组合
假设我们有两个节点 u 和 v,它们之间的公共邻居数为 CommonNeighbors(u, v),Jaccard 系数为 Jaccard(u, v),资源分配指数为 Resource(u, v),优先连接度为 Preferential(u, v),Adamic-Adar 指数为 Adamic(u, v)。我们可以将这些指标作为逻辑回归的输入。
数学公式如下:
令 X 为输入特征向量,包含这五个指标:
X = [CommonNeighbors(u, v), Jaccard(u, v), Resource(u, v), Preferential(u, v), Adamic(u, v)]
逻辑回归模型的数学公式为:
z = w^T * X + b
y_hat = g(z) = 1 / (1 + e^(-z))
其中,w 是权重向量,b 是偏置项。
可以将权重向量和偏置项表示为:
w = [w1, w2, w3, w4, w5]
b = b
将 X 带入逻辑回归模型的数学公式,可以得到预测概率值 yhat:
yhat = g(w1 * CommonNeighbors(u, v) + w2 * Jaccard(u, v) + w3 * Resource(u, v) + w4 * Preferential(u, v) + w5 * Adamic(u, v) + b)
最后,通过设置阈值,可以根据 yhat 的值来进行二分类的决策。当 yhat >= 0.5 时,将样本分类为正类,当 y_hat < 0.5 时,将样本分类为负类。
这就是将这五个指标作为逻辑回归的输入的数学公式。请注意,权重向量 w 和偏置项 b 可以通过训练过程来学习和确定它们的值。
Node2vec
Node2Vec是一种用于学习节点嵌入(node embedding)的图表示学习方法,它在DeepWalk的基础上引入了更灵活的节点采样策略,能够在学习节点嵌入时更好地捕捉到图中的社区结构和节点聚集性。
Node2Vec的核心思想是通过定义两个参数来指导节点采样的策略:P和Q。P参数控制着游走的偏好,使得游走更有可能在相邻节点之间进行,从而能够遍历图中的局部邻域。Q参数则控制着游走过程中的探索性,能够使得游走在图中远离已访问过的节点,从而探索全局结构。
具体步骤如下:
1.初始化参数:设定参数P和Q的值,以及游走长度和采样次数等超参数。
2.随机游走:根据设定的参数P和Q,以及游走长度,从图中的某个起始节点开始进行多次游走,生成节点序列。
3.节点序列表示:将游走得到的序列看作是一个类似于文本的序列,利用Skip-gram或CBOW等Word2Vec算法将节点序列作为输入,学习节点向量的表示。
4.嵌入学习:通过经过训练的Word2Vec模型,获取每个节点的实数向量表示,即节点嵌入。
Node2Vec方法相比于传统的随机游走方法,通过引入参数P和Q,使得节点采样的策略更加灵活和有针对性。这样的节点采样策略能够更好地保留图中的局部邻域结构和全局特征,从而使得学习到的节点嵌入能更好地捕捉节点之间的关系和相似性。
Node2Vec的优点包括:
5.考虑了局部和全局结构:通过P和Q参数的调整,Node2Vec能够控制节点采样过程中的偏好和探索性,从而同时考虑了图的局部邻域结构和全局特征。
6.捕捉社区结构:Node2Vec能够在学习节点嵌入的同时,较好地捕捉图中的社区结构,对社区发现和节点聚类等任务有较好的表现。
7.抽象和可视化:学习到的节点嵌入可以将复杂的图数据转化为低维连续向量表示,从而方便进行进一步的分析、可视化和挖掘。
伪代码
begin
class SEALDataset extends InMemoryDataset:
function __init__(root, dataset, num_hops, use_features, split)
end
property processed_file_names:
return ["processed_data_train.pt", "processed_data_val.pt", "processed_data_test.pt"]
end
function process():
train_pos_data_list = []
for i = 0 to len(train_data) - 1
train_data[i].x = torch.nn.functional.one_hot(train_data[i].y, num_classes=self.num_classes).float()
train_pos_data_list.append(train_data[i])
end
for i = 0 to len(val_data) - 1:
val_data[i].x = torch.nn.functional.one_hot(val_data[i].y, num_classes=self.num_classes).float()
val_pos_data_list.append(val_data[i])
end
DRNL(Double-radius Node Labeling)是一种节点标签化方法,用于计算节点在图中的位置和相对距离。以下是DRNL的公式:
假设给定无向图G=(V, E),其中V表示节点集合,E表示边集合。对于图G中的两个节点u和v,DRNL计算的是节点u和节点v之间的距离。
-
距离到目标节点u的距离(dist2src):
d i s t 2 s r c ( x ) = s h o r t e s t _ p a t h ( G w o _ d s t , d s t , x ) dist2src(x) = shortest\_path(G_{wo\_dst}, dst, x) dist2src(x)=shortest_path(Gwo_dst,dst,x)
其中, s h o r t e s t _ p a t h ( G w o _ d s t , d s t , x ) shortest\_path(G_{wo\_dst}, dst, x) shortest_path(Gwo_dst,dst,x)表示在去除目标节点dst后的图G_{wo_dst}中,从节点x到节点dst的最短路径距离。 -
距离到目标节点v的距离(dist2dst):
d i s t 2 d s t ( x ) = s h o r t e s t _ p a t h ( G w o _ s r c , s r c , x ) dist2dst(x) = shortest\_path(G_{wo\_src}, src, x) dist2dst(x)=shortest_path(Gwo_src,src,x)
其中, s h o r t e s t _ p a t h ( G w o _ s r c , s r c , x ) shortest\_path(G_{wo\_src}, src, x) shortest_path(Gwo_src,src,x)表示在去除目标节点src后的图G_{wo_src}中,从节点x到节点src的最短路径距离。 -
DRNL节点标签(z):
z ( x ) = 1 + min ( d i s t 2 s r c ( x ) , d i s t 2 d s t ( x ) ) + d i s t _ o v e r _ 2 ( x ) ⋅ ( d i s t _ o v e r _ 2 ( x ) + d i s t _ m o d _ 2 ( x ) − 1 ) z(x) = 1 + \min(dist2src(x), dist2dst(x)) + dist\_over\_2(x) \cdot (dist\_over\_2(x) + dist\_mod\_2(x) - 1) z(x)=1+min(dist2src(x),dist2dst(x))+dist_over_2(x)⋅(dist_over_2(x)+dist_mod_2(x)−1)
其中, d i s t _ o v e r _ 2 ( x ) = d i s t 2 s r c ( x ) / / 2 dist\_over\_2(x) = dist2src(x) // 2 dist_over_2(x)=dist2src(x)//2表示到目标节点的距离除以2的整数部分, d i s t _ m o d _ 2 ( x ) = d i s t 2 s r c ( x ) % 2 dist\_mod\_2(x) = dist2src(x) \% 2 dist_mod_2(x)=dist2src(x)%2表示到目标节点的距离除以2的余数部分。
通过上述公式,DRNL计算出节点u和节点v之间的距离标签z。节点标签z反映了节点在图中的位置和相对距离,可以用于度量节点之间的相似性或进行其他的图分析任务。
k-hop
k-hop是一种图中节点之间的距离度量,表示节点u和节点v之间的最短路径长度为k的路径的数量。以下是k-hop的公式:
假设给定无向图G=(V, E),其中V表示节点集合,E表示边集合。对于图G中的两个节点u和v,k-hop度量表示节点u和节点v之间最短路径长度为k的路径的数量。
k h o p ( u , v , k ) = ∣ { ( p 1 , p 2 , . . . , p k + 1 ) ∣ p 1 = u , p k + 1 = v , ( p i , p i + 1 ) ∈ E , 1 ≤ i ≤ k } ∣ khop(u, v, k) = |\{(p_1, p_2, ..., p_{k+1}) \mid p_1=u, p_{k+1}=v, (p_i, p_{i+1}) \in E, 1 \leq i \leq k\}| khop(u,v,k)=∣{(p1,p2,...,pk+1)∣p1=u,pk+1=v,(pi,pi+1)∈E,1≤i≤k}∣
上述公式表示,在图G中从节点u到节点v的最短路径长度为k的路径集合中,计算路径的数量。
k-hop度量可以用于衡量节点之间的直接连接程度,以及节点之间的局部邻居关系。它在图分析和图数据挖掘任务中具有重要作用,例如社交网络分析、推荐系统和图聚类等。
PMFG
对每个节点选择最强连接的前三条边,并添加到PMFG中。这可以使用以下数学符号和公式表示:
对于每个节点i,其中i从1到N:
- 令Ei表示与节点i相连的所有边的集合。
- 对于每条边eij ∈ Ei,其中j表示连接到节点i的另一个节点:
- 令wij表示边eij的权重。
要选择最强连接的前三条边,并将其添加到PMFG中,可以使用以下数学表示:
PMFGi = {eij1, eij2, eij3},其中j1、j2、j3表示与节点i相连的最强连接的前三个节点。
PMFGi 中的边eij1、eij2、eij3 的选择满足以下条件:
- wij1 ≥ wij2 ≥ wij3 ≥ wik,对于任意的k不等于j1、j2、j3。
请注意,上述表示仅用于概念说明目的,具体的实现和数学表示可能会根据具体的算法实现细节而有所不同。
DeepWalk
DeepWalk算法涉及了一些数学公式。以下是DeepWalk中常用的数学公式:
-
随机游走(Random Walk):
在游走长度为 L 的情况下,从节点 v 开始进行随机游走,可以表示为一个节点序列 S = [v, n1, n2, …, nL],其中 v 是起始节点,n1, n2, …, nL 是游走过程中经过的节点。 -
Skip-gram模型:
DeepWalk使用Skip-gram模型(一种Word2Vec模型)来学习节点嵌入。Skip-gram模型的目标是根据给定的上下文来预测目标节点,可以表示为以下条件概率:
P(n_j | v) = exp(v · n_j) / Σ_{k∈V} exp(v · n_k)
其中,v 是起始节点的嵌入向量,n_j 是目标节点的嵌入向量,V 是所有节点的集合。 -
负采样(Negative Sampling):
在Skip-gram模型中,为了加速训练并减少计算开销,通常使用负采样来选择一小部分负样本(即非目标节点)作为负例。负采样的目标是最大化目标节点与负样本的差异,通常使用sigmoid函数来计算概率:
P(n_k | v) = σ(-v · n_k)
其中,σ(z) = 1 / (1 + exp(-z)) 是sigmoid函数。 -
节点嵌入(Node Embedding):
DeepWalk通过训练Skip-gram模型来学习节点嵌入向量。对于每个节点 v,可以将其学习到的嵌入向量表示为 v 的特征向量:
v = [v_1, v_2, …, v_d]
其中,v_i 表示嵌入向量的第 i 维,d 是嵌入的维度。