推薦系統實踐筆記——第二章_利用用戶行爲數據

目錄

一、用戶行爲數據簡介

二、用戶行爲分析

三、實驗設計

四、基於鄰域的算法

五、隱語義模型(參考LiuQQu的博客,版權聲明:本文爲CSDN博主「LiuQQu」的原創文章)

六、基於圖的模型(參考LiuQQu的博客,版權聲明:本文爲CSDN博主「LiuQQu」的原創文章)


基於用戶行爲分析的推薦算法是個性化推薦系統的重要算法,學術界一般將這類型的算法稱爲協同過濾算法

一、用戶行爲數據簡介

用戶行爲在推薦系統中一般分兩種,一種是顯性反饋行爲,一種是隱性反饋行爲。顯性反饋行爲包括用戶明確對物品表示喜好的行爲,隱性反饋行爲包括那些不能明確反應用戶喜好的行爲,最具代表性的隱性反饋行爲就是頁面瀏覽行爲。

二、用戶行爲分析

互聯網數據分佈都滿足長尾分佈,在英文單詞的詞頻研究中發現,將單詞的出現頻率按照由高到低排列,則每個單詞出現的頻率和它在熱門排行榜中排名的常數次冪成反比,很多研究人員發現在行爲數據中也蘊含着這種規律。

令fu(k)爲對k個物品產生過行爲的用戶數,令fi(k)爲被k個用戶產生過行爲的物品數。那麼,fu(k)和fi(k)都滿足長尾分佈。

                                                                                  

一般認爲,新用戶傾向於瀏覽熱門物品,因爲他們對網站不熟悉,只能點擊首頁熱門物品,而老用戶逐漸開始瀏覽冷門物品,下圖表明用戶越活躍,越傾向於瀏覽冷門的物品。

僅僅基於用戶行爲數據設計的推薦算法一般稱爲協同過濾算法,包括基於鄰域的方法,隱語義模型,基於圖的隨機遊走算法。其中基於鄰域的算法包含:

  • 基於用戶的協同過濾算法 這種算法給用戶推薦和他興趣相似的其他用戶喜歡的物品。
  • 基於物品的協同過濾算法 這種算法給用戶推薦和他之前喜歡物品相似的物品。

具體算法原理及代碼見算法原理及代碼

三、實驗設計

1.數據集

改文章採用的數據集是GroupLens提供的MovieLens數據集(數據集地址),本章選擇的是中等大小的數據集,該數據集包括6000多用戶對4000多部電影的100萬條評分。

2.實驗設計

協同過濾算法的離線實驗一般如下設計。

首先,將用戶的數據集按照均勻分佈隨機分成M份(本章M=8),挑選一份作爲測試集,將剩下的M-1份作爲訓練集。

然後,在訓練集上建立用戶興趣模型,並在測試集上進行測試,統計出相應的評測指標。

爲了保證評測指標並不是過擬合的結果,需要進行M次實驗,並且每次都使用不同的測試集,然後將M次實驗測出的評測指標的平均值作爲最終的評測指標。

3.評測指標

對用戶u推薦N個物品(記爲R(u)),令用戶u在測試集上喜歡的物品集合爲T(u),然後可以通過準確率/召回率評測推薦算法的精度:

                                                          

                                                         

召回率描述有多少比例的用戶—物品評分記錄包含在最終的推薦列表中,而準確率描述最終的推薦列表中有多少比例是發生過的用戶—物品評分記錄。

覆蓋率反映了推薦算法發掘長尾的能力,覆蓋率越高,說明推薦算法越能夠將長尾中的物品推薦給用戶。

                                              

最後我們還需要評測推薦的新穎度,這裏推薦列表中物品的平均流行度度量推薦結果的新穎度。如果推薦出的物品都很熱門,說明新穎度較低,否則說明推薦結果比較新穎。

def Popularity(train, test, N):
    item_popularity = dict()
    for user, items in train.items():
        for item in items.keys()
            if item not in item_popularity:
                item_popularity[item] = 0
            item_popularity[item] += 1
    ret = 0
    n = 0
    for user in train.keys():
        rank = GetRecommendation(user, N)
        for item, pui in rank:
            ret += math.log(1 + item_popularity[item])
            n += 1
    ret /= n * 1.0
    return ret

四、基於鄰域的算法

UserCF和IemCF的綜合比較。

 

五、隱語義模型(參考LiuQQu的博客,版權聲明:本文爲CSDN博主「LiuQQu」的原創文章)

隱語義模型(LFM,latent factor model)的核心思想是通過隱含特徵(latent factor)聯繫用戶興趣和物品。

對於某個用戶,首先得到他的興趣分類,然後從分類中挑選他可能喜歡的物品。

總結一下,這個基於興趣分類的方法大概需要解決3個問題。

(1)如何給物品進行分類?

(2)如何確定用戶對哪些類的物品感興趣,以及感興趣的程度?

(3)對於一個給定的類,選擇哪些屬於這個類的物品推薦給用戶,以及如何確定這些物品在一個類中的權重?

對於第一個問題:如何給物品進行分類?

