1. 程式人生 > >推薦系統實踐(二) -- 利用使用者行為資料進行推薦(協同過濾)

推薦系統實踐(二) -- 利用使用者行為資料進行推薦(協同過濾)

本篇的思維導圖如下:

1、使用者行為資料

使用者行為資料在網站上最簡單的存在形式就是日誌,比如使用者在電子商務網站中的網頁瀏覽、購買、點選、評分和評論等活動。
使用者行為在個性化推薦系統中一般分兩種——顯性反饋行為(explicit feedback)和隱性反饋 行為(implicit feedback)。顯性反饋行為包括使用者明確表示對物品喜好的行為。網站中收集顯性反饋的主要方式就是評分和喜歡/不喜歡。隱性反饋行為指的是那些不能明確反應使用者喜好 的行為。最具代表性的隱性反饋行為就是頁面瀏覽行為。
按照反饋的明確性分,使用者行為資料可以分為顯性反饋和隱性反饋,但按照反饋的方向分, 又可以分為正反饋和負反饋。正反饋指使用者的行為傾向於指使用者喜歡該物品,而負反饋指使用者的 行為傾向於指使用者不喜歡該物品。在顯性反饋中,很容易區分一個使用者行為是正反饋還是負反饋, 而在隱性反饋行為中,就相對比較難以確定。

2、使用者行為分析

在利用使用者行為資料設計推薦演算法之前,研究人員首先需要對使用者行為資料進行分析,瞭解 資料中蘊含的一般規律,這樣才能對演算法的設計起到指導作用。

2.1 使用者活躍度和物品流行度

很多關於網際網路資料的研究發現,網際網路上的很多資料分佈都滿足一種稱為Power Law3的分佈,這個分佈在網際網路領域也稱長尾分佈

如果定義物品的流行度K為被K個使用者產生過行為,而使用者的活躍度K定義為對K個物品產生過行為,那麼二者的分佈大概如下圖所示(橫軸代表物品的流行度/使用者的活躍度,縱軸代表物品數/使用者數):

物品流行度長尾分佈使用者活躍度長尾分佈

可以看到,不管是物品的流行度還是使用者的活躍度,都近似於長尾分佈。

2.2 使用者活躍度和物品流行度的關係

一般認為,新使用者傾向於瀏覽熱門的物品,因為他 們對網站還不熟悉,只能點選首頁的熱門物品,而老使用者會逐漸開始瀏覽冷門的物品。如果用橫座標表示使用者活躍度,縱座標表示具有某個活躍度的所有使用者評過分的物品的平均流行度。圖中曲線呈明顯下 降的趨勢,這表明使用者越活躍,越傾向於瀏覽冷門的物品。

僅僅基於使用者行為資料設計的推薦演算法一般稱為協同過濾演算法。學術界對協同過濾演算法進行了深入研究,提出了很多方法,比如基於鄰域的方法(neighborhood-based)、隱語義模型 (latent factor model)、基於圖的隨機遊走演算法(random walk on graph)等。在這些方法中, 最著名的、在業界得到最廣泛應用的演算法是基於鄰域的方法,而基於鄰域的方法主要包含下
面兩種演算法。
1、基於使用者的協同過濾演算法

:這種演算法給使用者推薦和他興趣相似的其他使用者喜歡的物品。
2、 基於物品的協同過濾演算法: 這種演算法給使用者推薦和他之前喜歡的物品相似的物品。

3、基於鄰域的演算法

基於鄰域的演算法是推薦系統中最基本的演算法,該演算法不僅在學術界得到了深入研究,而且在 業界得到了廣泛應用。基於鄰域的演算法分為兩大類,一類是基於使用者的協同過濾演算法,另一類是 基於物品的協同過濾演算法。現在我們所說的協同過濾,基本上就就是指基於使用者或者是基於物品的協同過濾演算法,因此,我們可以說基於鄰域的演算法即是我們常說的協同過濾演算法。

3.1 基於使用者的協同過濾演算法(UserCF)

基於使用者的協同過濾演算法的基本思想是:在一個線上個性化推薦系統中,當一個使用者A需要個性化推薦 時,可以先找到和他有相似興趣的其他使用者,然後把那些使用者喜歡的、而使用者A沒有聽說過的物品推薦給A。

從上面的描述中可以看到,基於使用者的協同過濾演算法主要包括兩個步驟。
(1) 找到和目標使用者興趣相似的使用者集合。
(2) 找到這個集合中的使用者喜歡的,且目標使用者沒有聽說過的物品推薦給目標使用者。

這裡,步驟1的關鍵是計算兩個使用者的興趣相似度,協同過濾演算法主要利用行為的相似度計算興趣的相似度。給定使用者u和使用者v,令N(u)表示使用者u曾經有過正反饋的物品集合,令N(v) 為使用者v曾經有過正反饋的物品集合。那麼我們可以通過以下兩種方法計算使用者的相似度:

基於Jaccard公式基於餘弦相似度

餘弦相似度為什麼是上面這種寫法呢,因為這裡,我們並不是用的使用者對物品的評分,而是用的0-1表示,所以對兩個集合做交集,相當於進行了點乘。如果我們的矩陣是使用者對物品的評分,那麼計算餘弦相似度的時候可以利用使用者的具體評分而不是0-1值。

如果簡單的基於餘弦相似度,顯得過於粗糙,以圖書為例,如果兩個使用者都曾經買過《新華字典》,這絲毫不能說明他們興趣相似, 因為絕大多數中國人小時候都買過《新華字典》。但如果兩個使用者都買過《資料探勘導論》,那可 以認為他們的興趣比較相似,因為只有研究資料探勘的人才會買這本書。換句話說,兩個使用者對冷門物品採取過同樣的行為更能說明他們興趣的相似度,因此,我們可以基於物品的流行度對熱門物品進行一定的懲罰:

得到使用者之間的興趣相似度後,UserCF演算法會給使用者推薦和他興趣最相似的K個使用者喜歡的 物品。如下的公式度量了UserCF演算法中使用者u對物品i的感興趣程度:

其中,S(u, K)包含和使用者u興趣最接近的K個使用者,N(i)是對物品i有過行為的使用者集合,wuv 是使用者u和使用者v的興趣相似度,rvi代表使用者v對物品i的興趣.

3.2 基於物品的協同過濾演算法(ItemCF)

UserCF在一些網站(如Digg)中得到了應用,但該演算法有一些缺點。首先, 隨著網站的使用者數目越來越大,計算使用者興趣相似度矩陣將越來越困難,其運算時間複雜度和空間複雜度的增長和使用者數的增長近似於平方關係。其次,基於使用者的協同過濾很難對推薦結果作出解釋。因此,著名的電子商務公司亞馬遜提出了另一個演算法——基於物品的協同過濾演算法。
基於物品的協同過濾演算法(簡稱ItemCF)給使用者推薦那些和他們之前喜歡的物品相似的物品。 比如,該演算法會因為你購買過《資料探勘導論》而給你推薦《機器學習》。不過,ItemCF演算法並不利用物品的內容屬性計算物品之間的相似度,它主要通過分析使用者的行為記錄計算物品之間的相似度。該演算法認為,物品A和物品B具有很大的相似度是因為喜歡物品A的使用者大都也喜歡物品 B。

基於物品的協同過濾演算法主要分為兩步。
(1) 計算物品之間的相似度。
(2) 根據物品的相似度和使用者的歷史行為給使用者生成推薦列表。

ItemCF的第一步是計算物品之間的相似度,在網站中,我們經常看到這麼一句話:Customers Who Bought This Item Also Bought,那麼從這句話的定義出發,我們可以用下面的公式定義物品相似度:

這裡,分母|N(i)|是喜歡物品i的使用者數,而分子 N(i)N(j) 是同時喜歡物品i和物品j的使用者 數。因此,上述公式可以理解為喜歡物品i的使用者中有多少比例的使用者也喜歡物品j。但是卻存在一個問題。如果物品j很熱門,很多人都喜歡,
那麼Wij就會很大,接近1。因此,該公式會造成任何物品都會和熱門的物品有很大的相似度,這 對於致力於挖掘長尾資訊的推薦系統來說顯然不是一個好的特性。為了避免推薦出熱門的物品,可以用下面的公式:

