推薦系統(tǒng)圖模型之node2vec

轉(zhuǎn)載https://blog.csdn.net/u012151283/article/details/87081272?spm=1001.2014.3001.5501

前面介紹過基于DFS鄰域的DeepWalk和基于BFS鄰域的LINE。


image.png

node2vec是一種綜合考慮DFS鄰域和BFS鄰域的graph embedding方法。簡單來說,可以看作是eepwalk的一種擴(kuò)展又谋,可以看作是結(jié)合了DFS和BFS隨機(jī)游走的deepwalk。

nodo2vec 算法原理

優(yōu)化目標(biāo)

image.png

采樣策略

node2vec依然采用隨機(jī)游走的方式獲取頂點(diǎn)的近鄰序列纬黎,不同的是node2vec采用的是一種有偏的隨機(jī)游走寥茫。

給定當(dāng)前頂點(diǎn)v vv,訪問下一個(gè)頂點(diǎn)x的概率為


image.png

image.png
image.png

采樣完頂點(diǎn)序列后沮明,剩下的步驟就和deepwalk一樣了,用word2vec去學(xué)習(xí)頂點(diǎn)的embedding向量窍奋。
值得注意的是node2vecWalk中不再是隨機(jī)抽取鄰接點(diǎn)荐健,而是按概率抽取,node2vec采用了Alias算法進(jìn)行頂點(diǎn)采樣琳袄。
Alias Method:時(shí)間復(fù)雜度O(1)的離散采樣方法

node2vec核心代碼

node2vecWalk

通過上面的偽代碼可以看到江场,node2vec和deepwalk非常類似,主要區(qū)別在于頂點(diǎn)序列的采樣策略不同窖逗,所以這里我們主要關(guān)注node2vecWalk的實(shí)現(xiàn)址否。

由于采樣時(shí)需要考慮前面2步訪問過的頂點(diǎn),所以當(dāng)訪問序列中只有1個(gè)頂點(diǎn)時(shí)碎紊,直接使用當(dāng)前頂點(diǎn)和鄰居頂點(diǎn)之間的邊權(quán)作為采樣依據(jù)佑附。
當(dāng)序列多余2個(gè)頂點(diǎn)時(shí),使用文章提到的有偏采樣

def  node2vec_walk(self, walk_length, start_node):
    G = self.G    
    alias_nodes = self.alias_nodes    
    alias_edges = self.alias_edges
    walk = [start_node]
    while len(walk) < walk_length:        
        cur = walk[-1]        
        cur_nbrs = list(G.neighbors(cur))        
        if len(cur_nbrs) > 0:            
            if len(walk) == 1:                
                walk.append(cur_nbrs[alias_sample(alias_nodes[cur][0], alias_nodes[cur][1])])            
            else:                
                prev = walk[-2]                
                edge = (prev, cur)                
                next_node = cur_nbrs[alias_sample(alias_edges[edge][0],alias_edges[edge][1])]                
                walk.append(next_node)        
        else:            
            break
    return walk

構(gòu)造采樣表

preprocess_transition_probs分別生成alias_nodes和alias_edges仗考,alias_nodes存儲(chǔ)著在每個(gè)頂點(diǎn)時(shí)決定下一次訪問其鄰接點(diǎn)時(shí)需要的alias表(不考慮當(dāng)前頂點(diǎn)之前訪問的頂點(diǎn))音同。alias_edges存儲(chǔ)著在前一個(gè)訪問頂點(diǎn)為t tt,當(dāng)前頂點(diǎn)為v vv時(shí)決定下一次訪問哪個(gè)鄰接點(diǎn)時(shí)需要的alias表秃嗜。


image.png
def get_alias_edge(self, t, v):
    G = self.G    
    p = self.p    
    q = self.q
    unnormalized_probs = []    
    for x in G.neighbors(v):        
        weight = G[v][x].get('weight', 1.0)# w_vx        
        if x == t:# d_tx == 0            
            unnormalized_probs.append(weight/p)        
        elif G.has_edge(x, t):# d_tx == 1            
            unnormalized_probs.append(weight)        
        else:# d_tx == 2            
            unnormalized_probs.append(weight/q)    
    norm_const = sum(unnormalized_probs)    
    normalized_probs = [float(u_prob)/norm_const for u_prob in unnormalized_probs]
    return create_alias_table(normalized_probs)

def preprocess_transition_probs(self):
    G = self.G
    alias_nodes = {}    
    for node in G.nodes():        
        unnormalized_probs = [G[node][nbr].get('weight', 1.0) for nbr in G.neighbors(node)]        
        norm_const = sum(unnormalized_probs)        
        normalized_probs = [float(u_prob)/norm_const for u_prob in unnormalized_probs]                 
        alias_nodes[node] = create_alias_table(normalized_probs)
    alias_edges = {}
    for edge in G.edges():        
        alias_edges[edge] = self.get_alias_edge(edge[0], edge[1])
    self.alias_nodes = alias_nodes    
    self.alias_edges = alias_edges
    return

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末权均,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锅锨,更是在濱河造成了極大的恐慌叽赊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件必搞,死亡現(xiàn)場離奇詭異必指,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)顾画,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門取劫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人研侣,你說我怎么就攤上這事谱邪。” “怎么了庶诡?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵惦银,是天一觀的道長。 經(jīng)常有香客問我,道長扯俱,這世上最難降的妖魔是什么书蚪? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮迅栅,結(jié)果婚禮上殊校,老公的妹妹穿的比我還像新娘。我一直安慰自己读存,他們只是感情好为流,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著让簿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尔当。 梳的紋絲不亂的頭發(fā)上莲祸,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天椭迎,我揣著相機(jī)與錄音,去河邊找鬼侠碧。 笑死抹估,一個(gè)胖子當(dāng)著我的面吹牛弄兜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播替饿,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼视卢!你這毒婦竟也來了踱卵?” 一聲冷哼從身側(cè)響起据过,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绳锅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳞芙,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眷柔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驯嘱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镶苞。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞠评,靈堂內(nèi)的尸體忽然破棺而出茂蚓,到底是詐尸還是另有隱情,我是刑警寧澤谢澈,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布煌贴,位于F島的核電站,受9級特大地震影響锥忿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怠肋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一敬鬓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笙各,春花似錦钉答、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惶楼,卻和暖如春右蹦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歼捐。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工何陆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豹储。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓贷盲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剥扣。 傳聞我的和親對象是個(gè)殘疾皇子巩剖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容