1. 程式人生 > >基於ALS演算法的簡易線上推薦系統

基於ALS演算法的簡易線上推薦系統

    繼前期完成廣義線性模型的線上流式機器學習的程式碼後,我們對spark的mllib中的推薦系統這一部分比較感興趣,因為推薦系統這一部分在現實生活中也非常實用,尤其是基於地理位置的線上推薦系統目前非常火熱,很多商業軟體如大眾點評,淘點點等都希望能根據使用者以往的一些行為和當前所處的地理位置給使用者做出最佳的推薦,給使用者帶來意想不到的驚喜。

    在推薦系統領域,目前市面上中文的參考書並不多,我們主要學習了目前就職於hulu公司的項亮編著的《推薦系統實戰》這本書,這本書詳細的介紹了推薦系統方面的一些典型演算法和評估方法,並且結合作者的實際經驗給出了很多推薦系統的相關例項,是學習推薦系統不可多得的一本好書,我們也受益匪淺。

    在spark的例程中作者是根據movielens資料庫(採用spark自帶的小型movielens資料庫在spark的data/mllib/sample_movielens_data.txt中)通過ALS(alternating leastsquares)演算法來做的推薦系統。參考連結

    最初我們也是用上面所說的1500個的資料集進行線上ALS演算法的有效性,效果還不錯,後面我們採用中等規模的movielens資料集進行測試,取得比較好的效果,具體過程記錄如下。資料集的連結如下。

    這種ALS演算法不像基於使用者或者基於物品的協同過濾演算法一樣,通過計算相似度來進行評分預測和推薦,而是通過矩陣分解的方法來進行預測使用者對電影的評分。即如下圖所示。

    已知的使用者對電影的評分的資料如下圖所示。


    第一項表示使用者的ID號,第二項表示電影的ID號,第三項表示使用者對電影評分的分值。

    因此可以通過資料集中的資料構建使用者評分矩陣,但是往往使用者的評分不會填滿所有的矩陣,因此就需要通過矩陣分解的方法,將矩陣X分解為A*B,也即儘量滿足X=AB這個等式。ALS演算法中,通過首先隨機化矩陣A,然後通過目標函式求得B,再對B進行歸一化處理後,再去求A,不斷地迭代下去,直到A*B滿足一定的收斂條件為止。

    在我們的線上推薦系統中,我們借用spark的ALS演算法的訓練和預測函式,每次收到新的資料後,將其更新到訓練資料集中,然後更新ALS訓練得到的模型,然後對整個movielens資料集進行評分預測計算RMSE,來看RMSE的收斂情況來推斷演算法的訓練效果。(注:由於水平有限,我們發現更改spark的ALS的訓練模型為線上訓練模型比較困難,也即在接收到新的資料後,通過更低的演算法複雜度的演算法得到新的分解的矩陣,而不是重新計算分解的矩陣AB的資料值)

       流程圖如下圖所示。


    在程式設計的時候得注意第一步訓練ALS模型的時候,給ALS模型的初始化資料集是對movielens資料集中的1500個數據根據每個使用者的評分資料隨機提取20%的資料組合而成的。另外每個使用者隨機選取20%的資料組合在一起作為測試資料集。剩下的60%的資料作為流式學習的資料集。

   有一個初始化模型資料集的原因是因為ALS演算法是基於矩陣分解來做的,如果最開始的資料集的取值空間不夠大的話,在下圖中的測試結果中可以看到,最初的資料集在測試集上只能預測14670個點,其實測試集是有20000個數據集的,因此很多點我們的模型無法預測,不過沒有關係,隨著訓練資料的不斷增加,我們可以預測的資料逐漸趨近於20000個,並且預測的RMSE逐漸減小,達到了線上訓練的效果。


注:

    由於ALS演算法複雜度較高,我們最初在1G記憶體的linux上跑,出現了一些bug,換到4G記憶體的機器才能進行簡易的ALS模型的計算,而且ALS模型的rank, lambda, iter這幾個引數都比較重要,我們選擇了比較小的引數,使模型訓練簡單,但是可以說明問題,如果增加引數,模型會更好,由於機器條件限制,難以測試更好的模型的效果。

    另外,程式設計的時候碰到好多資料結構不對,或者成員函式用法不對的問題,這裡給出一些相關的網站參考連結,以備不時之需。由於各種資料結構的繼承關係,程式設計中的所有的資料結構及其成員函式的用法在下面連結中都可以找到。

1、java的各種資料結構型別和成員函式的用法

2、spark各種資料結構型別和成員函式的用法

3、scala各種資料結構型別和成員函式的用法

http://www.scala-lang.org/api/current/#package



相關推薦

基於ALS演算法簡易線上推薦系統

    繼前期完成廣義線性模型的線上流式機器學習的程式碼後,我們對spark的mllib中的推薦系統這一部分比較感興趣,因為推薦系統這一部分在現實生活中也非常實用,尤其是基於地理位置的線上推薦系統目前非常火熱,很多商業軟體如大眾點評,淘點點等都希望能根據使用者以往的一些行為

基於Spark ALS線上推薦系統

所用技術: Bootstrap、flat-ui 、 Servlet、Spark1.4.1、Hadoop2.6.0、JDK 說明:本系統不涉及ssh相關內容,只有簡單的Servlet和JSP、HTML頁面,系統架構相對簡單。 系統部署

基於Spark ALS演算法的個性化推薦

今天來使用spark中的ALS演算法做一個小推薦。需要資料的話可以點選檢視,在文末點選閱讀原文即可獲取。其實在R中還有一個包可以做推薦,那就是recommenderlab。如果資料量不大的時候可以使用r

基於ALS演算法電影推薦(java版)

