1. 程式人生 > >推薦系統之協同過濾(CF)演算法

推薦系統之協同過濾(CF)演算法

一,集體智慧(社會計算):
集體智慧 (Collective Intelligence) 並不是 Web2.0 時代特有的,只是在Web2.0 時代,大家在 Web 應用中,利用集體智慧構建了更加有趣的應用或者得到更好的使用者體驗。集體智慧是指在大量的人群行為和資料中收集答案,幫助你得到針對整個人群的統計意義上的結論,這些結論是我們在單個個體上無法得到的,它往往是某種趨勢或者人群中共性的部分。
Wikipedia 和 Google 是兩個典型利用集體智慧的 Web 2.0 應用:
1,Wikipedia 是一個知識管理的百科全書,相對於傳統的由領域專家編輯的百科全書,Wikipedia 允許終端使用者貢獻知識,隨著參與人數的增多,Wikipedia 變成了涵蓋各個領域的一本無比全面的知識庫。也許有人會質疑它的權威性,但如果你從另一個側面想這個問題,也許就可以迎刃而解。在發行一本書時,作者雖然是權威,但難免還有一些錯誤,然後通過一版一版的改版,書的內容越來越完善。而在 Wikipedia 上,這種改版和修正被變為每個人都可以做的事情,任何人發現錯誤或者不完善都可以貢獻他們的想法,即便某些資訊是錯誤的,但它一定也會盡快的被其他人糾正過來。從一個巨集觀的角度看,整個系統在按照一個良性迴圈的軌跡不斷完善,這也正是集體智慧的魅力。
2,Google:目前最流行的搜尋引擎,與 Wikipedia 不同,它沒有要求使用者顯式的貢獻,但仔細想想 Google 最核心的PageRank的思想:*

利用了 Web 頁面之間的關係,將其他頁面連結到當前頁面的數目作為衡量當前頁面重要與否的標準*;如果這不好理解,那麼你可以把它想象成一個選舉的過程,每個 Web 頁面都是一個投票者同時也是一個被投票者,PageRank 通過一定數目的迭代得到一個相對穩定的評分。Google 其實利用了現在 Internet 上所有 Web 頁面上鍊接的集體智慧,找到哪些頁面是重要的。

二,協同過濾
協同過濾是利用集體智慧的一個典型方法。要理解什麼是協同過濾 (Collaborative Filtering, 簡稱 CF),首先想一個簡單的問題,如果你現在想看個電影,但你不知道具體看哪部,你會怎麼做?大部分的人會問問周圍的朋友,看看最近有什麼好看的電影推薦,而我們一般更傾向於從口味比較類似的朋友那裡得到推薦。這就是協同過濾的核心思想。
協同過濾一般是在海量的使用者中發掘出一小部分和你品位比較類似的,在協同過濾中,這些使用者成為鄰居,然後根據他們喜歡的其他東西組織成一個排序的目錄作為推薦給你。

當然其中有一個核心的問題:
1,如何確定一個使用者是不是和你有相似的品位?
2,如何將鄰居們的喜好組織成一個排序的目錄?
協同過濾相對於集體智慧而言,它從一定程度上保留了個體的特徵,就是你的品位偏好,所以它更多可以作為個性化推薦的演算法思想。可以想象,這種推薦策略在 Web 2.0 的長尾中是很重要的,將大眾流行的東西推薦給長尾中的人怎麼可能得到好的效果,這也回到推薦系統的一個核心問題:瞭解你的使用者,然後才能給出更好的推薦。
三, 深入協同過濾的核心
我們將深入分析協同過濾的原理,介紹基於協同過濾思想的多種推薦機制,優缺點和實用場景。首先,要實現協同過濾,需要一下幾個步驟
①,收集使用者偏好
②,找到相似的使用者或物品
③,計算推薦

1,收集使用者偏好
要從使用者的行為和偏好中發現規律,並基於此給予推薦,如何收集使用者的偏好資訊成為決定系統推薦效果的最基礎因素。使用者有很多方式向系統提供自己的偏好資訊,而且不同的應用也可能大不相同,下面舉例進行介紹:
這裡寫圖片描述
以上列舉的使用者行為都是比較通用的,推薦引擎設計人員可以根據自己應用的特點新增特殊的使用者行為,並用他們表示使用者對物品的喜好。
在一般應用中,我們提取的使用者行為一般都多於一種,關於如何組合這些不同的使用者行為,基本上有以下兩種方式:
①,將不同的行為分組:一般可以分為“檢視”和“購買”等等,然後基於不同的行為,計算不同的使用者 / 物品相似度。類似於噹噹網或者 Amazon 給出的“購買了該圖書的人還購買了 …”,“查看了圖書的人還查看了 …”
②,根據不同行為反映使用者喜好的程度將它們進行加權,得到使用者對於物品的總體喜好。一般來說,顯式的使用者反饋比隱式的權值大,但比較稀疏,畢竟進行顯示反饋的使用者是少數;同時相對於“檢視”,“購買”行為反映使用者喜好的程度更大,但這也因應用而異。
收集了使用者行為資料,我們還需要對資料進行一定的預處理,其中最核心的工作就是:減噪和歸一化。
減噪:使用者行為資料是使用者在使用應用過程中產生的,它可能存在大量的噪音和使用者的誤操作,我們可以通過經典的資料探勘演算法過濾掉行為資料中的噪音,這樣可以使我們的分析更加精確。
歸一化:如前面講到的,在計算使用者對物品的喜好程度時,可能需要對不同的行為資料進行加權。但可以想象,不同行為的資料取值可能相差很大,比如,使用者的檢視資料必然比購買資料大的多,如何將各個行為的資料統一在一個相同的取值範圍中,從而使得加權求和得到的總體喜好更加精確,就需要我們進行歸一化處理。最簡單的歸一化處理,就是將各類資料除以此類中的最大值,以保證歸一化後的資料取值在 [0,1] 範圍中。
進行預處理後,根據不同應用的行為分析方法,可以選擇分組或者加權處理,之後我們可以得到一個使用者偏好的二維矩陣,一維是使用者列表,另一維是物品列表,值是使用者對物品的偏好,一般是 [0,1] 或者 [-1, 1] 的浮點數值。
2,找到相似的使用者或物品
當已經對使用者行為進行分析得到使用者喜好後,我們可以根據使用者喜好計算相似使用者和物品,然後基於相似使用者或者物品進行推薦,這就是最典型的 CF 的兩個分支:基於使用者的 CF 和基於物品的 CF。這兩種方法都需要計算相似度,下面我們先看看最基本的幾種計算相似度的方法。
相似度的計算
關於相似度的計算,現有的幾種基本方法都是基於向量(Vector)的,其實也就是計算兩個向量的距離,距離越近相似度越大。在推薦的場景中,在使用者 - 物品偏好的二維矩陣中,我們可以將一個使用者對所有物品的偏好作為一個向量來計算使用者之間的相似度,或者將所有使用者對某個物品的偏好作為一個向量來計算物品之間的相似度。下面我們詳細介紹幾種常用的相似度計算方法:
歐幾里德距離(Euclidean Distance)
最初用於計算歐幾里德空間中兩個點的距離,假設 x,y 是 n 維空間的兩個點,它們之間的歐幾里德距離是:
這裡寫圖片描述
可以看出,當 n=2 時,歐幾里德距離就是平面上兩個點的距離。
當用歐幾里德距離表示相似度,一般採用以下公式進行轉換:距離越小,相似度越大
這裡寫圖片描述
皮爾遜相關係數(Pearson Correlation Coefficient)
皮爾遜相關係數一般用於計算兩個定距變數間聯絡的緊密程度,它的取值在 [-1,+1] 之間。
這裡寫圖片描述
sx, sy是 x 和 y 的樣品標準偏差。
Cosine 相似度(Cosine Similarity)
 Cosine 相似度被廣泛應用於計算文件資料的相似度:
 這裡寫圖片描述
