作者:July。推薦(引擎)系統算法學習導論
出處:結構之法算法之道
引言
昨日看到幾個關鍵詞:語義分析,協同過濾,智能推薦,想着想着便興奮了。於是昨天下午開始到今天凌晨3點,便研究了一下推薦引擎,做了初步了解。日后,自會慢慢深入仔細研究(日后的工作亦與此相關)。當然,此文也會慢慢補充完善。
本文作為對推薦引擎的初步介紹的一篇導論性的文章,將略去大部分的具體細節,側重用最簡單的語言簡要介紹推薦引擎的工作原理以及其相關算法思想,且為了着重淺顯易懂基本上全部援引自本人1月7日在微博上發表的文字(特地整理下,方便日后隨時翻閱),言簡意賅,保證本文的短小,盡量不引用太多專業術語。
同時,本文所有相關的算法都會在日后的文章一一陸續具體闡述。本文但求微言導論,日后但求具體而論。若有任何問題,歡迎隨時不吝賜教或批評指正。謝謝。
推薦引擎原理
推薦引擎原理如下圖所示(盡最大努力的收集盡可能多的用戶信息及行為,所謂廣撒網,勤捕魚,然后“特別的愛給特別的你”):

推薦引擎的分類
推薦引擎根據不同依據如下分類:
- 根據其是不是為不同的用戶推薦不同的數據,分為基於大眾行為、及個性化推薦引擎;
- 根據其數據源,分為基於人口統計學的(用戶年齡或性別相同判定為相似用戶)、基於內容的(物品具有相同關鍵詞和Tag),以及基於協同過濾的推薦(相似或相關性,分為三個子類,下文闡述);
- 根據其建立方式,分為基於物品和用戶本身的(用戶-物品二維矩陣描述用戶喜好,聚類算法)、基於關聯規則的、以及基於模型的推薦。
- 基於用戶的推薦(通過共同口味與偏好找相似鄰居用戶,K-鄰居算法,你朋友喜歡,你也可能喜歡),
- 基於項目的推薦(發現物品之間的相似度,推薦類似的物品,你喜歡物品A,C與A相似,可能也喜歡C),
- 基於模型的推薦(機器學習)。
多種推薦方式結合
協調過濾推薦
做協同過濾推薦,一般要做好以下幾個步驟:
1)若要做協同過濾,那么收集用戶偏好則成了關鍵。可以通過用戶的行為諸如評分(如不同的用戶對不同的作品有不同的評分,而評分先進意味着喜好口味相近,便可判定為相似用戶),投票,轉發,保存,書簽,標記,評論,點擊流,頁面停留時間,是否購買等獲得。如下面第2點所述:所有這些信息都可以數字化,如一個二維矩陣表示出來。
2)收集了用戶行為數據之后,我們接下來便要對數據進行減噪與歸一化操作(得到一個用戶偏好的二維矩陣,一維是用戶列表,另一維是物品列表,值是用戶對物品的偏好,一般是 [0,1] 或者 [-1, 1] 的浮點數值)。
3)找到相似的用戶和物品,通過什么途徑找到呢?便是計算相似用戶或相似物品的相似度。
4)相似度的計算有多種方法,不過都是基於向量Vector的,其實也就是計算兩個向量的距離,距離越近相似度越大。在推薦中,用戶-物品偏好的二維矩陣下,我們將一個用戶對所有物品的偏好作為一個向量來計算用戶之間的相似度,或者將所有用戶對某個物品的偏好作為一個向量來計算物品之間的相似度。
5)而計算出來的這兩個相似度則將作為基於用戶、項目的兩項協同過濾的推薦。常見的計算相似度的方法有:歐幾里德距離,皮爾遜相關系數(如兩個用戶對多個電影的評分,采取皮爾遜相關系數等相關計算方法,可以抉擇出他們的口味和偏好是否一致),Cosine相似度,Tanimoto系數。下面,簡單介紹其中的歐幾里得距離與皮爾遜相關系數:
- 歐幾里德距離(Euclidean Distance)是最初用於計算歐幾里德空間中兩個點的距離,假設 x,y 是 n 維空間的兩個點,它們之間的歐幾里德距離是:
可以看出,當 n=2 時,歐幾里德距離就是平面上兩個點的距離。 當用歐幾里德距離表示相似度,一般采用以下公式進行轉換:距離越小,相似度越大:
- 皮爾遜相關系數一般用於計算兩個定距變量間聯系的緊密程度,計算公式為:

它的取值在 [-1,+1] 之間。 sx, sy是 x 和 y 的樣品標准偏差。
6)相似鄰居計算。鄰居分為兩類:固定數量的鄰居K-neighborhoods 或者 Fix-size neighborhoods不論鄰居的“遠近”,只取最近的 K 個,作為其鄰居,如下圖A部分所示;基於相似度門檻的鄰居,落在以當前點為中心,距離為 K 的區域中的所有點都作為當前點的鄰居,如下圖B部分所示。
7)經過4)計算出來的基於用戶的CF(基於用戶推薦之用),基於物品的CF(基於項目推薦之用)。一般來說,社交網站內如facebook宜用User CF(用戶多嘛),而購書網站內如Amazon宜用Item CF(你此前看過與此類似的書比某某也看過此書更令你信服,因為你識書不識人)。
聚類算法
聚類聚類,通俗的講,即所謂“物以類聚,人以群分”。
K 均值聚類算法
K 均值(k-Means)是典型的基於距離的排他的划分方法:給定一個 n 個對象的數據集,它可以構建數據的 k 個划分,每個划分就是一個聚類,並且 k<=n,同時還需要滿足兩個要求:1、每個組至少包含一個對象;2、每個對象必須屬於且僅屬於一個組。下圖所示即是此算法的python實現:

Canopy 聚類算法
Canopy 聚類算法的基本原則是:首先應用成本低的近似的距離計算方法高效的將數據分為多個組,這里稱為一個 Canopy,我們姑且將它翻譯為“華蓋”,Canopy 之間可以有重疊的部分;然后采用嚴格的距離計算方式准確的計算在同一 Canopy 中的點,將他們分配與最合適的簇中。Canopy 聚類算法經常用於 K 均值聚類算法的預處理,用來找合適的 k 值和簇中心。
模糊 K 均值聚類算法
模糊 K 均值聚類算法是 K 均值聚類的擴展,它的基本原理和 K 均值一樣,只是它的聚類結果允許存在對象屬於多個簇,也就是說:它屬於我們前面介紹過的可重疊聚類算法。
其余聚類算法本文不再介紹。
后記
OK,更多請參看本人1月7日的微博。再者,推薦一份本文主要參考的資料:探索推薦引擎內部的秘密(作者:趙晨婷,馬春娥)http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy1/index.html?ca=drs-,推薦一本書:集體智慧編程(TobySeganra著)。
最后,編程藝術室內,Algorithms1~17群系列,程序員技術聯盟的朋友與我祝本blog的所有讀者朋友們(不論是老讀者,還是新讀者)元旦快樂,2012年新年快樂。同時,在上一篇文章中已說過:“近幾日后,准備編程藝術室內38位兄弟的靚照和blog或空間地址公布在博客內,給讀者一個聯系他們的方式,順便還能替他們征征友招招婚之類的(有的除外)”。下面貼一下編程藝術室內的部分朋友們的微博或主頁(排名不分先后):
BigPotato:http://weibo.com/bigpotatoc;ys:http://weibo.com/yanshazi;上善若水qin.yusen:http://www.renren.com/240148123/profile;夢想天窗:http://weibo.com/dirichlet09;時間飄過:http://weibo.com/weedge;well:http://t.qq.com/fairywell28;飛羽:http://weibo.com/jxtsung;
√3:http://blog.csdn.net/ThinkArt;☆濱 湖∮:http://weibo.com/lakeshore;Eric:http://weibo.com/softkitty;Lynn :http://weibo.com/375367539;蠟筆小軒:http://weibo.com/dinosoft;∈Φ.威士忌:http://weibo.com/hwiskey;寶寶蟲:http://t.qq.com/chengzhenqiang1981;狸待桃將:http://weibo.com/u/1177168711;天天向上:http://t.qq.com/zjllike,海風月影:http://t.qq.com/zjhangtian;wawayu:http://hi.csdn.net/bbswawa。
謝謝。完。



