協同過濾(CF)算法詳解和實現

分類:IT技術 時間:2016-10-08

原文出處: Poll的筆記   

1 集體智慧和協同過濾

1.1 什麽是集體智慧(社會計算)?

集體智慧 (Collective Intelligence) 並不是 Web2.0 時代特有的,只是在 Web2.0 時代,大家在 Web 應用中利用集體智慧構建更加有趣的應用或者得到更好的用戶體驗。集體智慧是指在大量的人群的行為和數據中收集答案,幫助你對整個人群得到統計意義上的結論,這些結論是我們在單個個體上無法得到的,它往往是某種趨勢或者人群中共性的部分。

Wikipedia 和 Google 是兩個典型的利用集體智慧的 Web 2.0 應用:

  • Wikipedia 是一個知識管理的百科全書,相對於傳統的由領域專家編輯的百科全書,Wikipedia 允許最終用戶貢獻知識,隨著參與人數的增多,Wikipedia 變成了涵蓋各個領域的一本無比全面的知識庫。也許有人會質疑它的權威性,但如果你從另一個側面想這個問題,也許就可以迎刃而解。在發行一本書時,作者雖然是權威,但難免還有一些錯誤,然後通過一版一版的改版,書的內容越來越完善。而在 Wikipedia 上,這種改版和修正被變為每個人都可以做的事情,任何人發現錯誤或者不完善都可以貢獻他們的想法,即便某些信息是錯誤的,但它一定也會盡快的被其他人糾正過來。從一個宏觀的角度看,整個系統在按照一個良性循環的軌跡不斷完善,這也正是集體智慧的魅力。
  • Google:目前最流行的搜索引擎,與 Wikipedia 不同,它沒有要求用戶顯式的貢獻,但仔細想想 Google 最核心的 PageRank 的思想,它利用了 Web 頁面之間的關系,將多少其他頁面鏈接到當前頁面的數目作為衡量當前頁面重要與否的標準;如果這不好理解,那麽你可以把它想象成一個選舉的過程,每個 Web 頁面都是一個投票者同時也是一個被投票者,PageRank 通過一定數目的叠代得到一個相對穩定的評分。Google 其實利用了現在 Internet 上所有 Web 頁面上鏈接的集體智慧,找到哪些頁面是重要的。

1.2 什麽是協同過濾?

協同過濾是利用集體智慧的一個典型方法。要理解什麽是協同過濾 (Collaborative Filtering, 簡稱 CF),首先想一個簡單的問題,如果你現在想看個電影,但你不知道具體看哪部,你會怎麽做?大部分的人會問問周圍的朋友,看看最近有什麽好看的電影推薦,而我們一般更傾向於從口味比較類似的朋友那裏得到推薦。這就是協同過濾的核心思想。

協同過濾一般是在海量的用戶中發掘出一小部分和你品位比較類似的,在協同過濾中,這些用戶成為鄰居,然後根據他們喜歡的其他東西組織成一個排序的目錄作為推薦給你。當然其中有一個核心的問題:

  • 如何確定一個用戶是不是和你有相似的品位?
  • 如何將鄰居們的喜好組織成一個排序的目錄?

協同過濾相對於集體智慧而言,它從一定程度上保留了個體的特征,就是你的品位偏好,所以它更多可以作為個性化推薦的算法思想。可以想象,這種推薦策略在 Web 2.0 的長尾中是很重要的,將大眾流行的東西推薦給長尾中的人怎麽可能得到好的效果,這也回到推薦系統的一個核心問題:了解你的用戶,然後才能給出更好的推薦。

2 深入協同過濾的核心

前面作為背景知識,介紹了集體智慧和協同過濾的基本思想,這一節我們將深入分析協同過濾的原理,介紹基於協同過濾思想的多種推薦機制,優缺點和實用場景。

首先,要實現協同過濾,需要一下幾個步驟

  • 收集用戶偏好
  • 找到相似的用戶或物品
  • 計算推薦

2.1 收集用戶偏好

要從用戶的行為和偏好中發現規律,並基於此給予推薦,如何收集用戶的偏好信息成為系統推薦效果最基礎的決定因素。用戶有很多方式向系統提供自己的偏好信息,而且不同的應用也可能大不相同,下面舉例進行介紹:

表 1 用戶行為和用戶偏好

用戶行 為 類型 特征 作用 評分 顯式 整數量化的偏好,可能的取值是 [0, n];n 一般取值為 5 或者是 10 通過用戶對物品的評分,可以精確的得到用戶的偏好 投票 顯式 布爾量化的偏好,取值是 0 或 1 通過用戶對物品的投票,可以較精確的得到用戶的偏好 轉發 顯式 布爾量化的偏好,取值是 0 或 1 通過用戶對物品的投票,可以精確的得到用戶的偏好。
如果是站內,同時可以推理得到被轉發人的偏好(不精確) 保存書簽 顯示 布爾量化的偏好,取值是 0 或 1 通過用戶對物品的投票,可以精確的得到用戶的偏好。 標記標簽
(Tag) 顯示 一些單詞,需要對單詞進行分析,得到偏好 通過分析用戶的標簽,可以得到用戶對項目的理解,同時可以分析出用戶的情感:喜歡還是討厭 評論 顯示 一段文字,需要進行文本分析,得到偏好 通過分析用戶的評論,可以得到用戶的情感:喜歡還是討厭 點擊流
( 查看 ) 隱式 一組用戶的點擊,用戶對物品感興趣,需要進行分析,得到偏好 用戶的點擊一定程度上反映了用戶的註意力,所以它也可以從一定程度上反映用戶的喜好。 頁面停留時間 隱式 一組時間信息,噪音大,需要進行去噪,分析,得到偏好 用戶的頁面停留時間一定程度上反映了用戶的註意力和喜好,但噪音偏大,不好利用。 購買 隱式 布爾量化的偏好,取值是 0 或 1 用戶的購買是很明確的說明這個項目它感興趣。

以上列舉的用戶行為都是比較通用的,推薦引擎設計人員可以根據自己應用的特點添加特殊的用戶行為,並用他們表示用戶對物品的喜好。

在一般應用中,我們提取的用戶行為一般都多於一種,關於如何組合這些不同的用戶行為,基本上有以下兩種方式:

  • 將不同的行為分組:一般可以分為“查看”和“購買”等等,然後基於不同的行為,計算不同的用戶 / 物品相似度。類似於當當網或者 Amazon 給出的“購買了該圖書的人還購買了 …”,“查看了圖書的人還查看了 …”
  • 根據不同行為反映用戶喜好的程度將它們進行加權,得到用戶對於物品的總體喜好。一般來說,顯式的用戶反饋比隱式的權值大,但比較稀疏,畢竟進行顯示反饋的用戶是少數;同時相對於“查看”,“購買”行為反映用戶喜好的程度更大,但這也因應用而異。

收集了用戶行為數據,我們還需要對數據進行一定的預處理,其中最核心的工作就是:減噪和歸一化。

  • 減噪:用戶行為數據是用戶在使用應用過程中產生的,它可能存在大量的噪音和用戶的誤操作,我們可以通過經典的數據挖掘算法過濾掉行為數據中的噪音,這樣可以是我們的分析更加精確。
  • 歸一化:如前面講到的,在計算用戶對物品的喜好程度時,可能需要對不同的行為數據進行加權。但可以想象,不同行為的數據取值可能相差很大,比如,用戶的查看數據必然比購買數據大的多,如何將各個行為的數據統一在一個相同的取值範圍中,從而使得加權求和得到的總體喜好更加精確,就需要我們進行歸一化處理。最簡單的歸一化處理,就是將各類數據除以此類中的最大值,以保證歸一化後的數據取值在 [0,1] 範圍中。

進行的預處理後,根據不同應用的行為分析方法,可以選擇分組或者加權處理,之後我們可以得到一個用戶偏好的二維矩陣,一維是用戶列表,另一維是物品列表,值是用戶對物品的偏好,一般是 [0,1] 或者 [-1, 1] 的浮點數值。

