当前位置: 首页> 教育> 就业 > Node2vec

Node2vec

时间:2025/7/11 18:05:52来源:https://blog.csdn.net/weixin_46348136/article/details/140309490 浏览次数:0次
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
from gensim.models.word2vec import Word2Vecfrom sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score# 导入数据集,还是空手道俱乐部
G = nx.erdos_renyi_graph(10,0.3,seed=1,directed=False)# 画出
plt.axis('off')
nx.draw_networkx(G,pos=nx.spring_layout(G,seed=0))
plt.show()# 定义next_node 函数
def next_node(previous,current,p,q):alphas=[]# 获取当前节点的邻居节点neighbors = list(G.neighbors(current))# 对于每个邻居,都需要计算出相应的alpha值# 第一种情况: 如果该邻居是前一个节点,则为 1/p,# 第二种情况:如果该邻居与前一个节点相连,则为 1# 第三种情况:否则为 1/q# 遍历所有邻居for neighbor in neighbors:# 第一种情况:if neighbor == previous:alpha = 1/pelif G.has_edge(neighbor,neighbor):alpha = 1else:alpha = 1/qalphas.append(alpha)# 对这些值进行归一化处理,得出概率probs = [alpha / sum(alphas) for alpha in alphas]# 随机选择下一个节点next = np.random.choice(neighbors,size=1,p=probs)[0]return next# 编写随机游走函数
def random_walk(start,length,p,q):walk = [start]for i in range(length):current = walk[-1] # 取出当前节点previous = walk[-2] if len(walk)>1 else None# 取出前一个节点next = next_node(previous,current,p,q)walk.append(next)return walkprint(random_walk(0,8,10,1))# 实现Node2vec# 加载数据集
G = nx.karate_club_graph()
# 将字符串 类标签 转换为数值 ,Mr.Hi = 0, Officer = 1
labels = []
for node in G.nodes:label = G.nodes[node]['club']labels.append(1 if label == 'Officer' else 0)# 指定参数 p = 3, q = 2,调用random_walk() 函数为图中的每个节点生成80个随机游走序列,
walks = []
for node in G.nodes:for _ in range(80):walks.append(random_walk(node,10,3,2))# 构建node2Vec
node2vec = Word2Vec(walks,hs=1,sg=1,window=10,workers=2,min_count=1)
# 开始训练
node2vec.train(walks,total_examples=node2vec.corpus_count,epochs=30,report_delay=1)
train_mask = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24]
test_mask = [0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33]labels = np.array(labels)
clf = RandomForestClassifier(random_state=0)
clf.fit(node2vec.wv[train_mask], labels[train_mask])
y_pred = clf.predict(node2vec.wv[test_mask])
acc = accuracy_score(y_pred, labels[test_mask])
print(f'Node2Vec accuracy = {acc*100:.2f}%')
# Node2Vec accuracy = 95.45%

emo了一个月,重新来过

关键字:Node2vec

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: