【召回】swing 算法

基于圖結(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容