基于圖結(jié)構(gòu)的實(shí)時(shí)推薦算法 Swing,能夠計(jì)算 item-item 之間的相似性。Swing 指的是秋千,用戶和物品的二部圖中會(huì)存在很多這種秋千,例如 (u1,u2,i1), 即用戶 1 和 2 都購(gòu)買過(guò)物品 i,三者構(gòu)成一個(gè)秋千 (三角形缺一條邊)。這實(shí)際上是 3 階交互關(guān)系。傳統(tǒng)的啟發(fā)式近鄰方法只關(guān)注用戶和物品之間的二階交互關(guān)系。Swing 會(huì)關(guān)注這種 3 階關(guān)系。這種方法的一個(gè)直覺(jué)來(lái)源于,如果多個(gè) user 在點(diǎn)擊了 i1 的同時(shí),都只共同點(diǎn)了某一個(gè)其他的 i2,那么 i1 和 i2 一定是強(qiáng)關(guān)聯(lián)的,這種未知的強(qiáng)關(guān)聯(lián)關(guān)系相當(dāng)于是通過(guò)用戶來(lái)傳遞的。另一方面,如果兩個(gè) user pair 對(duì)之間構(gòu)成的 swing 結(jié)構(gòu)越多,則每個(gè)結(jié)構(gòu)越弱,在這個(gè) pair 對(duì)上每個(gè)節(jié)點(diǎn)分到的權(quán)重越低。公式如下:

為了衡量物品 i 和 j 的相似性,考察都購(gòu)買了物品 i? 和 j? 的用戶 u? 和 v?, 如果這兩個(gè)用戶共同購(gòu)買的物品越少,則物品 i? 和 j? 的相似性越高。極端情況下,兩個(gè)用戶都購(gòu)買了某個(gè)物品,且兩個(gè)用戶所有購(gòu)買的物品中,共同購(gòu)買的物品只有這兩個(gè),說(shuō)明這兩個(gè)用戶興趣差異非常大,然而卻同時(shí)購(gòu)買了這兩個(gè)物品,則說(shuō)明這兩個(gè)物品相似性非常大!
思考:為何swing 算法的召回結(jié)果會(huì)更好
1:svd, CF 等算法在對(duì)對(duì)用戶行為進(jìn)行一層抽象
2:打分近似, 矩陣近似計(jì)算
3:svd, CF數(shù)據(jù)稀疏問(wèn)題
4:swing 算法基于二步圖,對(duì)用戶和商品行為進(jìn)行了直接建模,其原理和思想更加貼近實(shí)際用戶特征
關(guān)鍵代碼

def SwingRecall(u2items):
u2Swing = defaultdict(lambda:dict())
for u in u2items:
wu = pow(len(u2items[u])+5,-0.35)
for v in u2items:
if v == u:
continue
wv = wu*pow(len(u2items[v])+5,-0.35)
inter_items = set(u2items[u]).intersection(set(u2items[v]))
for i in inter_items:
for j in inter_items:
if j==i:
continue
if j not in u2Swing[i]:
u2Swing[i][j] = 0
u2Swing[i][j] += wv/(1+len(inter_items))
# break
return u2Swing