轉:http://blog.csdn.net/v_july_v/article/details/7184318html
做者:July。
出處:結構之法算法之道python
昨日看到幾個關鍵詞:語義分析,協同過濾,智能推薦,想着想着便興奮了。因而昨天下午開始到今天凌晨3點,便研究了一下推薦引擎,作了初步瞭解。往後,自會慢慢深刻仔細研究(往後的工做亦與此相關)。固然,此文也會慢慢補充完善。web
本文做爲對推薦引擎的初步介紹的一篇導論性的文章,將略去大部分的具體細節,側重用最簡單的語言簡要介紹推薦引擎的工做原理以及其相關算法思想,且爲了着重淺顯易懂有些援引自本人1月7日在微博上發表的文字(特意整理下,方便往後隨時翻閱),儘可能保證本文的短小。不過,事與願違的是,文章後續補充完善,越寫越長了。面試
同時,本文全部相關的算法都會在往後的文章一一陸續具體闡述。本文但求微言導論,往後但求具體而論。如有任何問題,歡迎隨時不吝賜教或批評指正。謝謝。算法
推薦引擎盡最大努力的收集儘量多的用戶信息及行爲,所謂廣撒網,勤捕魚,而後「特別的愛給特別的你」,最後基於類似性的基礎之上持續「給力」,原理以下圖所示(圖引自本文的參考資料之一:探索推薦引擎內部的祕密):數據庫
推薦引擎根據不一樣依據以下分類:編程
只是問題是,誰會竭盡全力發完微博後,還去給它添加什麼標籤呢?因此,新浪微博還得努力,尋找另外一種更好地分析微博內容的方式。否則系統全盤掃描海里用戶的海里微博內容,則恐怕吃不消也負擔不起。網絡
然我的以爲卻是能夠從微博關鍵詞(標籤tag雲)和每一個用戶爲本身打的標籤(打着越多的共同標籤可定義爲類似用戶)入手,以下圖左右部分所示:數據結構
也就是說,經過共同的好友和經過間接關注的人來定義類似用戶是不靠譜的,只有經過基於微博內容的分析尋找類似用戶纔是可行之道,同時,更進一步,經過微博內容分析獲得標籤tag雲後,再從中找到相同或相近的標籤tag雲尋找類似的用戶無疑比已有推薦好友方式(經過共同的好友和經過間接關注的人來定義類似用戶)更靠譜。app
3.一、多種推薦方式結合
在現行的 Web 站點上的推薦每每都不是單純只採用了某一種推薦的機制和策略,他們每每是將多個方法混合在一塊兒,從而達到更好的推薦效果。
舉個例子如Amazon中除此基於用戶的推薦以外,還會用到基於內容的推薦(物品具備相同關鍵詞和Tag):如新產品的推薦;基於項目的協同過濾推薦(喜歡A,C與A相似,可能也喜歡C):如捆綁銷售and別人購買/瀏覽的商品。
協同過濾是利用集體智慧的一個典型方法。要理解什麼是協同過濾 (Collaborative Filtering, 簡稱 CF),首先想一個簡單的問題,若是你如今想看個電影,但你不知道具體看哪部,你會怎麼作?大部分的人會問問周圍的朋友或者稱之爲廣義上的鄰居(neighborhood),看看最近有什麼好看的電影推薦,而咱們通常更傾向於從口味比較相似的朋友那裏獲得推薦。這就是協同過濾的核心思想。以下圖,你能從圖中看到多少信息?
4.一、協同過濾推薦步驟
作協同過濾推薦,通常要作好如下幾個步驟:
1)若要作協同過濾,那麼收集用戶偏好則成了關鍵。能夠經過用戶的行爲諸如評分(如不一樣的用戶對不一樣的做品有不一樣的評分,而評分接近則意味着喜愛口味相近,即可斷定爲類似用戶),投票,轉發,保存,書籤,標記,評論,點擊流,頁面停留時間,是否購買等得到。以下面第2點所述:全部這些信息均可以數字化,如一個二維矩陣表示出來。
2)收集了用戶行爲數據以後,咱們接下來便要對數據進行減噪與歸一化操做(獲得一個用戶偏好的二維矩陣,一維是用戶列表,另外一維是物品列表,值是用戶對物品的偏好,通常是 [0,1] 或者 [-1, 1] 的浮點數值)。下面再簡單介紹下減噪和歸一化操做:
3)找到類似的用戶和物品,經過什麼途徑找到呢?即是計算類似用戶或類似物品的類似度。
4)類似度的計算有多種方法,不過都是基於向量Vector的,其實也就是計算兩個向量的距離,距離越近類似度越大。在推薦中,用戶-物品偏好的二維矩陣下,咱們將某個或某幾個用戶對莫兩個物品的偏好做爲一個向量來計算兩個物品之間的類似度,或者將兩個用戶對某個或某幾個物品的偏好做爲一個向量來計算兩個用戶之間的類似度。
類似度計算算法能夠用於計算用戶或者項目類似度。以項目類似度計算(Item Similarity Computation)爲列,通性在於都是從評分矩陣中,爲兩個項目i,j挑選出共同的評分用戶,然對這個共同用戶的評分向量,進行計算類似度si,j,以下圖所示,行表明用戶,列表明項目(注意到是從i,j向量中抽出共有的評論,組成的一對向量,進行類似度計算):
因此說,很簡單,找物品間的類似度,用戶不變,找多個用戶對物品的評分;找用戶間的類似度,物品不變,找用戶對某些個物品的評分。
5)而計算出來的這兩個類似度則將做爲基於用戶、項目的兩項協同過濾的推薦。常見的計算類似度的方法有:歐幾里德距離,皮爾遜相關係數(如兩個用戶對多個電影的評分,採起皮爾遜相關係數等相關計算方法,能夠抉擇出他們的口味和偏好是否一致),Cosine類似度,Tanimoto係數。下面,簡單介紹其中的歐幾里得距離與皮爾遜相關係數:
能夠看出,當 n=2 時,歐幾里德距離就是平面上兩個點的距離。當用歐幾里德距離表示類似度,通常採用如下公式進行轉換:距離越小,類似度越大(同時,避免除數爲0):
其中Ru,i 爲用戶u 對項目 i 的評分,對應帶橫槓的爲這個用戶集U對項目i的評分評分。
6)類似鄰居計算。鄰居分爲兩類:一、固定數量的鄰居K-neighborhoods (或Fix-size neighborhoods),不論鄰居的「遠近」,只取最近的 K 個,做爲其鄰居,以下圖A部分所示;二、基於類似度門檻的鄰居,落在以當前點爲中心,距離爲 K 的區域中的全部點都做爲當前點的鄰居,以下圖B部分所示。
再介紹一下K最近鄰(k-Nearest Neighbor,KNN)分類算法:這是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。該方法的思路是:若是一個樣本在特徵空間中的k個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。
7)通過4)計算出來的基於用戶的CF(基於用戶推薦之用:經過共同口味與偏好找類似鄰居用戶,K-鄰居算法,你朋友喜歡,你也可能喜歡),基於物品的CF(基於項目推薦之用:發現物品之間的類似度,推薦相似的物品,你喜歡物品A,C與A類似,那麼你可能也喜歡C)。
通常來講,社交網站內如facebook宜用User CF(用戶多嘛),而購書網站內如Amazon宜用Item CF(你此前看過與此相似的書比某某也看過此書更令你信服,由於你識書不識人)。
話雖如上所說,user多通常是社交性網站如Facebook故傾向於user-based(用戶多,用戶與用戶之間因聯繫產生的數據也多),item多通常是購買性網站如Amazon故傾向於Item-based(物品多,用戶少,故用戶與用戶之間鮮有聯繫,無用戶數據,何來user-based?只好基於類似物品做文章即item-based,但實踐中仍需具體狀況具體分析。
如@wuzh670所說:當item數目很少+不顯著增加時,item之間的關係在一段時間內相對穩定(對比user之間關係),對於實時更新item-similarity需求就下降不少,推薦系統效率提升不少,故棄用user-based會明智些。
4.二、基於項目類似度與基於用戶類似度的差別
上述3.1節中三個類似度公式是基於項目類似度場景下的,而實際上,基於用戶類似度與基於項目類似度計算的一個基本的區別是,基於用戶類似度是基於評分矩陣中的行向量類似度求解,基於項目類似度計算式基於評分矩陣中列向量類似度求解,而後三個公式分別均可以適用,以下圖:
(其中,爲0的表示未評分)
聚類聚類,通俗的講,即所謂「物以類聚,人以羣分」。聚類 (Clustering) 是一個數據挖掘的經典問題,它的目的是將數據分爲多個簇 (Cluster),在同一個簇中的對象之間有較高的類似度,而不一樣簇的對象差異較大。
5.一、K 均值聚類算法
K-均值(K-Means)聚類算法與處理混合正態分佈的最大指望算法很類似,由於他們都試圖找到數據中天然聚類的中心。此算法假設對象屬性來自於空間向量,目標是使各個羣組內部的均方偏差總和最小。
K均值聚類算法首先會隨機肯定K箇中心位置(位於空間中表明聚類中心的點),而後將各個數據項分配給最臨近的中心點。待分配完成以後,聚類中心就會移到分配給該聚類的全部節點的平均位置處,而後整個分配過程從新開始。這一過程會一直重複下去,直到分配過程再也不產生變化爲止。下圖是包含兩個聚類的K-均值聚類過程:
如下代碼所示便是此K-均值聚類算法的python實現:
k-Means是一種機器學習領域中的一種非監督學習。下面,簡要介紹下監督學習與無監督學習:
5.二、Canopy 聚類算法
Canopy 聚類算法的基本原則是:首先應用成本低的近似的距離計算方法高效的將數據分爲多個組,這裏稱爲一個 Canopy,咱們姑且將它翻譯爲「華蓋」,Canopy 之間能夠有重疊的部分;而後採用嚴格的距離計算方式準確的計算在同一 Canopy 中的點,將他們分配與最合適的簇中。Canopy 聚類算法常常用於 K 均值聚類算法的預處理,用來找合適的 k 值和簇中心。
5.三、模糊 K 均值聚類算法
模糊 K 均值聚類算法是 K 均值聚類的擴展,它的基本原理和 K 均值同樣,只是它的聚類結果容許存在對象屬於多個簇,也就是說:它屬於咱們前面介紹過的可重疊聚類算法。爲了深刻理解模糊 K 均值和 K 均值的區別,這裏咱們得花些時間瞭解一個概念:模糊參數(Fuzziness Factor)。
與 K 均值聚類原理相似,模糊 K 均值也是在待聚類對象向量集合上循環,可是它並非將向量分配給距離最近的簇,而是計算向量與各個簇的相關性(Association)。假設有一個向量 v,有 k 個簇,v 到 k 個簇中心的距離分別是 d1,d2⋯ dk,那麼 V 到第一個簇的相關性 u1能夠經過下面的算式計算:
計算 v 到其餘簇的相關性只需將 d1替換爲對應的距離。從上面的算式,咱們看出,當 m 近似 2 時,相關性近似 1;當 m 近似 1 時,相關性近似於到該簇的距離,因此 m 的取值在(1,2)區間內,當 m 越大,模糊程度越大,m 就是咱們剛剛提到的模糊參數。
其他聚類算法本文再也不介紹。關於冷啓動、數據稀疏、可擴展性、可移植性、可解釋性、多樣性、推薦信息的價值等問題則待後續闡述。
接下來,分類算法有不少,本文介紹決策樹學習,與貝葉斯定理。
6.一、決策樹學習
我們直接切入正題。所謂決策樹,顧名思義,是一種樹,一種依託於策略抉擇而創建起來的樹。
機器學習中,決策樹是一個預測模型;他表明的是對象屬性與對象值之間的一種映射關係。樹中每一個節點表示某個對象,而每一個分叉路徑則表明的某個可能的屬性值,而每一個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的對象的值。決策樹僅有單一輸出,若欲有複數輸出,能夠創建獨立的決策樹以處理不一樣輸出。
從數據產生決策樹的機器學習技術叫作決策樹學習, 通俗說就是決策樹。
來理論的太過抽象,下面舉兩個淺顯易懂的例子:
第一個例子:通俗來講,決策樹分類的思想相似於找對象。現想象一個女孩的母親要給這個女孩介紹男友,因而有了下面的對話:
女兒:多大年紀了?
母親:26。
女兒:長的帥不帥?
母親:挺帥的。
女兒:收入高不?
母親:不算很高,中等狀況。
女兒:是公務員不?
母親:是,在稅務局上班呢。
女兒:那好,我去見見。
這個女孩的決策過程就是典型的分類樹決策。至關於經過年齡、長相、收入和是否公務員對將男人分爲兩個類別:見和不見。假設這個女孩對男人的要求是:30歲如下、長相中等以上而且是高收入者或中等以上收入的公務員,那麼這個能夠用下圖表示女孩的決策邏輯:
也就是說,決策樹的簡單策略就是,比如公司招聘面試過程當中篩選一我的的簡歷,若是你的條件至關比如如說清華博士畢業,那麼二話不說,直接叫過來面試,若是非重點大學畢業,但實際項目經驗豐富,那麼也要考慮叫過來面試一下,即所謂具體狀況具體分析、決策。
第二個例子來自Tom M.Mitchell著的機器學習一書:
小王的目的是經過下週天氣預報尋找何時人們會打高爾夫,他了解人們決定是否打球的緣由最主要取決於天氣狀況。而天氣情況有晴,雲和雨;氣溫用華氏溫度表示;相對溼度用百分比;還有有無風。如此,咱們即可以構造一棵決策樹,以下(根據天氣這個分類決策這天是否合適打網球):
上述決策樹對應於如下表達式:(Outlook=Sunny ^Humidity<=70)V (Outlook = Overcast)V (Outlook=Rain ^ Wind=Weak)。獲得的最佳分類屬性以下圖所示:
在上圖中,計算了兩個不一樣屬性:溼度(humidity)和風力(wind)的信息增益,最終humidity這種分類的信息增益0.151>wind增益的0.048。說白了,就是在星期六上午是否適合打網球的問題訣策中,採起humidity較wind做爲分類屬性更佳,決策樹由此而來。
ID3算法決策樹的造成
OK,下圖爲ID3算法第一步後造成的部分決策樹。這樣綜合起來看,就容易理解多了。一、overcast樣例必爲正,因此爲葉子結點,總爲yes;二、ID3無回溯,局部最優,而非全局最優,還有另外一種樹後修剪決策樹。下圖是ID3算法第一步後造成的部分決策樹:
6.二、貝葉斯分類的基礎:貝葉斯定理貝葉斯定理:已知某條件機率,如何獲得兩個事件交換後的機率,也就是在已知P(A|B)的狀況下如何求得P(B|A)。這裏先解釋什麼是條件機率:
表示事件B已經發生的前提下,事件A發生的機率,叫作事件B發生下事件A的條件機率。其基本求解公式爲:。
貝葉斯定理之因此有用,是由於咱們在生活中常常遇到這種狀況:咱們能夠很容易直接得出P(A|B),P(B|A)則很難直接得出,但咱們更關心P(B|A),貝葉斯定理就爲咱們打通從P(A|B)得到P(B|A)的道路。
下面不加證實地直接給出貝葉斯定理(公式被網友指出有問題,待後續驗證改正):
」北京十分科技也很是看好閱讀推薦類的應用,他們花了很是大的精力(一年60人團隊),纔在今天推出了iPhone 版「酷雲閱讀」。
爲何要投入這麼多人去作這個閱讀應用?CEO 李鵬告訴我,這個團隊超過一半的人都在作後臺相關的東西,包括語義分析、機器學習等算法。他們的目的是將互聯網「語義化」之後,把人的興趣明確,最後把每一個人感興趣的內容推薦給相關的人。在iPhone 上,酷雲的大體作法和Zite iPad 版相似,用戶的行爲也是有「喜歡」、「不喜歡」,以及點擊相應的媒體來源或者相關的標籤來告訴酷雲你但願之後看到更多這些內容。
這個目的是大部分閱讀推薦應用都有的,可是酷雲的作法彷佛更加變態。他們除了天天要抓取來自互聯網的超過10萬篇文章以外,還對全國200個的電視臺播出的視頻內容進行了索引,以便用戶也能夠經過文字搜索出視頻、以及對視頻內容進行同樣的推薦。大體作法是先把這些節目都錄製下來,而後把聲音轉文字,最後創建摘要和索引。「
英雄召集令:若是哪位朋友之前搞過推薦或者檢索的,或者機器學習,數據挖掘,海量數據處理,搜索與推薦引擎任一一個領域的的請必定聯繫我,可隨時留言或評論,或微博私信,或Email:zhoulei0907@yahoo.cn。有過大型網站建設經驗的,或者編程經驗豐富老道的更歡迎隨時聯繫我。和本blog相關的文件隨時免費贈送技術知己。
最後,本blog成爲過去一年2011年csdn blog年排行榜第一位:http://blog.csdn.net/ranking.html,及csdn Feed訂閱排行榜TOP100前十:http://www.feedsky.com/feeds/topsub_csdn.html,以下圖左右部分所示:
感謝本blog的全部讀者。爲回饋讀者,免積分下載本blog最新博文集錦第6期CHM文件:http://download.csdn.net/detail/v_july_v/4020172。
OK,本文只是初步成型,還看到了不少的問題、漏洞亟待完善。同時,一切還只是個人理解,還沒有在實際工做中運用。因此,理解不深,未辨真知。一切還得在後續實踐中檢驗。讀者若發現本文或本blog中任何問題或錯誤,懇請隨時不吝指正。萬分感謝。完。July、2011.01.12。
(Recommend & Search交流羣:172114338)
Updated:接下來,可能針對推薦系統寫一個系列,分別叫作:推薦系統·入門篇,推薦系統·進階篇,推薦系統·終結篇。在此過程當中,我須要學習、參考、借鑑大量的資料和論文。若是各位有好的資料或論文推薦,歡迎隨時告知我(先預留一個不錯的資料連接:http://arxiv.org/pdf/1202.1112v1.pdf)。July、2012.02.09更新。