Tanimoto 係數(Tanimoto Coefficient)
Tanimoto 係數也稱為 Jaccard 係數,是 Cosine 相似度的擴充套件,也多用於計算文件資料的相似度:
這裡寫圖片描述
相似鄰居的計算
 介紹完相似度的計算方法,下面我們看看如何根據相似度找到使用者 - 物品的鄰居,常用的挑選鄰居的原則可以分為兩類:圖 1 給出了二維平面空間上點集的示意圖。
 固定數量的鄰居:K-neighborhoods 或者 Fix-size neighborhoods
 不論鄰居的“遠近”,只取最近的 K 個,作為其鄰居。如圖 1 中的 A,假設要計算點 1 的 5- 鄰居,那麼根據點之間的距離,我們取最近的 5 個點,分別是點 2,點 3,點 4,點 7 和點 5。但很明顯我們可以看出,這種方法對於孤立點的計算效果不好,因為要取固定個數的鄰居,當它附近沒有足夠多比較相似的點,就被迫取一些不太相似的點作為鄰居,這樣就影響了鄰居相似的程度,比如圖 1 中,點 1 和點 5 其實並不是很相似。
 基於相似度門檻的鄰居:Threshold-based neighborhoods
  與計算固定數量的鄰居的原則不同,基於相似度門檻的鄰居計算是對鄰居的遠近進行最大值的限制,落在以當前點為中心,距離為 K 的區域中的所有點都作為當前點的鄰居,這種方法計算得到的鄰居個數不確定,但相似度不會出現較大的誤差。如圖 1 中的 B,從點 1 出發,計算相似度在 K 內的鄰居,得到點 2,點 3,點 4 和點 7,這種方法計算出的鄰居的相似度程度比前一種優,尤其是對孤立點的處理。
計算推薦
經過前期的計算已經得到了相鄰使用者和相鄰物品,下面介紹如何基於這些資訊為使用者進行推薦。本系列的上一篇綜述文章已經簡要介紹過基於協同過濾的推薦演算法可以分為基於使用者的 CF 和基於物品的 CF,下面我們深入這兩種方法的計算方法,使用場景和優缺點。
基於使用者的 CF(User CF)
  基於使用者的 CF 的基本思想相當簡單,基於使用者對物品的偏好找到相鄰鄰居使用者,然後將鄰居使用者喜歡的推薦給當前使用者。計算上,就是將一個使用者對所有物品的偏好作為一個向量來計算使用者之間的相似度,找到 K 鄰居後,根據鄰居的相似度權重以及他們對物品的偏好,預測當前使用者沒有偏好的未涉及物品,計算得到一個排序的物品列表作為推薦。圖 2 給出了一個例子,對於使用者 A,根據使用者的歷史偏好,這裡只計算得到一個鄰居 - 使用者 C,然後將使用者 C 喜歡的物品 D 推薦給使用者 A。
基於物品的 CF(Item CF)
  基於物品的 CF 的原理和基於使用者的 CF 類似,只是在計算鄰居時採用物品本身,而不是從使用者的角度,即基於使用者對物品的偏好找到相似的物品,然後根據使用者的歷史偏好,推薦相似的物品給他。從計算的角度看,就是將所有使用者對某個物品的偏好作為一個向量來計算物品之間的相似度,得到物品的相似物品後,根據使用者歷史的偏好預測當前使用者還沒有表示偏好的物品,計算得到一個排序的物品列表作為推薦。圖 3 給出了一個例子,對於物品 A,根據所有使用者的歷史偏好,喜歡物品 A 的使用者都喜歡物品 C,得出物品 A 和物品 C 比較相似,而使用者 C 喜歡物品 A,那麼可以推斷出使用者 C 可能也喜歡物品 C。