基于圖結(jié)構(gòu)的實時推薦算法 Swing,能夠計算 item-item 之間的相似性局扶。Swing 指的是秋千吉执,用戶和物品的二部圖中會存在很多這種秋千挺益,例如 (u1,u2,i1), 即用戶 1 和 2 都購買過物品 i涕蚤,三者構(gòu)成一個秋千 (三角形缺一條邊)宪卿。這實際上是 3 階交互關(guān)系。傳統(tǒng)的啟發(fā)式近鄰方法只關(guān)注用戶和物品之間的二階交互關(guān)系万栅。Swing 會關(guān)注這種 3 階關(guān)系佑钾。這種方法的一個直覺來源于,如果多個 user 在點擊了 i1 的同時烦粒,都只共同點了某一個其他的 i2休溶,那么 i1 和 i2 一定是強關(guān)聯(lián)的,這種未知的強關(guān)聯(lián)關(guān)系相當于是通過用戶來傳遞的扰她。另一方面兽掰,如果兩個 user pair 對之間構(gòu)成的 swing 結(jié)構(gòu)越多,則每個結(jié)構(gòu)越弱义黎,在這個 pair 對上每個節(jié)點分到的權(quán)重越低。公式如下:
為了衡量物品 i 和 j 的相似性豁跑,考察都購買了物品 i? 和 j? 的用戶 u? 和 v?廉涕, 如果這兩個用戶共同購買的物品越少泻云,則物品 i? 和 j? 的相似性越高。極端情況下狐蜕,兩個用戶都購買了某個物品宠纯,且兩個用戶所有購買的物品中,共同購買的物品只有這兩個层释,說明這兩個用戶興趣差異非常大婆瓜,然而卻同時購買了這兩個物品,則說明這兩個物品相似性非常大贡羔!
思考:為何swing 算法的召回結(jié)果會更好
1:svd, CF 等算法在對對用戶行為進行一層抽象
2:打分近似廉白, 矩陣近似計算
3:svd, CF數(shù)據(jù)稀疏問題
4:swing 算法基于二步圖,對用戶和商品行為進行了直接建模乖寒,其原理和思想更加貼近實際用戶特征
關(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