# 核心代碼# 先由這個函數得到計算好的邊權重defpreprocess_transition_probs(self):'''
Preprocessing of transition probabilities for guiding the random walks.
'''G=self.Gis_directed=self.is_directedalias_nodes={}fornodeinG.nodes():unnormalized_probs=[G[node][nbr]['weight']fornbrinsorted(G.neighbors(node))]norm_const=sum(unnormalized_probs)normalized_probs=[float(u_prob)/norm_constforu_probinunnormalized_probs]alias_nodes[node]=alias_setup(normalized_probs)alias_edges={}triads={}ifis_directed:foredgeinG.edges():alias_edges[edge]=self.get_alias_edge(edge[0],edge[1])else:foredgeinG.edges():alias_edges[edge]=self.get_alias_edge(edge[0],edge[1])alias_edges[(edge[1],edge[0])]=self.get_alias_edge(edge[1],edge[0])self.alias_nodes=alias_nodesself.alias_edges=alias_edges# 再由這個函數找到路徑defnode2vec_walk(self,walk_length,start_node):'''
Simulate a random walk starting from start node.
start_node 起點
walk_length 要走的步數
'''G=self.Galias_nodes=self.alias_nodesalias_edges=self.alias_edgeswalk=[start_node]whilelen(walk)<walk_length:cur=walk[-1]cur_nbrs=sorted(G.neighbors(cur))iflen(cur_nbrs)>0:# 如果是root,則沒有上一個節點# 兩種情況下計算概率的方式不同iflen(walk)==1:walk.append(cur_nbrs[alias_draw(alias_nodes[cur][0],alias_nodes[cur][1])])else:prev=walk[-2]next=cur_nbrs[alias_draw(alias_edges[(prev,cur)][0],alias_edges[(prev,cur)][1])]walk.append(next)else:breakreturnwalk與50位技術專家面對面20年技術見證,附贈技術全景圖