推薦系統的經常使用算法,選擇,漫談,推薦系統開源軟件彙總

推薦系統的經常使用算法概述

 

  前一陣子準備畢業論文的開題,一直在看推薦系統相關的論文。對推薦系統有了一個更加清晰和理性的認識,也對推薦算法有了深刻了解。藉此機會總結分享一下,你們多多拍磚。html

推薦系統的出現python

  隨着互聯網的發展,人們正處於一個信息爆炸的時代。相比於過去的信息匱乏,面對現階段海量的信息數據,對信息的篩選和過濾成爲了衡量一個系統好壞的重要指標。一個具備良好用戶體驗的系統,會將海量信息進行篩選、過濾,將用戶最關注最感興趣的信息展示在用戶面前。這大大增長了系統工做的效率,也節省了用戶篩選信息的時間。git

  搜索引擎的出如今必定程度上解決了信息篩選問題,但還遠遠不夠。搜索引擎須要用戶主動提供關鍵詞來對海量信息進行篩選。當用戶沒法準確描述本身的需求時,搜索引擎的篩選效果將大打折扣,而用戶將本身的需求和意圖轉化成關鍵詞的過程自己就是一個並不輕鬆的過程。github

  在此背景下,推薦系統出現了,推薦系統的任務就是解決上述的問題,聯繫用戶和信息,一方面幫助用戶發現對本身有價值的信息,另外一方面讓信息可以展示在對他感興趣的人羣中,從而實現信息提供商與用戶的共贏。web

 

推薦算法介紹算法

  1 基於人口統計學的推薦apache

  這是最爲簡單的一種推薦算法,它只是簡單的根據系統用戶的基本信息發現用戶的相關程度,而後將類似用戶喜好的其餘物品推薦給當前用戶。api

  

  系統首先會根據用戶的屬性建模,好比用戶的年齡,性別,興趣等信息。根據這些特徵計算用戶間的類似度。好比系統經過計算髮現用戶A和C比較類似。就會把A喜歡的物品推薦給C。網絡

  優點:框架

  a 不須要歷史數據,沒有冷啓動問題

  b 不依賴於物品的屬性,所以其餘領域的問題均可無縫接入。

  不足:

  算法比較粗糙,效果很難使人滿意,只適合簡單的推薦

 

  2 基於內容的推薦

  與上面的方法相相似,只不過此次的中心轉到了物品自己。使用物品自己的類似度而不是用戶的類似度。

  

  系統首先對物品(圖中舉電影的例子)的屬性進行建模,圖中用類型做爲屬性。在實際應用中,只根據類型顯然過於粗糙,還須要考慮演員,導演等更多信息。經過類似度計算,發現電影A和C類似度較高,由於他們都屬於愛情類。系統還會發現用戶A喜歡電影A,由此得出結論,用戶A極可能對電影C也感興趣。因而將電影C推薦給A。

  優點:

  對用戶興趣能夠很好的建模,並經過對物品屬性維度的增長,得到更好的推薦精度

  不足:

  a 物品的屬性有限,很難有效的獲得更多數據

  b 物品類似度的衡量標準只考慮到了物品自己,有必定的片面性

  c 須要用戶的物品的歷史數據,有冷啓動的問題

 

  3 協同過濾

  協同過濾是推薦算法中最經典最經常使用的,具體的思路我已經在以前的一篇文章中提到過,你們能夠去看一下。

  這裏只想介紹一下協同過濾中的方法和剛纔提到方法的區別。

  你們都知道協同過濾分爲基於用戶的協同過濾和基於物品的協同過濾。那麼他們和基於人口學統計的推薦和基於內容的推薦有什麼區別和聯繫呢?下面簡單介紹一下。

  基於用戶的協同過濾——基於人口統計學的推薦

  基於用戶的協同過濾推薦機制和基於人口統計學的推薦機制都是計算用戶的類似度,並基於「鄰居」用戶羣計算推薦,但它們所不一樣的是如何計算用戶的類似度,基 於人口統計學的機制只考慮用戶自己的特徵,而基於用戶的協同過濾機制但是在用戶的歷史偏好的數據上計算用戶的類似度,它的基本假設是,喜歡相似物品的用戶 可能有相同或者類似的口味和偏好。

  基於物品的協同過濾——基於內容的推薦

  基於項目的協同過濾推薦和基於內容的推薦其實都是基於物品類似度預測推薦,只是類似度計算的方法不同,前者是從用戶歷史的偏好推斷,然後者是基於物品自己的屬性特徵信息。

  協同過濾的優點:

  a 它不須要對物品或者用戶進行嚴格的建模,並且不要求物品的描述是機器可理解的,因此這種方法也是領域無關的。

  b 這種方法計算出來的推薦是開放的,能夠共用他人的經驗,很好的支持用戶發現潛在的興趣偏好

  不足:

  a 方法的核心是基於歷史數據,因此對新物品和新用戶都有「冷啓動」的問題。

  b 推薦的效果依賴於用戶歷史偏好數據的多少和準確性。

  c 在大部分的實現中,用戶歷史偏好是用稀疏矩陣進行存儲的,而稀疏矩陣上的計算有些明顯的問題,包括可能少部分人的錯誤偏好會對推薦的準確度有很大的影響等等。

  d 對於一些特殊品味的用戶不能給予很好的推薦。

  e 因爲以歷史數據爲基礎,抓取和建模用戶的偏好後,很難修改或者根據用戶的使用演變,從而致使這個方法不夠靈活。

 

  4 混合推薦算法

  以上介紹的方法是推薦領域最多見的幾種方法。可是能夠看出,每一個方法都不是完美的。所以實際應用中,向Amazon這樣的系統都是混合使用各類推薦算法,各取所長。所以咱們在使用時,也能夠多考慮一下什麼狀況下更適合使用哪一種算法,來提升咱們系統的效率。

 