這裡由於還是0-1的原因,我們的餘弦相似度可以寫成上面的形式。但是,是不是每個使用者的貢獻都相同呢? 假設有這麼一個使用者,他是開書店的,並且買了噹噹網上80%的書準備用來自己賣。那麼, 他的購物車裡包含噹噹網80%的書。假設噹噹網有100萬本書,也就是說他買了80萬本。從前面 對ItemCF的討論可以看到,這意味著因為存在這麼一個使用者,有80萬本書兩兩之間就產生了相似度。這個使用者雖然活躍,但是買這些書並非都是出於自身的興趣,而且這些書覆 蓋了噹噹網圖書的很多領域,所以這個使用者對於他所購買書的兩兩相似度的貢獻應該遠遠小於一個只買了十幾本自己喜歡的書的文學青年。因此,我們要對這樣的使用者進行一定的懲罰,John S. Breese在論文1中提出了一個稱為IUF(Inverse User Frequence),即使用者活躍度對數的 倒數的引數,他也認為活躍使用者對物品相似度的貢獻應該小於不活躍的使用者,他提出應該增加IUF引數來修正物品相似度的計算公式:

在得到物品之間的相似度後,ItemCF通過如下公式計算使用者u對一個物品j的興趣:

這裡N(u)是使用者喜歡的物品的集合,S(j,K)是和物品j最相似的K個物品的集合,wji是物品j和i 的相似度,rui是使用者u對物品i的興趣。

3.3 UserCF和ItemCF的比較

首先我們提出一個問題,為什麼新聞網站一般使用UserCF,而圖書、電商網站一般使用ItemCF呢?
首先回顧一下UserCF演算法和ItemCF演算法的推薦原理。UserCF給使用者推薦那些和他有共同興 趣愛好的使用者喜歡的物品,而ItemCF給使用者推薦那些和他之前喜歡的物品類似的物品。從這個算 法的原理可以看到,UserCF的推薦結果著重於反映和使用者興趣相似的小群體的熱點,而ItemCF 的推薦結果著重於維繫使用者的歷史興趣。換句話說,UserCF的推薦更社會化,反映了使用者所在的小型興趣群體中物品的熱門程度,而ItemCF的推薦更加個性化,反映了使用者自己的興趣傳承。
在新聞網站中,使用者的興趣不是特別細化,絕大多數使用者都喜歡看熱門的新聞。個性化新聞推薦更加強調抓住 新聞熱點,熱門程度和時效性是個性化新聞推薦的重點,而個性化相對於這兩點略顯次要。因 此,UserCF可以給使用者推薦和他有相似愛好的一群其他使用者今天都在看的新聞,這樣在抓住熱 點和時效性的同時,保證了一定程度的個性化。同時,在新聞網站中,物品的更新速度遠遠快於新使用者的加入速度,而且 對於新使用者,完全可以給他推薦最熱門的新聞,因此UserCF顯然是利大於弊。

但是,在圖書、電子商務和電影網站,比如亞馬遜、豆瓣、Netflix中,ItemCF則能極大地發 揮優勢。首先,在這些網站中,使用者的興趣是比較固定和持久的。一個技術人員可能都是在購買 技術方面的書,而且他們對書的熱門程度並不是那麼敏感,事實上越是資深的技術人員,他們看 的書就越可能不熱門。此外,這些系統中的使用者大都不太需要流行度來輔助他們判斷一個物品的 好壞,而是可以通過自己熟悉領域的知識自己判斷物品的質量。因此,這些網站中個性化推薦的 任務是幫助使用者發現和他研究領域相關的物品。因此,ItemCF演算法成為了這些網站的首選演算法。 此外,這些網站的物品更新速度不會特別快,一天一次更新物品相似度矩陣對它們來說不會造成 太大的損失,是可以接受的。同時,從技術上考慮,UserCF需要維護一個使用者相似度的矩陣,而ItemCF需要維護一個物品 相似度矩陣。從儲存的角度說,如果使用者很多,那麼維護使用者興趣相似度矩陣需要很大的空間, 同理,如果物品很多,那麼維護物品相似度矩陣代價較大。

下表是對二者的一個全面的比較:

4、隱語義模型