2.2 找到相似的用戶或物品

當已經對用戶行為進行分析得到用戶喜好後,我們可以根據用戶喜好計算相似用戶和物品,然後基於相似用戶或者物品進行推薦,這就是最典型的 CF 的兩個分支:基於用戶的 CF 和基於物品的 CF。這兩種方法都需要計算相似度,下面我們先看看最基本的幾種計算相似度的方法。

相似度的計算

關於相似度的計算,現有的幾種基本方法都是基於向量(Vector)的,其實也就是計算兩個向量的距離,距離越近相似度越大。在推薦的場景中,在用戶 – 物品偏好的二維矩陣中,我們可以將一個用戶對所有物品的偏好作為一個向量來計算用戶之間的相似度,或者將所有用戶對某個物品的偏好作為一個向量來計算物品之間的相似度。下面我們詳細介紹幾種常用的相似度計算方法:

  • 歐幾裏德距離(Euclidean Distance)

最初用於計算歐幾裏德空間中兩個點的距離,假設 x,y 是 n 維空間的兩個點,它們之間的歐幾裏德距離是:

01

可以看出,當 n=2 時,歐幾裏德距離就是平面上兩個點的距離。

當用歐幾裏德距離表示相似度,一般采用以下公式進行轉換:距離越小,相似度越大

02

  • 皮爾遜相關系數(Pearson Correlation Coefficient)

皮爾遜相關系數一般用於計算兩個定距變量間聯系的緊密程度,它的取值在 [-1,+1] 之間。

03

sx, sy是 x 和 y 的樣品標準偏差。

  • Cosine 相似度(Cosine Similarity)

Cosine 相似度被廣泛應用於計算文檔數據的相似度:

04

  • Tanimoto 系數(Tanimoto Coefficient)

Tanimoto 系數也稱為 Jaccard 系數,是 Cosine 相似度的擴展,也多用於計算文檔數據的相似度:

05

相似鄰居的計算

介紹完相似度的計算方法,下面我們看看如何根據相似度找到用戶 – 物品的鄰居,常用的挑選鄰居的原則可以分為兩類:圖 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,這種方法計算出的鄰居的相似度程度比前一種優,尤其是對孤立點的處理。

06

圖 1.相似鄰居計算示意圖

2.3 計算推薦

經過前期的計算已經得到了相鄰用戶和相鄰物品,下面介紹如何基於這些信息為用戶進行推薦。本系列的上一篇綜述文章已經簡要介紹過基於協同過濾的推薦算法可以分為基於用戶的 CF 和基於物品的 CF,下面我們深入這兩種方法的計算方法,使用場景和優缺點。

基於用戶的 CF(User CF)

基於用戶的 CF 的基本思想相當簡單,基於用戶對物品的偏好找到相鄰鄰居用戶,然後將鄰居用戶喜歡的推薦給當前用戶。計算上,就是將一個用戶對所有物品的偏好作為一個向量來計算用戶之間的相似度,找到 K 鄰居後,根據鄰居的相似度權重以及他們對物品的偏好,預測當前用戶沒有偏好的未涉及物品,計算得到一個排序的物品列表作為推薦。圖 2 給出了一個例子,對於用戶 A,根據用戶的歷史偏好,這裏只計算得到一個鄰居 – 用戶 C,然後將用戶 C 喜歡的物品 D 推薦給用戶 A。

07

圖 2 基於用戶的 CF 的基本原理

基於物品的 CF(Item CF)