推薦系統的發展方向

  1 須要考慮在保證推薦準確性的同時增長推薦的多樣性,使特殊喜愛的用戶獲得推薦

  2 須要考慮用戶對系統的實時反饋,更好的利用反饋數據強化推薦算法

  3 考慮時間,空間,任務等因素,來更好的完成推薦

  

歡迎你們拍磚~ 更多資料請看 http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy1/index.html

 

 

 

選擇合適的推薦系統模型

咱們的機器學習工程師一直忙於構建GraphLab farm。這篇博客針對一個特殊的應用難題:怎樣從 GraphLab Create recommender toolkit 的衆多模型和選項中選擇一個合適的推薦模型。

這徹底取決於你現有的數據類型以及你評估結果的方式。

(注意:這裏使用的是GraphLab Create 0.9 的API。GraphLab Create 1.0 支持經過recommender.create() 來智能選擇推薦模型。你能夠經過 1.0 的API文檔查看recommender toolkit中模型的最新說明。此外,這個論壇列出了從版本0.9.1到版本1.0的API變更。)

若是你的數據是隱性的,也就是數據中僅有用戶和物品間的交互信息(沒有用戶對物品的打分),那麼,你能夠選擇使用Jaccard類似度的 ItemSimilarityModel

當數據爲隱反饋時,你能夠經過增長一個均爲1的目標列把數據假裝成顯性數據。若要構建追求排序性能的模型,請見下文。

若是數據是顯性的,也就是觀測數據中包含用戶的真實評分,那麼你能夠從多個模型中選擇。使用cosine或Pearson類似度的ItemSimilarityModel能夠包含評分信息。此外,MatrixFactorizationModel(矩陣分解模型)、FactorizationModel(分解模型) 以及 LinearRegressionModel(線性迴歸模型) 都支持評分預測。

若是你的目標是提升排序性能,你能夠在設置 ranking_regularization 的狀況下使用 ItemSimilarityModel(物品類似度模型)、MatrixFactorizationModel(矩陣分解模型) 、 FactorizationModel(分解模型)。排序正則化選項設置後會隨機地選取一些未觀測數據並把它們的目標評分設成一個偏負面的值。ranking_regularization 值在0到1之間。該值越大,負樣本的權重也就越大。若是你想使用 分解模型來處理隱反饋數據,你應該首先給 SFrame 增長一列全爲1的值把它變成顯性數據,再將 unobserved_rating_value 設爲 0 來運行排序正則化。這裏明確地設定 unobserved_raint_value 是有必要的,由於模型默認把未知評分設爲已知評分的 5% 分位數;當全部已知評分均爲 1 時,它們的 5% 分位數也是 1,不能把它做爲未知評分的目標值。

若是你想對評分數據進行評分預測,那麼選擇MatrixFactorizationModel, FactorizationModel, or LinearRegressionModel的任意一個。從統計學的角度看,這三個模型都是明確地對評分建模的迴歸模型。換句話說,觀測評分被建模爲一些項的加權組合,其中權重(包括一些項,也被成爲因子)經過訓練數據獲得。這幾個模型均可以很方便地引入用戶或物品特徵。

LinearRegressionModel 假設評分是用戶特徵、物品特徵、用戶偏置、物品流行度偏置的線性組合。MatrixFactorizationModel 和 FactorizationModel 還能夠引入兩個向量的內積項,其中一個向量表示用戶對一組隱性特徵的喜愛程度,另外一個向量表示物品對這組隱性特徵的包含程度。這些一般被稱爲隱性因子而且能夠從觀測數據中自動學習獲得。FactorizationModel (分解模型)較 MatrixFactorizationModel(矩陣分解模型) 更進一步, 考慮到了這些隱性因子與邊際特徵的交互影響。通常來講,FactorizationModel(分解模型) 最有效,但也最難訓練(因爲它的威力和靈活性)。LinearRegressionModel(線性迴歸模型) 最簡單,訓練速度也最快,但沒有考慮用戶物品間的交互做用。

咱們建議你從 MatrixFactorizationModel(矩陣分解模型) 開始,若是這個模型運行時間過長,能夠降級使用 LinearRegressionModel(線性迴歸模型)。或者,若是你認爲須要使用二階交互項來增強模型,能夠升級使用 FactorizationModel(分解模型)。注意,這些模型都帶有幾個正則化參數如:n_factors 和 regularization,這些參數會影響測試時的預測精度。這對於 FactorizationModel(分解模型) 尤其有用。建議你使用超參數搜索函數 graphlab.toolkits.model_params_search() 來調整這些參數。

若是目標評分是二值的,也就是它們的值是贊或踩標籤,在使用迴歸模型(LinearRegressionModel, MatrixFactorizationModel, FactorizationModel)時,設置輸入參數‘binary_targets = True’。

使用MatrixFactorizationModel(矩陣分解模型) 和 FactorizationModel (分解模型)訓練獲得的隱性因子能夠做爲特徵用於其餘的任務。在這種情形下,使用非負因子有利於提升可解釋性。簡單地使用‘nmf=True’做爲輸入參數,分解類型的模型就會學習非負因子。

已有數據?數據問題?

最後,有幾個影響推薦系統性能的常見數據問題。第一,若是觀測數據很是稀疏,也就是僅包含大量用戶的一個或兩個觀測數據,那麼任何一個模型都不會比 popularity 或 item_means 這些基準模型效果好。這種狀況下,將稀疏用戶和物品剔除後重試也許有用。另外,從新檢查數據收集和清理過程,看錯誤是否源於此處。儘量對每一個用戶每一個物品獲取更多的觀測數據。

另外一個常常會遇到的問題是把使用數據當作評分。與顯性評分位於一個很好的線性區間(例如,[0, 5])不一樣,使用數據可能被嚴重扭曲。例如,在 Million Song 數據集中,一個用戶播放一首歌超過 16000 次。全部的模型都很難應對這種嚴重扭曲的目標。解決的方法是對使用數據進行歸類。例如,把播放次數超過 50 次映射成最高評分 5 。你也能夠把播放次數轉成二進制,例如播放超高兩次的爲 1,反之爲 0。

好吧,都記住了嗎?是的,咱們一半都記不住。下面這幅粗略的信息圖一目瞭然地顯示了全部的提示。愉快地探索吧,勇敢地推薦系統研究者!

 

 

 

 

