node2vec之小黑尝试
生活随笔
收集整理的這篇文章主要介紹了
node2vec之小黑尝试
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
參數(shù)設(shè)定
import warnings import random warnings.filterwarnings('ignore') import argparse import numpy as np import networkx as nx #import node2vec from gensim.models import Word2Vec import random np.random.seed(1) def parse_args():'''Parses the node2vec arguments.'''# 使用parser加載信息parser = argparse.ArgumentParser(description="Run node2vec.")# 輸入文件 parser.add_argument('--input', nargs='?', default='../graph/karate.edgelist',help='Input graph path')# 輸出文件parser.add_argument('--output', nargs='?', default='../emb/karate.emb',help='Embeddings path')# embedding維度parser.add_argument('--dimensions', type=int, default=128,help='Number of dimensions. Default is 128.')# 節(jié)點(diǎn)序列長(zhǎng)度parser.add_argument('--walk-length', type=int, default=80,help='Length of walk per source. Default is 80.')# 隨機(jī)游走的次數(shù)parser.add_argument('--num-walks', type=int, default=10,help='Number of walks per source. Default is 10.')# word2vec窗口大小,word2vec參數(shù)parser.add_argument('--window-size', type=int, default=10,help='Context size for optimization. Default is 10.')# SGD優(yōu)化時(shí)epoch數(shù)量,word2vec參數(shù)parser.add_argument('--iter', default=10, type=int,help='Number of epochs in SGD')# 并行化核數(shù),word2vec參數(shù)parser.add_argument('--workers', type=int, default=8,help='Number of parallel workers. Default is 8.')# 參數(shù)pparser.add_argument('--p', type=float, default=1,help='Return hyperparameter. Default is 1.')# 參數(shù)qparser.add_argument('--q', type=float, default=1,help='Inout hyperparameter. Default is 1.')# 權(quán)重parser.add_argument('--weighted', dest='weighted', action='store_true',help='Boolean specifying (un)weighted. Default is unweighted.')parser.add_argument('--unweighted', dest='unweighted', action='store_false')parser.set_defaults(weighted=False)# 有向無(wú)向parser.add_argument('--directed', dest='directed', action='store_true',help='Graph is (un)directed. Default is undirected.')parser.add_argument('--undirected', dest='undirected', action='store_false')parser.set_defaults(directed=False)return parser.parse_args(args=[])# return parser.parse_known_args() def read_graph(file):graph_x = nx.read_edgelist(file,nodetype = int,create_using = nx.DiGraph())for edge in graph_x.edges():graph_x[edge[0]][edge[1]]['weight'] = 1# 無(wú)向操作if args.undirected:graph_x = graph_x.to_undirected()return graph_x args = parse_args() nx_G = read_graph(args.input) nx.draw(nx_G,with_labels = True) list(nx_G.neighbors(25))[32, 28, 26]
采樣算法
def alias_setup(probs):smaller = []larger = []Q = np.zeros(len(probs),dtype = int)P = np.zeros(len(probs))probs = [prob / sum(probs) for prob in probs]for t,prob in enumerate(probs):P[t] = prob * len(probs)if P[t] > 1:larger.append(t)else:smaller.append(t)# 準(zhǔn)備開(kāi)始采樣while larger and smaller:large = larger.pop()small = smaller.pop()Q[small] = largeP[large] -= (1 - P[small])if P[large] < 1:smaller.append(large)else:larger.append(large)return Q,P #J,q = alias_setup([1/2,1/3,1/12,1/12]) def alias_draw(J, q):length = len(J)PP = int(np.floor(np.random.rand() * length))QQ = int(np.floor(np.random.rand()))if QQ <= q[PP]:return PPelse:return J[QQ]定義模型的Graph類(lèi)
class Graph(object):def __init__(self,nx_G,is_directed, p, q):self.nx_G = nx_Gself.is_directed = is_directedself.p = pself.q = qdef get_alias_edge(self, src, dst):nx_G = self.nx_Gp = self.pq = self.qunnormalized_probs = []for node in sorted(nx_G.neighbors(dst)):if node == src:prob = nx_G[dst][node]['weight'] / pelif nx_G.has_edge(node,src):prob = nx_G[dst][node]['weight']else:prob = nx_G[dst][node]['weight'] / qunnormalized_probs.append(prob)normalized_probs = [float(prob) / sum(unnormalized_probs) for prob in unnormalized_probs]#print(normalized_probs)return alias_setup(normalized_probs)def preprocess_transition_probs(self):is_directed = self.is_directednx_G = self.nx_G# 結(jié)點(diǎn) 的采樣映射alias_nodes = {}for node in nx_G.nodes():unnormalized_probs = [nx_G[node][neighbor]['weight'] for neighbor in sorted(nx_G.neighbors(node))]probs = [prob / sum(unnormalized_probs) for prob in unnormalized_probs]alias_nodes[node] = alias_setup(probs)# 邊的采樣映射alias_edges = {}for src,tgt in nx_G.edges():unnormalized_probs = self.get_alias_edge(src,tgt)alias_edges[(src,tgt)] = unnormalized_probsif not is_directed:unnormalized_probs = self.get_alias_edge(tgt,src)alias_edges[(tgt,src)] = unnormalized_probsself.alias_nodes = alias_nodesself.alias_edges = alias_edgesreturn alias_nodes,alias_edgesdef node2vec_walk(self, walk_length, start_node):nx_G = self.nx_Galias_nodes = self.alias_nodesalias_edges = self.alias_edgeswalk = [start_node]while len(walk) < walk_length:cur = walk[-1]neighbors = sorted(nx_G.neighbors(cur))if neighbors:if len(walk) == 1:# 只有一個(gè)結(jié)點(diǎn)的話就對(duì)點(diǎn)采樣q,p = alias_nodes[cur]sample_index = alias_draw(q,p)walk.append(neighbors[sample_index])else:# 超過(guò)兩個(gè)點(diǎn),就進(jìn)行邊采樣pre = walk[-2]q,p = alias_edges[(pre,cur)]sample_index = alias_draw(q,p)walk.append(neighbors[sample_index])else:breakreturn walkdef simulate_walks(self, num_walks, walk_length):nx_G = self.nx_Gnodes = list(nx_G.nodes())walks = []for t in range(num_walks):random.shuffle(nodes)#print('epoch {}'.format(t))for node in nodes:walks.append(self.node2vec_walk(walk_length,node))return walksword2vec訓(xùn)練部分代碼
def learn_embeddings(walks):# 將node的類(lèi)型int轉(zhuǎn)化為stringwalk_lol = []for walk in walks:tmp = []for node in walk:tmp.append(str(node))walk_lol.append(tmp)model = Word2Vec(walk_lol,size = 2,window = args.window_size,min_count = 0,sg = 1,workers = args.workers,iter = args.iter)model.wv.save_word2vec_format(args.output)return model聚類(lèi)
# k-means聚類(lèi) from sklearn import cluster from sklearn.metrics import adjusted_rand_score from sklearn.model_selection import train_test_split import pandas as pd def draw_cluster(p,q,pos):g = Graph(nx_G,False,p,q)g.preprocess_transition_probs()walks = g.simulate_walks(40,40)# 訓(xùn)練node2vec模型model = learn_embeddings(walks)# 導(dǎo)入節(jié)點(diǎn)名稱(chēng),獲取embeddingembedding_node=[]for i in range(1,35):j=str(i)embedding_node.append(model[j])embedding_node=np.matrix(embedding_node).reshape((34,-1))y_pred = cluster.KMeans(n_clusters=4).fit_predict(embedding_node) # 調(diào)用 test_RandomForestClassifierprint(y_pred)pos = nx.spring_layout(nx_G)nx.draw_networkx_nodes(nx_G,pos,node_color = y_pred,label = True)nx.draw_networkx_edges(nx_G,pos,nodelist = nx_G.edges())實(shí)驗(yàn)效果
# p小 q大,偏向?qū)挾葍?yōu)先搜索,模型更具有同構(gòu)(注意黃色點(diǎn),起著橋接的屬性!!!) p = 0.1 q = 20 draw_cluster(p,q)[2 2 3 2 1 1 1 2 3 3 1 2 2 2 0 0 1 2 0 2 0 2 0 0 0 0 0 0 3 0 3 3 0 0]
[0 0 3 0 2 2 2 0 3 3 2 0 0 0 1 1 2 0 1 0 1 0 1 1 1 1 1 1 3 1 3 3 1 1]
總結(jié)
以上是生活随笔為你收集整理的node2vec之小黑尝试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: EEGLAB及其插件下载安装
- 下一篇: 科研画图软件推荐