基於物品的 CF 的原理和基於用戶的 CF 類似,只是在計算鄰居時采用物品本身,而不是從用戶的角度,即基於用戶對物品的偏好找到相似的物品,然後根據用戶的歷史偏好,推薦相似的物品給他。從計算的角度看,就是將所有用戶對某個物品的偏好作為一個向量來計算物品之間的相似度,得到物品的相似物品後,根據用戶歷史的偏好預測當前用戶還沒有表示偏好的物品,計算得到一個排序的物品列表作為推薦。圖 3 給出了一個例子,對於物品 A,根據所有用戶的歷史偏好,喜歡物品 A 的用戶都喜歡物品 C,得出物品 A 和物品 C 比較相似,而用戶 C 喜歡物品 A,那麽可以推斷出用戶 C 可能也喜歡物品 C。

08

圖 3 基於物品的 CF 的基本原理

User CF vs. Item CF

前面介紹了 User CF 和 Item CF 的基本原理,下面我們分幾個不同的角度深入看看它們各自的優缺點和適用場景:

  • 計算復雜度

Item CF 和 User CF 是基於協同過濾推薦的兩個最基本的算法,User CF 是很早以前就提出來了,Item CF 是從 Amazon 的論文和專利發表之後(2001 年左右)開始流行,大家都覺得 Item CF 從性能和復雜度上比 User CF 更優,其中的一個主要原因就是對於一個在線網站,用戶的數量往往大大超過物品的數量,同時物品的數據相對穩定,因此計算物品的相似度不但計算量較小,同時也不必頻繁更新。但我們往往忽略了這種情況只適應於提供商品的電子商務網站,對於新聞,博客或者微內容的推薦系統,情況往往是相反的,物品的數量是海量的,同時也是更新頻繁的,所以單從復雜度的角度,這兩個算法在不同的系統中各有優勢,推薦引擎的設計者需要根據自己應用的特點選擇更加合適的算法。

  • 適用場景

在非社交網絡的網站中,內容內在的聯系是很重要的推薦原則,它比基於相似用戶的推薦原則更加有效。比如在購書網站上,當你看一本書的時候,推薦引擎會給你推薦相關的書籍,這個推薦的重要性遠遠超過了網站首頁對該用戶的綜合推薦。可以看到,在這種情況下,Item CF 的推薦成為了引導用戶瀏覽的重要手段。同時 Item CF 便於為推薦做出解釋,在一個非社交網絡的網站中,給某個用戶推薦一本書,同時給出的解釋是某某和你有相似興趣的人也看了這本書,這很難讓用戶信服,因為用戶可能根本不認識那個人;但如果解釋說是因為這本書和你以前看的某本書相似,用戶可能就覺得合理而采納了此推薦。

相反的,在現今很流行的社交網絡站點中,User CF 是一個更不錯的選擇,User CF 加上社會網絡信息,可以增加用戶對推薦解釋的信服程度。

  • 推薦多樣性和精度

研究推薦引擎的學者們在相同的數據集合上分別用 User CF 和 Item CF 計算推薦結果,發現推薦列表中,只有 50% 是一樣的,還有 50% 完全不同。但是這兩個算法確有相似的精度,所以可以說,這兩個算法是很互補的。

關於推薦的多樣性,有兩種度量方法:

第一種度量方法是從單個用戶的角度度量,就是說給定一個用戶,查看系統給出的推薦列表是否多樣,也就是要比較推薦列表中的物品之間兩兩的相似度,不難想到,對這種度量方法,Item CF 的多樣性顯然不如 User CF 的好,因為 Item CF 的推薦就是和以前看的東西最相似的。

第二種度量方法是考慮系統的多樣性,也被稱為覆蓋率 (Coverage),它是指一個推薦系統是否能夠提供給所有用戶豐富的選擇。在這種指標下,Item CF 的多樣性要遠遠好於 User CF, 因為 User CF 總是傾向於推薦熱門的,從另一個側面看,也就是說,Item CF 的推薦有很好的新穎性,很擅長推薦長尾裏的物品。所以,盡管大多數情況,Item CF 的精度略小於 User CF, 但如果考慮多樣性,Item CF 卻比 User CF 好很多。

如果你對推薦的多樣性還心存疑惑,那麽下面我們再舉個實例看看 User CF 和 Item CF 的多樣性到底有什麽差別。首先,假設每個用戶興趣愛好都是廣泛的,喜歡好幾個領域的東西,不過每個用戶肯定也有一個主要的領域,對這個領域會比其他領域更加關心。給定一個用戶,假設他喜歡 3 個領域 A,B,C,A 是他喜歡的主要領域,這個時候我們來看 User CF 和 Item CF 傾向於做出什麽推薦:如果用 User CF, 它會將 A,B,C 三個領域中比較熱門的東西推薦給用戶;而如果用 ItemCF,它會基本上只推薦 A 領域的東西給用戶。所以我們看到因為 User CF 只推薦熱門的,所以它在推薦長尾裏項目方面的能力不足;而 Item CF 只推薦 A 領域給用戶,這樣他有限的推薦列表中就可能包含了一定數量的不熱門的長尾物品,同時 Item CF 的推薦對這個用戶而言,顯然多樣性不足。但是對整個系統而言,因為不同的用戶的主要興趣點不同,所以系統的覆蓋率會比較好。

從上面的分析,可以很清晰的看到,這兩種推薦都有其合理性,但都不是最好的選擇,因此他們的精度也會有損失。其實對這類系統的最好選擇是,如果系統給這個用戶推薦 30 個物品,既不是每個領域挑選 10 個最熱門的給他,也不是推薦 30 個 A 領域的給他,而是比如推薦 15 個 A 領域的給他,剩下的 15 個從 B,C 中選擇。所以結合 User CF 和 Item CF 是最優的選擇,結合的基本原則就是當采用 Item CF 導致系統對個人推薦的多樣性不足時,我們通過加入 User CF 增加個人推薦的多樣性,從而提高精度,而當因為采用 User CF 而使系統的整體多樣性不足時,我們可以通過加入 Item CF 增加整體的多樣性,同樣同樣可以提高推薦的精度。

  • 用戶對推薦算法的適應度

前面我們大部分都是從推薦引擎的角度考慮哪個算法更優,但其實我們更多的應該考慮作為推薦引擎的最終使用者 — 應用用戶對推薦算法的適應度。

對於 User CF,推薦的原則是假設用戶會喜歡那些和他有相同喜好的用戶喜歡的東西,但如果一個用戶沒有相同喜好的朋友,那 User CF 的算法的效果就會很差,所以一個用戶對的 CF 算法的適應度是和他有多少共同喜好用戶成正比的。

Item CF 算法也有一個基本假設,就是用戶會喜歡和他以前喜歡的東西相似的東西,那麽我們可以計算一個用戶喜歡的物品的自相似度。一個用戶喜歡物品的自相似度大,就說明他喜歡的東西都是比較相似的,也就是說他比較符合 Item CF 方法的基本假設,那麽他對 Item CF 的適應度自然比較好;反之,如果自相似度小,就說明這個用戶的喜好習慣並不滿足 Item CF 方法的基本假設,那麽對於這種用戶,用 Item CF 方法做出好的推薦的可能性非常低。

3 基於KNN的協同過濾推薦算法MATLAB實現

鄰居模型通常也被稱為k-最近鄰模型,或者簡稱為kNN。KNN 模型可以獲得精確的推薦結果並為結果給出合理的解釋,它們是CF 推薦系統中最早被使用也是直至目前最流行的一類模型。

PS:以下公式和圖片轉自博主自己的CSDN博客。

為了獲得用戶對產品的評分預測值,kNN 模型一般包括以下三步:

1. 計算相似度

這步中計算每對產品之間的相似度(similarity)。一些被廣泛使用的相似度

測度包括:

Pearson correlation:

09

其中ˉrm 和ˉrn 分別表示電影m 和n 獲得的評分平均值,而Pmn 表示對電影m 和n 都提供了評分的用戶集合,也即Pmn = Pm ∩ Pn 。

Cosine:

10

Adjusted Cosine:

11

其中ˉrv 表示用戶v 的評分平均值。

2. 選擇鄰居