互聯網推薦系統漫談

推薦系統這個東西其實在咱們的生活中無處不在,好比我早上買包子的時候,老闆就常常問我要不要來杯豆漿,這就是一種簡單的推薦。隨着互聯網的發展,把線下的這種模式搬到線上成了大勢所趨,它大大擴展了推薦系統的應用:亞馬遜的商品推薦,Facebook的好友推薦,Digg的文章推薦,豆瓣的豆瓣猜,Last.fm和豆瓣FM的音樂推薦,Gmail裏的廣告......在現在互聯網信息過載的狀況下,信息消費者想方便地找到本身感興趣的內容,信息生產者則想將本身的內容推送到最合適的目標用戶那兒。而推薦系統正是要充當這二者的中介,一舉兩得解決這兩個難題。

推薦系統的評判標準

首先咱們得明確什麼是好的推薦系統。能夠經過以下幾個標準來斷定。

  • 用戶滿意度  描述用戶對推薦結果的滿意程度,這是推薦系統最重要的指標。通常經過對用戶進行問卷或者監測用戶線上行爲數據得到。
  • 預測準確度  描述推薦系統預測用戶行爲的能力。通常經過離線數據集上算法給出的推薦列表和用戶行爲的重合率來計算。重合率越大則準確率越高。
  • 覆蓋率  描述推薦系統對物品長尾的發掘能力。通常經過全部推薦物品佔總物品的比例和全部物品被推薦的機率分佈來計算。比例越大,機率分佈越均勻則覆蓋率越大。
  • 多樣性  描述推薦系統中推薦結果可否覆蓋用戶不一樣的興趣領域。通常經過推薦列表中物品兩兩之間不類似性來計算,物品之間越不類似則多樣性越好。
  • 新穎性  若是用戶沒有據說過推薦列表中的大部分物品,則說明該推薦系統的新穎性較好。能夠經過推薦結果的平均流行度和對用戶進行問卷來得到。
  • 驚喜度  若是推薦結果和用戶的歷史興趣不類似,但讓用戶很滿意,則能夠說這是一個讓用戶驚喜的推薦。能夠定性地經過推薦結果與用戶歷史興趣的類似度和用戶滿意度來衡量。

簡而言之,一個好的推薦系統就是在推薦準確的基礎上給全部用戶推薦的物品儘可能普遍(挖掘長尾),給單個用戶推薦的物品儘可能覆蓋多個類別同時不要給用戶推薦太多熱門物品,最牛逼的則是能讓用戶看到推薦後有種「相見恨晚」的感受。

推薦系統的分類

推薦系統是創建在大量有效數據之上的,背後的算法思想有不少種,要大致分類的話能夠從處理的數據入手。

1.利用用戶行爲數據 

互聯網上的用戶行爲千千萬萬,從簡單的網頁瀏覽到複雜的評價,下單......這其中蘊含了大量的用戶反饋信息,經過對這些行爲的分析,咱們便能推知用戶的興趣喜愛。而這其中最基礎的就是「協同過濾算法」

「協同過濾算法」也分兩種,基於用戶(UserCF)和基於物品(ItemCF)。所謂基於用戶,就是跟據用戶對物品的行爲,找出興趣愛好類似的一些用戶,將其中一個用戶喜歡的東西推薦給另外一個用戶。舉個例子,老張喜歡看的書有A,B,C,D;老王喜歡看的書有A,B,C,E。經過這些數據咱們能夠判斷老張和老王的口味略類似,因而給老張推薦E這本書,同時給老王推薦D這本書。對應的,基於物品就是先找出類似的物品。怎麼找呢?也是看用戶的喜愛,若是同時喜歡兩個物品的人比較多的話,就能夠認爲這兩個物品類似。最後就只要給用戶推薦和他原有喜愛相似的物品就成。舉例來講,咱們發現喜歡看《從一到無窮大》的人大都喜歡看《什麼是數學》,那若是你剛津津有味地看完《從一到無窮大》,咱們就能夠立馬給你推薦《什麼是數學》。

至於何時用UserCF,何時用ItemCF,這都要視狀況而定。通常來講,UserCF更接近於社會化推薦,適用於用戶少,物品多,時效性較強的場合,好比Digg的文章推薦;而ItemCF則更接近個性化推薦,適用於用戶多,物品少的場合,好比豆瓣的豆瓣猜、豆瓣FM,同時ItemCF還能夠給出靠譜的推薦理由,例如豆瓣的「喜歡OO的人也喜歡XX」和亞馬遜的「買了XX的人也買了OO」。

協同過濾算法也有很多缺點,最明顯的一個就是熱門物品的干擾。舉個例子,協同過濾算法常常會致使兩個不一樣領域的最熱門物品之間具備較高的類似度,這樣極可能會給喜歡《算法導論》的同窗推薦《哈利波特》,顯然,這不科學!要避免這種狀況就得從物品的內容數據入手了,後文提到的內容過濾算法就是其中一種。

除了協同過濾算法,還有隱語義模型(LFM)應用得也比較多,它基於用戶行爲對物品進行自動聚類,從而將物品按照多個維度,多個粒度分門別類。而後根據用戶喜歡的物品類別進行推薦。這種基於機器學習的方法在不少指標上優於協同過濾,但性能上不太給力,通常能夠先經過其餘算法得出推薦列表,再由LFM進行優化。

2.利用用戶標籤數據 

咱們知道不少網站在處理物品條目的時候會經過用戶本身標註的標籤來進行分類,好比網頁書籤Delicious,博客的標籤雲,豆瓣書影音的標籤。這些標籤自己就是用戶對物品的一種聚類,以此做爲推薦系統的依據仍是頗有效的。

關於標籤的推薦,一種是根據用戶打標籤的行爲爲其推薦物品,還有一種是在用戶給物品打標籤的時候爲其推薦合適的標籤。

根據標籤推薦物品的基本思想就是找到用戶經常使用的一些標籤,而後找到具備這些標籤的熱門物品,將其推薦給用戶。這裏要注意兩個問題,一個是要保證新穎性和多樣性,能夠用TF-IDF方法來下降熱門物品的權重;另外一個則是須要清除某些同義重複標籤和沒有意義的標籤。

在用戶打標籤時爲其推薦標籤也是至關重要的,一方面能方便用戶輸入標籤,一方面能提升標籤質量,減小冗餘。典型的應用場景就是用豆瓣標記書影音。這裏的思想就是將當前物品上最熱門的標籤和用戶本身最經常使用的標籤綜合在一塊兒推薦給用戶。其實豆瓣就是這麼作的,它在用戶標記物品的時候,給用戶推薦的標籤就分爲「個人標籤」和「經常使用標籤」兩類,而在「個人標籤」裏也考慮了物品的因素。

基於標籤的推薦有不少優勢,一方面能夠給用戶提供比較準確的推薦理由;另外一方面標籤雲的形式也提升了推薦的多樣性,給了用戶必定的自主選擇。標籤其實能夠看作一種物品的內容數據,好比書的做者,出版社,類型;音樂的國別,風格,做者等等,基於這些信息的推薦能夠彌補上述基於用戶行爲推薦的一些弱點。

3.利用上下文信息

此處所謂的上下文,是指用戶所處的時間,地點,心情等。這些因素對於推薦也是相當重要的,好比聽歌的心情,商品的季節性等等。

這裏主要以時間爲例說說,在不少新聞資訊類網站中,時效性是很重要的一點,你要推薦一篇一年前的新聞給用戶,估計會被罵死。在這種推薦中就須要加入時間衰減因子,對於越久以前的物品,賦予越小的權重。一樣的思想也能夠用在基於用戶行爲的推薦中,這裏有不少能夠優化的地方。對於ItemCF來講,同一用戶在間隔很短的時間內喜歡的不一樣物品能夠給予更高的類似度,而在找類似物品時也能夠着重考慮用戶最近喜歡的物品;對於UserCF,若是兩個用戶同時喜歡了相同的物品,那麼能夠給予這兩個用戶更高的類似度,而在推薦物品時,也可着重推薦口味相近的用戶最近喜歡的物品。咱們能夠給類似度和用戶的行爲賦予必定權重,時間間隔越久權重越低,通過這種改進的「協同過濾算法」每每能獲得用戶更滿意的結果。

相似的,在LBS成爲應用標配的今天,能夠根據物品與用戶的距離賦予相應的權重,再綜合其餘因素獲得靠譜的地點推薦。

4.利用社交網絡數據

現在以Facebook,Twitter爲首的社交網絡大行其道,而其中的海量數據也是一大寶庫。實驗證實,因爲信任的做用,來自好友的推薦每每能獲取更高的點擊率,鑑於此,亞馬遜就利用了Facebook的信息給用戶推薦好友喜歡的商品。此種推薦相似於UserCF,只是尋找用戶之間的關係時除了興趣類似度之外還得考慮熟悉度(如共同好友個數),這樣一來,你的閨蜜們和基友們喜歡的物品極可能就會被推薦給你。

在社交網絡內部也有許多推薦算法的應用。其中最重要的當屬好友推薦,可依據的數據有不少:人口統計學屬性(例如人人的找同窗),共同興趣(如Twitter中轉發的信息),好友關係(共同好友數量,N度人脈)。另外還有信息流(Timeline)推薦,這其中以Facebook的EdgeRank爲表明,大體思想就是:若是一個會話(Feed)被你熟悉的好友最近產生太重要的行爲,它在信息流的排序中就會有比較高的權重。另外,基於社交網絡興趣圖譜和社會圖譜的精準廣告投放也是推薦系統的關鍵應用,它決定着社交網站的變現能力

推薦系統的冷啓動問題

介紹了這麼多類的推薦系統,最後說說推薦系統的一個主要問題:冷啓動問題。具體分三種狀況:如何給新用戶作個性化推薦,如何將新物品推薦給用戶,新網站在數據稀少的狀況下如何作個性化推薦。

對此也有相應的解決方案。對於新用戶,首先能夠根據其註冊信息進行粗粒度的推薦,如年齡,性別,愛好等。另外也能夠在新用戶註冊後爲其提供一些內容,讓他們反饋對這些內容的興趣,再根據這些數據來進行推薦。這些內容須要同時知足熱門和多樣的要求。而對於新物品的推薦,可能就要從其內容數據上下功夫了。咱們能夠經過語義分析對物品抽取關鍵詞並賦予權重,這種內容特徵相似一個向量,經過向量之間的餘弦類似度即可得出物品之間的類似度,從而進行推薦。這種內容過濾算法在物品(內容)更新較快的服務中獲得大量應用,如新聞資訊類的個性化推薦。

而在網站初建,數據不夠多的狀況下,可能就要先經過人工的力量來創建早期的推薦系統了。簡單一點的,人工編輯熱門榜單,高級一點的,人工分類標註。國外的個性化音樂電臺Pandora就僱了一批懂計算機的音樂人來給大量音樂進行多維度標註,稱之爲音樂基因。有了這些初始數據,就能夠方便地進行推薦了。國內的Jing.fm初期也是經過對音樂的物理信息,情感信息,社會信息進行人工分類,然後再經過機器學習和推薦算法不斷完善,打造出了不同的個性化電臺。

除了這些,利用社交網絡平臺已有的大量數據也是一個不錯的方法,尤爲是那些依託於其餘SNS帳號系統的服務。

算法vs人

有不少人懷疑推薦系統是否會讓一我的關注的東西愈來愈侷限,但看完這些你會以爲並不是如此,多樣性,新穎性和驚喜度也都是考察推薦系統的要素。而至於算法和人究竟哪一個更重要的爭論,我很贊同唐茶創始人李如一的一個觀點:

在技術社羣的討論裏,你們默認以爲讓推薦算法變得更聰明、讓軟件變得更「智能」必定是好事。但人不能那麼懶的。連「發現本身可能感興趣的內容」這件事都要交給機器作嗎?不要以爲我是Luddite。真正的技術主義者永遠會把人放到第一位。

我想補充的是,算法雖然不能解決所有問題,但算法能夠變得更人性化。套用某人「網絡就是社會」的論斷,其實算法和人之間早已不那麼涇渭分明瞭。

 

 

 

推薦系統開源軟件彙總

我收集和整理的目前互聯網上所能找到的知名開源推薦系統(open source project for recommendation system),並附上了我的的一些簡單點評(未必全面準確),
這方面的中文資料不多見,但願對國內的朋友瞭解掌握推薦系統有幫助
 
陳運文
 
  SVDFeature
由上海交大的同窗開發的,C++語言,代碼質量很高 。去年咱們參加KDD競賽時用過,很是好用,並且出自我們國人之手,因此置頂推薦!
 
SVDFeature包含一個很靈活的Matrix Factorization推薦框架,能方便的實現SVD、SVD++等方法, 是單模型推薦算法中精度最高的一種。SVDFeature代碼精煉,能夠用相對較少的內存實現較大規模的單機版矩陣分解運算。
 
另外含有Logistic regression的model,能夠很方便的用來進行ensemble運算
 
 
 
 
Crab
項目地址:
 
 
系統的Tutorial能夠看這裏:
 
Crab是基於Python開發的開源推薦軟件,其中實現有item和user的協同過濾。聽說更多算法還在開發中,
Crab的python代碼看上去很清晰明瞭,適合一讀
 
CofiRank
C++開發的 Collaborative Filtering算法的開源推薦系統,但彷佛2009年後做者就沒有更新了,
CofiRank依賴boost庫,聯編會比較麻煩。不是特別推薦
項目地址:
 
 
 
EasyRec
Java開發的推薦系統,感受更像一個完整的推薦產品,包括了數據錄入模塊、管理模塊、推薦挖掘、離線分析等,整個系統比較完備。
項目地址:
 
 
 
  GraphLab
項目地址:
Graphlab是基於C++開發的一個高性能分佈式graph處理挖掘系統,特色是對迭代的並行計算處理能力強(這方面是hadoop的弱項),
因爲功能獨到,GraphLab在業界名聲很響
用GraphLab來進行大數據量的random walk或graph-based的推薦算法很是有效。
Graphlab雖然名氣比較響亮(CMU開發),可是對通常數據量的應用來講可能還用不上
 
 
Lenskit
這個Java開發的開源推薦系統,來自美國的明尼蘇達大學,也是推薦領域知名的測試數據集Movielens的做者,
他們的推薦系統團隊,在學術圈內的影響力很大,不少新的學術思想會放到這裏
 
 
Mahout
網址
Mahout知名度很高,是Apache基金資助的重要項目,在國內流傳很廣,並已經有一些中文相關書籍了。注意Mahout是一個分佈式機器學習算法的集合,協同過濾只是其中的一部分。除了被稱爲Taste的分佈式協同過濾的實現(Hadoop-based,另有pure Java版本),Mahout裏還有其餘常見的機器學習算法的分佈式實現方案。
 
另外Mahout的做者之一Sean Owen基於Mahout開發了一個試驗性質的推薦系統,稱爲Myrrix, 能夠看這裏:
http://myrrix.com/quick-start/ 
 
 
MyMediaLite
基於.NET框架的C#開發(也有Java版本),做者基原本自德國、英國等歐洲的一些高校。
除了提供了常見場景的推薦算法,MyMediaLite也有Social Matrix Factorization這樣獨特的功能
儘管是.Net框架,但也提供了Python、Ruby等腳本語言的調用API
MyMediaLite的做者之一Lars Schmidt在2012年KDD會議上專門介紹過他們系統的一些狀況,惋惜因爲.Net開發框架日漸式微,MyMediaLite對Windows NT Server的系統吸引力大些,LAMP網站用得不多
 
 
LibFM
項目網址:
做者是德國Konstanz University的Steffen Rendle,去年KDD Cup競賽上咱們的老對手,他用LibFM同時玩轉Track1和Track2兩個子競賽單元,都取得了很好的成績,說明LibFM是很是管用的利器(雖然在Track1上被咱們戰勝了,hiahia)
顧名思義,LibFM是專門用於矩陣分解的利器,尤爲是其中實現了MCMC(Markov Chain Monte Carlo)優化算法,比常見的SGD(隨即梯度降低)優化方法精度要高(固然也會慢一些)
 