簡單解決方案是找編輯給物品分類,編輯給出的分類仍然具有以下缺點:

a、編輯的意見不能代表各種用戶的意見。

b、編輯很難控制分類的粒度。

c、編輯很難給一個物品多個分類。

d、編輯很難給出多維度的分類。

e、編輯很難決定一個物品在某一個分類中的權重。

研究人員提出:爲什麼我們不從數據出發,自動地找到那些類,然後進行個性化推薦?於是,隱含語義分析技術(latent variable analysis)出現了。隱含語義分析技術因爲採取基於用戶行爲統計的自動聚類,較好地解決了上面提出的5個問題。

a、編輯的意見不能代表各種用戶的意見,但隱含語義分析技術的分類來自對用戶行爲的統計,代表了用戶對物品分類的看法。隱含語義分析技術和ItemCF在物品分類方面的思想類似,如果兩個物品被很多用戶同時喜歡,那麼這兩個物品就很有可能屬於同一個類。
b、編輯很難控制分類的粒度,但隱含語義分析技術允許我們指定最終有多少個分類,這個數字越大,分類的粒度就會越細,反正分類粒度就越粗。
c、編輯很難給一個物品多個分類,但隱含語義分析技術會計算出物品屬於每個類的權重,因此每個物品都不是硬性地被分到某一個類中。
d、編輯很難給出多維度的分類,但隱含語義分析技術給出的每個分類都不是同一個維度的,它是基於用戶的共同興趣計算出來的,如果用戶的共同興趣是某一個維度,那麼LFM給出的類也是相同的維度。
e、編輯很難決定一個物品在某一個分類中的權重,但隱含語義分析技術可以通過統計用戶行爲決定物品在每個類中的權重,如果喜歡某個類的用戶都會喜歡某個物品,那麼這個物品在這個類中的權重就可能比較高。

相關方法:pLSA、LDA、隱含類別模型(latent class model)、隱含主題模型(latent topic model)、矩陣分解(matrix factorization

LFM通過如下公式計算用戶u對物品i的興趣:

這個公式中pu,k 和qi,k 是模型的參數,其中pu,k 度量了用戶u的興趣和第k個隱類的關係,而qi,k 度量了第k個隱類和物品i之間的關係。

在隱性反饋數據集上應用LFM解決TopN推薦的第一個關鍵問題就是如何給每個用戶生成負樣本。

對負樣本採樣時應該遵循以下原則。

(1)對每個用戶,要保證正負樣本的平衡(數目相似)。

(2)對每個用戶採樣負樣本時,要選取那些很熱門,而用戶卻沒有行爲的物品。

很熱門而用戶卻沒有行爲更加代表用戶對這個物品不感興趣。因爲對於冷門的物品,用戶可能是壓根沒在網站中發現這個物品,所以談不上是否感興趣。
隱語義模型和基於領域的方法的比較

六、基於圖的模型(參考LiuQQu的博客,版權聲明:本文爲CSDN博主「LiuQQu」的原創文章)

如果將個性化推薦算法放到二分圖模型上,那麼給用戶u推薦物品的任務就可以轉化爲度量用戶頂點vu和與vu沒有邊直接相連的物品節點在圖上的相關性,相關性越高的物品在推薦列表中的權重就越高。

圖中頂點的相關性主要取決於下面3個因素:

(1)兩個頂點之間的路徑數;

(2)兩個頂點之間路徑的長度;

(3)兩個頂點之間的路徑經過的頂點。

相關性高的一對頂點一般具有如下特徵:

(1)兩個頂點之間有很多路徑相連;

(2)連接兩個頂點之間的路徑長度都比較短;

(3)連接兩個頂點之間的路徑不會經過出度比較大的頂點。

基於隨機遊走的PersonalRank算法

假設要給用戶u進行個性化推薦,可以從用戶u對應的節點vu開始在用戶物品二分圖上進行隨機遊走。遊走到任何一個節點時,首先按照概率α決定是繼續遊走,還是停止這次遊走並從vu節點開始重新遊走。如果決定繼續遊走,那麼就從當前節點指向的節點中按照均勻分佈隨機選擇一個節點作爲遊走下次經過的節點。這樣,經過很多次隨機遊走後,每個物品節點被訪問到的概率會收斂到一個數。最終的推薦列表中物品的權重就是物品節點的訪問概率。

                                    

雖然PersonalRank算法可以通過隨機遊走進行比較好的理論解釋,但該算法在時間複雜度上有明顯的缺點。因爲在爲每個用戶進行推薦時,都需要在整個用戶物品二分圖上進行迭代,直到整個圖上的每個頂點的PR值收斂。這一過程的時間複雜度非常高,不僅無法在線提供實時推薦,甚至離線生成推薦結果也很耗時。

解決PersonalRank時間複雜度很高的方案:(1)減少迭代次數,在收斂之前就停止。這樣會影響最終的精度,但一般來說影響不會特別大。(2)從矩陣論出發,重新設計算法。
 

 

發佈了16 篇原創文章 · 獲贊 1 · 訪問量 8028
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章