基於ALS演算法的最佳電影推薦(java版) package spark; import java.util.Arrays; import java.util.List; import org.apache.log4j.Level; import or

基於近鄰使用者協同過濾演算法的音樂推薦系統

0. 摘 要 基於近鄰使用者的協同過濾音樂推薦系統,主要是將與目標使用者有相同行為和興趣愛好的使用者,形成一個最近鄰的推薦群組,從最近鄰推薦群組中產生最終的目標使用者推薦列表。該推薦系統通過網路爬蟲獲取蝦米音樂網站真實未脫敏使用者的行為資訊,採用餘弦相似度作為

基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦系統(一) 協同過濾演算法概述&&基於模型的協同過濾的演算法思想(演算法模型和結構待補充)

本文暫時分為三部分: (一)基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦系統(一)            → 協同過濾演算法概述&&基於模型的協同過濾的演算法思想 (二)基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦

基於使用者的協同過濾演算法的電影推薦系統

上一篇講解了推薦演算法的分類,這裡電影推薦系統具體分析一下 第一步:建立使用者電影矩陣模型         如表1所示,協同過濾演算法的輸入資料通常表示為一個m*n的使用者評價矩陣Matrix,m是使

基於spark做一個歌手推薦系統

最近工作在做一個推薦系統,之前也有用TensorFlow寫過一個,後來學習了spark,覺得用spark來做這個推薦系統應該會更簡單一些,在這裡,我們一起來學習一下用pandas和spark做推薦系統。我們的資料來源是後臺收集的使用者聽了哪些歌手的歌曲,我們資料的同學將清洗好的歌手資料給

【應用演算法】資訊流-推薦系統的去重策略

聊兩個問題,它們看似和推薦系統沒有必然關係,但實際上, 在你構建自己的推薦系統的時候,不可避免地會遇到這兩個問題。 去重是剛需 在推薦系統中,有一個剛需就是去重,那麼說在哪些地方有去重的需求呢? 主要是在兩個地方:一個是內容源去重,另一個是不重複給使用者推薦。

基於傳統機器學習的推薦系統

推薦演算法具有非常多的應用場景和商業價值,種類很多,但是目前使用最廣泛的是以下兩種: 1.  基於內容的推薦。通過NLP的一些技術,挖掘文字內容,進而做推薦。 2.  基於協同過濾演算法的推薦。 #協同過濾 協同過濾(Collaborative Filtering),假設我們有m

基於Spark平臺的電影推薦系統實現

博主一年前寫過一個這樣的文章,電影推薦也是博主一年前就學習過的,溫故而知新,重新拿出來好好重新研究一番。 這時以前的文章連結:如何使用Spark ALS實現協同過濾http://www.aboutyun.com/forum.PHP?mod=viewthread&

協同過濾Item-based演算法實現電影推薦系統

系統詳細設計 離線計算推薦電影模組 系統所用演算法:  本系統採用協同過濾(Collaborative Filtering)推薦演算法。協同過濾推薦演算法分為預測過程和推薦過程,其包括Item-based演算法和User-based演算法,但經查閱相

基於RFID的簡易圖書管理系統設計與實現

  本次開發主要做了從串列埠分別獲取讀者卡號和圖書卡號,實現圖書管理,圖書借閱,讀者管理等功能。開發語言是C#,開發環境使用Visual Studio 2015。資料庫採用sql Server。   RFID選擇   讀者卡跟圖書卡均採用125K,一般稱之為低頻卡,典型的

基於Apache Mahout的電影推薦系統

基於使用者的推薦結果: 工程目錄: 1.資料庫連線不上,總是報錯。(注:mysql的連線jar包也匯入了,版本也換過,還是報錯,用的是tomcat6.0),之後換了tomcat7.0無此報錯。 o

基於隱語義模型的推薦系統

如何根據上邊兩位豆瓣使用者的圖書列表做出推薦? 傳統的推薦方法 UserCF,首先需要找到和他們看了同樣書的其他使用者,然後給他們推薦那些使用者喜歡的其他書。 ItemCF,需要給他們推薦和他們已經看的書相似的書。 基於隱語義模型 通過矩陣分解建立

scala應用-基於user協同過濾的推薦系統

以下是一個只用scala語言開發的推薦系統,可以參考一下,這個能執行一些小資料集,當然可以改造成多執行緒,實踐中表明,百M級別多執行緒和分散式的相同配置的機器在運算上並沒有很大的時間上的差別。這個要研究scala原始碼的執行緒池物件(和java的很類似)。 S

簡易線上投票系統(php)——前端設計(投票頁面的原始碼)

投票頁面的原始碼<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &

簡易線上投票系統(php)——投票結果頁面

投票的結果頁面的功能是根據投票的統計資料,顯示當前的投票結果。只有在登入的情況下才能檢視。 1、資料庫連線部分 <?php if($ouser == ''){

基於使用者的協同過濾演算法實現的商品推薦系統

基於使用者的協同過濾演算法實現的商品推薦系統   專案介紹 商品推薦是針對使用者面對海量的商品資訊而不知從何下手的一種解決方案,它可以根據使用者的喜好,年齡,點選量,購買量以及各種購買行為來為使用者推薦合適的商品。在本專案中採用的是基於使用者的協同過濾的推薦演算法來實現

推薦系統(一)基於協同過濾演算法開發離線推薦

什麼是離線推薦 所謂的離線推薦其實就是根據使用者產生的行為日誌,後臺設定一個離線統計演算法和離線推薦演算法的任務來對這些行為日誌進行週期性的統計,統計過後的結果資料為前臺或者實時分析提供資料的支撐。離線推薦要求實時性不高。 離線推薦演算法之協同過濾 協同過濾其實就是藉助大量已