順便八卦下,去年KDD會議上和Steffen當面聊過,他很靦腆並且喜歡偷笑,呵呵挺可愛。
 
LibMF
項目地址:
http://www.csie.ntu.edu.tw/~cjlin/libmf/
注意LibMF和上面的LibFM是兩個不一樣的開源項目。這個LibMF的做者是大名鼎鼎的臺灣國立大學,他們在機器學習領域頗負盛名,近年連續多屆KDD Cup競賽上均得到優異成績,並曾連續多年得到冠軍。臺灣大學的風格很是務實,業界經常使用的LibSVM, Liblinear等都是他們開發的,開源代碼的效率和質量都很是高
 
LibMF在矩陣分解的並行化方面做出了很好的貢獻,針對SDG優化方法在並行計算中存在的locking problem和memory discontinuity問題,提出了一種矩陣分解的高效算法,根據計算節點的個數來劃分評分矩陣block,並分配計算節點。系統介紹能夠見這篇論文(Recsys 2013的 Best paper Award)
Y. Zhuang, W.-S. Chin, Y.-C. Juan, and C.-J. Lin. A Fast Parallel SGD for Matrix Factorization in Shared Memory Systems. Proceedings of ACM Recommender Systems 2013.
 
PREA
全名是 Personalized Recommendation Algorithms Toolkit, 開發語言爲Java。也是一個輕量級的開源項目
項目網址:
 
放在Mloss這個大project下。我我的感受PREA仍是比較簡陋的,參加開發的三位工程師Joonseok Lee, Mingxuan Sun, Guy Lebanon更新頻率很低,提供的資料也少。
 
不過Mloss下卻是能找到其餘一些推薦開源項目
 
 
Python-recsys
一個很是輕量級的開源推薦系統,python開發,做者彷佛只有一位,
Python-recsys主要實現了SVD、Neighborhood SVD推薦算法,
這個項目麻雀雖小五臟俱全,評估數據(Movielens,Last.fm)、評估框架也都有
API也很簡單清晰,代碼簡潔,屬於推薦入門的良好教材。
不過真正要用到實際系統中,仍是得補充不少內容
 
github的地址位於
 
項目的介紹見:
 
RapidMiner
項目網址爲:
Java語言開發,RapidMiner(前身是Yale)已是一個比較成熟的數據挖掘解決方案了,包括常見的機器學習、NLP、推薦、預測等方法(推薦只佔其中很小一部分),並且帶有GUI的數據分析環境,數據ETL、預處理、可視化、評估、部署等整套系統都有。
 
另外RapidMiner提供commercial license,提供R語言接口,感受在向着一個商用的數據挖掘公司的方向在前進。
 
 
 
Recommendable
基於Ruby語言開發,實現了一些評分預測的推薦算法,可是總體感受比較單薄,
github上地址以下:
 
 
Recommenderlab
基於R語言開發的開源推薦程序,對常用R語言的工程師或者BI數據分析師來講,recommenderlab的出現絕對算得上是福音了
項目地址:
 
 
基於Recommenderlab來開發推薦系統,代碼會很是精簡,由於推薦系統所依賴的user-item rating matrix對擅長處理向量運算的R語言來講再方便不過了,
可是在實際推薦系統中,須要考慮的問題和邏輯都比較複雜,用Recommenderlab不是很靈活。另外受限於R語言對內存的限制,Recommenderlab不太適用於過大規模的推薦應用
 
 
Waffles
SF地址:
Waffles英文原意是蜂蜜甜餅(見logo),在這裏卻指代一個很是強大的機器學習的開源工具包,基於C++語言開發。
Waffles裏包含的算法特別多,涉及機器學習的方方面面,推薦系統位於其中的Waffles_recommend tool,大概只佔整個Waffles的1/10的內容(其它還有分類、聚類、採樣、降維、數據可視化、音頻處理等許許多多工具包,估計能與之媲美的也就數Weka了)
 
相關文章
相關標籤/搜索