隱語義模型是最近幾年推薦系統領域最為熱門的研究話題,它的核心思想是通過隱含特徵 (latent factor)聯絡使用者興趣和物品。
使用隱語義模型的基本思路是:對於某個使用者,首先得到他的興趣分類,然後從分類中挑選他可能喜歡的物品。那麼這個方法大概需要解決三個問題:
1、 如何給物品進行分類?
2、 如何確定使用者對哪些類的物品感興趣,以及感興趣的程度?
3、 對於一個給定的類,選擇哪些屬於這個類的物品推薦給使用者,以及如何確定這些物品在一個類中的權重?

隱含語義分析技術從誕生到今天產生了很多著名的模型和方法,其中和該技術相關且耳熟能 詳的名詞有pLSA、LDA、隱含類別模型(latent class model)、隱含主題模型(latent topic model)、 矩陣分解(matrix factorization)。這些技術和方法在本質上是相通的,其中很多方法都可以用於 個性化推薦系統。我們將以LFM為例介紹隱含語義分析技術在推薦系統中的應用。
LFM通過如下公式計算使用者u對物品i的興趣:

這個公式中 pu,k 和 qi,k 是模型的引數,其中 pu,k 度量了使用者u的興趣和第k個隱類的關係,而 qi,k 度量了第k個隱類和物品i之間的關係。那麼,下面的問題就是如何計算這兩個引數。
對最優化理論或者機器學習有所瞭解的讀者,可能對如何計算這兩個引數都比較清楚。這兩 個引數是從資料集中計算出來的。要計算這兩個引數,需要一個訓練集,對於每個使用者u,訓練 集裡都包含了使用者u喜歡的物品和不感興趣的物品,通過學習這個資料集,就可以獲得上面的模型引數。我們可以通過最小化下面的損失函式來得到最合適的p和q:

上面的式子中,後面的兩項是為了防止過擬合的正則化項,求解上面的式子可以使用隨機梯度下降來得到,這裡就不再贅述。

LFM模型在實際使用中有一個困難,那就是它很難實現實時的推薦。經典的LFM模型 每次訓練時都需要掃描所有的使用者行為記錄,這樣才能計算出使用者隱類向量(pu)和物品隱類向 量(qi)。而且LFM的訓練需要在使用者行為記錄上反覆迭代才能獲得比較好的效能。

5、基於圖的模型

使用者行為很容易用二分圖表示,因此很多圖的演算法都可以用到推薦系統中。
令G(V,E)表示使用者物品二分圖,其中V VU VI 由使用者頂點集合VU 和物品頂點集合VI 組成。對於資料集中每一個二元組(u, i),圖中都有一套對應的邊 e(vu ,vi ) ,其中 vu∈VU 是使用者u 對應的頂點∈vi VI 是物品i對應的頂點。下圖是一個簡單的使用者物品二分圖模型,其中圓形節 3 點代表使用者,方形節點代表物品,圓形節點和方形節點之間的邊代表使用者對物品的行為。比如圖 中使用者節點A和物品節點a、b、d相連,說明使用者A對物品a、b、d產生過行為。

在得到二分圖之後,推薦的任務就變為度量使用者頂點 vu和與vu沒有邊直接相連的物品節點在圖上的相關性,相關性越高的物品在推薦列表中的權重就越高。圖中兩個頂點的相關性主要取決於下面三個因素:
1、 兩個頂點之間的路徑數;
2、 兩個頂點之間路徑的長度;
3、 兩個頂點之間的路徑經過的頂點。

而相關性高的一對頂點一般具有如下特徵:
1、 兩個頂點之間有很多路徑相連;
2、 連線兩個頂點之間的路徑長度都比較短;
3、 連線兩個頂點之間的路徑不會經過出度比較大的頂點。

基於上面3個主要因素,本節介紹的是一種基於隨機遊走的PersonalRank演算法:假設要給使用者u進行個性化推薦,可以從使用者u對應的節點vu開始在使用者物品二分圖上進行隨 機遊走。遊走到任何一個節點時,首先按照概率α決定是繼續遊走,還是停止這次遊走並從vu節 點開始重新遊走。如果決定繼續遊走,那麼就從當前節點指向的節點中按照均勻分佈隨機選擇一 個節點作為遊走下次經過的節點。這樣,經過很多次隨機遊走後,每個物品節點被訪問到的概率 會收斂到一個數。最終的推薦列表中物品的權重就是物品節點的訪問概率。如果將上面的描述表示成公式,可以得到如下公式: