網頁制作poluoluo文章簡介:推薦系統廣泛應用於各類網站,電子商務中的商品推薦、博客網站的文章推薦,以及幫助人們尋找音樂和影片的各類應用。但如何才能從無到有的給網站配備一個推薦系統呢?
推薦系統廣泛應用於各類網站,電子商務中的商品推薦、博客網站的文章推薦,以及幫助人們尋找音樂和影片的各類應用。但如何才能從無到有的給網站配備一個推薦系統呢?針對這個問題,我在搜索引擎中遍尋多時,但始終沒有找到滿意的答案。這期間我也加入了國內推薦系統高手聚集的推薦系統郵件列表,其中不乏當當、卓越亞馬遜、豆瓣等業內在推薦系統上領先的產品、技術高手,但浸淫多日卻始終無法在腦海中形成一個以內容推薦為最終目的的產品框架或產品路線圖。這種狀態一直持續到我購買了集體智慧編程(Programming Collective Intelligence)後才得以改觀,現在我將此書的部分讀書筆記予以整理,希望能給同樣對推薦系統感興趣的朋友整理出一個可操作的、適合內容型網站推薦系統產品框架。
——————–正文分割線——————–
我們知道,要想了解內容網站的推薦信息,最沒有技術含量的方法莫過於向朋友詢問。我們也知道,這其中有一部分人的品位會比其他人的高一些,通過觀察這些人是否通常也和我們一樣喜歡同樣的東西,可以逐漸對這些情況有所了解。不過隨著選擇越來越多,要想通過詢問一小群人來確定我們想要的東西,將會變得越來越不切實際,因為他們可能並不了解所有的選擇。這就是為什麼人們要發展出一套被稱為協同過濾(collaborative filtering)的技術。從實際的情況看,目前我們所能接觸到的領先推薦系統,包括Netfilx、豆瓣、Amazon等等都是利用協同過濾技術來實現的。協同過濾又分成幾種:基於用戶的協同過濾、基於項目的協同過濾、基於模型的協同過濾。
那麼到底什麼是協同過濾?它需要產品設計者做哪些事情才能實現?(為了讓問題簡化,這裡著重介紹基於用戶的協同過濾)
一個基於用戶的協同過濾過濾算法通常的做法是對一大群人進行搜索,並從中找出與我們品位相近的一小群人。算法會對這些人所偏愛的其他內容進行考察,並將它們組合起來構成一個經過排名的推薦列表。因此產品設計者需要理解你的網站需要依次做以下這幾件事情:
要搜集偏好意味著要尋找一種表達不同人及其偏好的方法。例如,豆瓣會要求用戶對每部電影用1到5顆星來評分,以此來體現包括本人在內的每位影評者對某一給定影片的喜愛程度。假如你正在設計一個購物網站,那不妨用數字1來代表有人過去購買過某件商品,用數字0來代表未曾購買過任何商品。而對於一個新聞故事投票網站,我們可以分別用數字-1、0和1來表達“不喜歡”、“沒有投票”、“喜歡”。不管偏好如何表達的,你要做的是建立一種方法來使得你的用戶來參與表達,並把他們表達的內容對應到數字以形成相應的數據集合。
有了人們偏好的數據集後,我們需要有一種方法來確定人們在品位方面的相似程度。為此,我們可以將每個人與所有其他人進行對比,並計算他們的相似度評價值。有若干種方法可以達到此目的:歐幾裡德距離(Euclidean Distance Score)、皮爾遜相關度(Person Correlation Coefficient)、余弦相似性(Cosine-based Similarity)、調整余弦相似性(Adjusted Cosine Similarity)、Jaccard系數或曼哈頓距離算法等。請記住,各種相似度的計算方法各有所長,要根據具體的應用場景來選取一種或幾種綜合使用。
下面以實際例子簡單介紹兩種:
歐幾裡德距離(Euclidean Distance Score):它以經過人們一致評價的物品為坐標軸,然後將參與評價的人繪制到圖上,並考察他們彼此間的距離遠近。x軸、y軸分別代表電影Dupree和Snake,而在第一象限偏好空間裡的則是每個人對這兩部電影的評分。
不難發現,Toby對Snakes和Dupree這兩部電影的評分是4.5和1.0,而LaSalle的則是4.0和2.0。按照歐幾裡德距離的結論,偏好越相似的人,其在偏好空間的距離就越短。至於如何計算兩者的距離,運用你初中學的幾何知識就行,計算兩點每個坐標的差值,求平方後再相加,最後對總和取平方根。值得一提的是此方法對於數量多於兩項的評分也同樣適用。因此,你可以設計一個函數來計算2個用戶間的相似度,當然前提是兩者需要有一定重合的評分項。
皮爾遜相關度(Pearson Correlation Score):它的原理是通過判斷兩組數據與某一直線擬合程度來判斷相似度。它在數據不是很規范(normalized)的時候,如影評者對影片的評價總是相對於平均水平偏離很大時,會傾向於給出更好的結果。
如下圖是Mick LaSalle和Gene Seymour分別對5部電影的評分(與上圖不同,x軸和y軸對應的是兩個人),虛線被稱為最佳擬合線(best-fit line),其繪制原則是盡可能地靠近圖上的所有坐標點。如果兩位評論者對所有影片的評分情況都相同,那麼這條直線將成為對角線,並且會與圖上所有的坐標點都相交。
下圖展示了一個有著更高相關系數的例子,這意味著Lisa Rose和Jack Matthews在這幾部電影上有著更高的相似度(各點更靠近最佳擬合曲線)。
采用皮爾遜方法可以修正“誇大分值(grade inflation)”的情況。在上圖中,雖然Jack總是傾向於給出比Lisa更高的分數,但最終的直線仍然擬合度較高,這是因為他們兩者有著相對近似的偏好。也就是說,如果某人總是傾向於給出比另一人更高的分數,而兩者的分差又始終保持一致,則他們依然可能會存在很好的相關性。而此前提到過的歐幾裡德距離評價方法,會因為一個人的評價始終比另一個人更為“嚴格”(從而導致評價始終相對較低),而得出兩者不相近的結論,即使他們的品位很相似也是如此。而這一行為是否是我們想要的結果,取決於具體的應用場景。
皮爾遜的相關度算法首先會找出兩位評論者都曾評價過的物品,然後計算兩者的評分總和和平方和,並求得評分的乘積之和。最後,利用這些計算結果計算出相關系數:
PS:公式能看懂,但我還未能從數學上去理解此公式的推導過程,慚愧-_-|||
理解了上一步後,這步就簡單了。現在只需根據指定的人員對每個人進行打分,找出最接近的匹配結果,也即所謂該人的最近鄰。回到上面的例子,我們的目的是要尋找與自己品位相似的影評者,那麼所需要做的就是以你自己為基准,計算每個人和你的相似度,然後排序輸出前幾項即可。現在假設你是Toby,那麼經過這一步的計算你會得到一個你的最近鄰列表,也就是說你可能會知道Lisa、Mick和Claudia可能是和你品位最相近的3個人。
找到一位和你趣味相投的影評者固然不錯,但我們的最終目的是一份影片的推薦列表(上面提到過的以內容推薦為最終目的)。當然,簡單的做法是查找與自己品位最相近的人,並從他所喜歡的影片中找出一部自己還未看過的影片,但這樣做有些隨意或者是粗糙。因為如果該人還未對某些影片做過評論,但這些影片也許就是我們所喜歡的。又或者另外的一種情況就是推薦給你某人特別熱衷的一部影片,但有其他可靠數據表明所有的其他評論者都不看好這部影片。
為了解決上述問題,我們需要一個經過加權的評價值來為影片打分:
上圖中Critic列是與Toby進行相似度對比的人名,Similarity列表示他們與Toby的相似度系數。Night、Lady和Luck都是電影名,所在列是這些人對這些電影的評分。S.x打頭的那幾列給出了相似度系數和評分後相乘的結果。如此一來,相比於我們不相近的人,那些與我們相近的人將會對整體評價擁有更多的貢獻。
那有人會問為什麼不直接采用Total這行,而需要Total/Sim.Sum?這是因為,一部受更多人評論的影片會對結果產生更大的影響,因此我們必須要除以Sim.Sum,它代表了所有對這部電影有過評論的評論者的相似度之和。就像Night這部電影,Total為12.89,有5個人為其評分,而Lady為8.38,4個人評分。假設電影Night有和當前相同的Total分數卻多了一倍的人為其評分,那最後的結果也未必一定比電影Lady的Total/Sim.Sum更好。
好了,我們現在已經得到了一個經過排名的影片列表了,你可以決定自己究竟要不要觀看其中的某一部,或者干脆什麼也別看。其實,有時候什麼都不推薦也是一種推薦。
最後我用lovelycharts畫了這張流程圖(用的時候才現不支持中文噢)。如果你想要設計一個推薦系統,現在應該大概清楚要做哪幾件事情了吧:)