為了預測用戶u 對電影m 的評分值,我們首先從Pu 中選取與電影m有最高相似度的特定數量的電影,這些電影形成u?m 對的鄰居(neighborhood),記為N(m; u) 。

3. 產生預測值

用戶u 對電影m 的評分預測為上步獲得的鄰居N(m; u) 中評分的加權平均值:

12

其中bu;n 為用戶u 對電影n 的基準預測評分。這裏的基準模型可以是任何可以產生預測評分的模型。

按照上述過程,在MATLAB仿真環境下得到的RMSE=1.0776,這裏取得鄰居個數為10。

下圖為鄰居個數的選取(0~20)對RMSE的影響曲線:

13

MATLAB 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 %% 載入訓練數據  load g:\matlab\協同過濾做推薦\dataset\Movielens\u1.base%% 數據預處理  %  提取數據的前三列,即用戶序號、被該用戶評價電影序號、評價分值 [m,n]=size(u1);test=zeros(m,3);for i=1:3    test(:,i)=u1(:,i);end%% 建立評分矩陣 number_user=max(test(:,1));number_movies=max(test(:,2));score_matrix=zeros(number_user,number_movies);%評分矩陣943*1682維for i=1:m    score_matrix(test(i,1),test(i,2))=test(i,3);endSim_matrix=zeros(number_movies,number_movies);%相似度矩陣1642*1642維tic;%計算評分矩陣 for i=1:number_movies-1    for j=i+1:number_movies        Sim_matrix(i,j)=Similarity_ab(score_matrix,i,j);    endendtoc;%% 建立相似度矩陣 % function Neibor=neibor_select(Sim_matrix,a,n) neibor_num=10;%鄰居的大小Sim_matrix=Sim_matrix'+Sim_matrix;%求完整的相似度矩陣%neibor_sim_matrix_temp為排好序的相似度矩陣%neibor_matrix_temp各個相似度所對應的電影,也就是我們要找的鄰居value_1_index=find(Sim_matrix>=0.9999);%找出Sim_matrix矩陣中所有相似度為1的值,                                       %因為可能是錯誤值,後期選擇鄰居不應考慮。%為什麽不是value_1_index=find(Sim_matrix==1)這樣有部分1不能正確找出,可以試試看Sim_matrix(value_1_index)=0;%將所有相似度為1的值用0代替% [neibor_sim_matrix_temp,neibor_matrix_temp]=sort(Sim_matrix,2,'descend');% neibor_sim_matrix=zeros(number_movies,neibor_num);% neibor_matrix=zeros(number_movies,neibor_num);% for i=1:neibor_num%     neibor_sim_matrix(:,i)=neibor_sim_matrix_temp(:,i);%每個鄰居對應的相似度%     neibor_matrix(:,i)=neibor_matrix_temp(:,i);%鄰居% end%% 載入測試集load g:\matlab\協同過濾做推薦\dataset\Movielens\u1.test%% 作預測[m,n]=size(u1);test=zeros(m,3);for i=1:3    test(:,i)=u1(:,i);endPredict_score=zeros(m,1);for j=1:mP_u=find(score_matrix(test(j,1),:)~=0);%找出該用戶評價的電影集合[~,num]=size(P_u);%計算該用戶評價的電影個數%%%%%%%%%%%計算鄰居%%%%%%%%%%%%neibor_num=10;%最大為4P_u_sim=Sim_matrix(test(j,2),P_u);[temp,index]=sort(P_u_sim,2,'descend');[~,num1]=size(index);if num1>=neibor_num neibor=(P_u(index(1:neibor_num)));else    neibor=(P_u(index));    neibor_num=num1;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sum_score=sum(score_matrix(test(j,1),:),2);%該用戶對所有電影的總評分aver_score=sum_score/num;%該用戶對電影的平均評分sum1=0;sum2=0;for i=1:neibor_num    sum1=sum1+Sim_matrix(test(j,2),neibor(i))*(score_matrix(test(j,1),neibor(i))-aver_score);    sum2=sum2+Sim_matrix(test(j,2),neibor(i));endif sum2==0    Predict_score(j,1)=round(aver_score);%排除分母為零的情況elsePredict_score(j,1)=round(aver_score+sum1/sum2);%確保預測值為1~5的評分數if Predict_score(j,1)>5    Predict_score(j,1)=5;elseif Predict_score(j,1)<1    Predict_score(j,1)=1;endendend%% 計算RMSEEval=zeros(m,3);Eval(:,1)=test(:,3);Eval(:,2)=Predict_score(:,1);Eval(:,3)=abs(test(:,3)-Predict_score(:,1));RMSE=sqrt(Eval(:,3)'*Eval(:,3)/m);

協同過濾的缺點是:

(1)用戶對商品的評價非常稀疏,這樣基於用戶的評價所得到的用戶間的相似性可能不準確(即稀疏性問題);

(2)隨著用戶和商品的增多,系統的性能會越來越低;

(3)如果從來沒有用戶對某一商品加以評價,則這個商品就不可能被推薦(即最初評價問題)。

4 總結

Web2.0 的一個核心思想就是“集體智慧”,基於協同過濾的推薦策略的基本思想就是基於大眾行為,為每個用戶提供個性化的推薦,從而使用戶能更快速更準確的發現所需要的信息。從應用角度分析,現今比較成功的推薦引擎,比如 Amazon,豆瓣,當當等都采用了協同過濾的方式,它不需要對物品或者用戶進行嚴格的建模,而且不要求物品的描述是機器可理解的,是中領域無關的推薦方法,同時這個方法計算出來的推薦是開放的,可以共用他人的經驗,很好的支持用戶發現潛在的興趣偏好。基於協同過濾的推薦策略也有不同的分支,它們有不同的實用場景和推薦效果,用戶可以根據自己應用的實際情況選擇合適的方法,異或組合不同的方法得到更好的推薦效果。

5 參考資料

  • Collective Intelligence in Action: 詳細介紹了如何利用集體智慧構建智能應用。
  • Toward the next generation of recommender systems: a survey of the state-of-the-art and possible extensions. Adomavicius, G. and Tuzhilin 在 2005 年發表的一片文章,詳細總結了推薦引擎的發展和存在的問題
  • Collaborative_Filtering:Wikipedia 上對於協同過濾的介紹和相關論文。
  • Item-based collaborative filtering recommendation algorithms:Amazon 最早提出 Item CF 的推薦策略的論文
  • Correlation and dependence:Wikipedia 上關聯和相似度計算的介紹。
  • Tanimoto系數:Wikipedia 上 Tanimoto 系數計算的介紹。
  • Cosine相似度:Wikipedia 上 Cosine 相似度計算的介紹。
  • 推薦系統的覆蓋率:關於推薦覆蓋率的計算方法的介紹
  • Slope One:Wikipedia 上 Slope One 推薦方法的介紹。
  • Slope One Predictors for Online Rating-Based Collaborative Filtering:提出 Slope One 的論文,對 Slope One 預測方法進行全面深入的介紹。
  • xlvector – Recommender System:項亮的博客,關註與推薦系統各個側面和各個維度的問題。
  • Apache Mahout簡介:Mahout 的創始者 Grant Ingersoll 介紹了機器學習的基本概念,並演示了如何使用 Mahout 來實現文檔集群、提出建議和組織內容。
  • Apache Mahout:Apache Mahout 項目的主頁,搜索關於 Mahout 的所有內容。
  • Apache Mahout 推薦算法:給出 Mahout 中提供推薦計算的框架和安裝指南
  • 基於Apache Mahout構建社會化推薦引擎:筆者 09 年發布的一篇關於基於 Mahout 實現推薦引擎的 developerWorks 文章,其中詳細介紹了 Mahout 的安裝步驟,並給出一個簡單的電影推薦引擎的例子。
1 收藏 評論
Tags: 搜索引擎 百科全書 知識管理 Google 知識庫

文章來源:


ads
ads

相關文章
ads

相關文章

ad