Mahout 個性化推薦系統

推薦系統
面對海量的數據信息,從中快速推薦出符合用戶特點、是用戶感興趣的物品

推薦算法分類
1 基于人口統計學的推薦
2 基于內容的推薦
3 基于協同過濾的推薦
4 混合推薦

基于人口統計學的推薦


截屏2020-09-08 下午11.49.12.png

基于內容的推薦


截屏2020-09-08 下午11.50.45.png

基于協同過濾的推薦(是利用某興趣相投、擁有共同經驗之群體的喜好來推薦用戶感興趣的信息)
1 基于近鄰的協同過濾(基于用戶、基于物品)
2 基于模型的協同過濾(奇異值分解(SVD)、潛在語義分析(LSA)、支撐向量機(SVM))

  • 1 基于用戶的協同過濾(基于用戶、基于物品)


    截屏2020-09-08 下午11.54.09.png
  • 2 基于物品的協同過濾


    截屏2020-09-08 下午11.55.11.png

Apache Mahout是基于Lambda架構,基于計算引擎(MapReduce/Spark/Flink?H2O)開發的機器學習和數據挖掘的分布式框架, 分布式線性代數框架,旨在快速實現自己的算法,支持多個分布式后端。


截屏2020-09-10 上午9.25.19.png

Mahout實現了常用的數據挖掘算法,包括聚類算法、回歸算法、余玄相似性、分類算法、推薦過濾、頻繁子項挖掘

  • 個性化推薦系統實現步驟
1 獲取用戶畫像
2 構建數據模型
3 將原始數據映射到Mahout定義的Data Model中
    DataModel(基于內存)
    GenericBooleanPrefDataModel(基于內存)
    FileDataModel(基于文件)
    JDBCDataModel(基于數據庫)
4 調優推薦組件(相似度組件、臨界關系組件、推薦算法等)
5 推薦模型評估
  • 代碼實現
       <dependency>
           <groupId>org.apache.mahout</groupId>
           <artifactId>mahout-core</artifactId>
           <version>${mahout.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.mahout</groupId>
           <artifactId>mahout-integration</artifactId>
           <version>${mahout.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.mahout</groupId>
           <artifactId>mahout-math</artifactId>
           <version>${mahout.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.mahout</groupId>
           <artifactId>mahout-examples</artifactId>
           <version>${mahout.version}</version>
       </dependency>

1 用戶相似度模型
       /**
        * LogLikelihoodSimilarity 對數似然相似度
        * TanimotoCoefficientSimilarity 谷本系數相似度
        * CityBlockSimilarity 曼哈頓距離相似度
        * SpearmanCorrelationSimilarity Spearman秩相關系數
        * UncenteredCosineSimilarity 余弦相似度
        * EuclideanDistanceSimilarity 歐幾里得距離相似度
        * PearsonCorrelationSimilarity 皮爾遜相關系數相似度
        * */
   UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);

2 構建近鄰對象  threshold 是相似閾值 這個數值越高  推薦精準越高  但是推薦的數據也越少 最高為 給用戶設置的喜好值最高值 
       /**
        * ThresholdUserNeighborhood 對每個用戶基于一定的限制,相似度限制內的所有用戶為鄰居
        * NearestNUserNeighborhood 對每個用戶取固定數量 N 的最近鄰居
        * */
   float threshold = 0f;
   UserNeighborhood neighborhood = new ThresholdUserNeighborhood(threshold, userSimilarity, dataModel);

3 構建推薦器
        /**
        * GenericUserBasedRecommender 基于用戶相似度
        * GenericItemBasedRecommender 基于item相似度
        * SlopeOneRecommender 基于SlopeOne算法
        * SVDRecommender 基于支持向量機
        * KnnItemBasedRecommender 基于相似用戶的實現
        * TreeClusteringRecommender 基于樹形聚類的推薦算法
        * */
   UserBasedRecommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, userSimilarity);
   // 給用戶4推薦10個相似數據
   List<RecommendedItem> recommend = recommender.recommend(4, 10);
   for (RecommendedItem recommendedItem : recommend) {
       System.out.println(recommendedItem);
   }
4 結果輸出
      try(PrintWriter writer = new PrintWriter(resultFile)){
           for (int userID=1; userID <= model.getNumUsers(); userID++){
               List<RecommendedItem> recommendedItems = recommender.recommend(userID, 2);
               String line = userID+" : ";
               for (RecommendedItem recommendedItem: recommendedItems){
                   line += recommendedItem.getItemID()+":"+recommendedItem.getValue()+",";
               }
               if (line.endsWith(",")){
                   line = line.substring(0, line.length()-1);
               }
               writer.write(line);
               writer.write('\n');
           }
       } catch (IOException ioe){
           resultFile.delete();
           throw ioe;
       }
5 推薦模型評估
       //參數0.9表示每個用戶訓練集為90%,1.0代表所有的用戶來參與評估
      // 0。75 預測評分為5的話,實際為 5 - 0.75
      // 結果值越小與實際值越相似
       double score = evaluator.evaluate(recommenderBuilder, null, dataModel, 0.9, 1.0);
       System.out.println("均方差:"+score);
       double rmse = recommenderEvaluator.evaluate(recommenderBuilder, null, dataModel, 0.9, 1.0);
       System.out.println("均方根誤差:"+rmse);

截屏2020-09-06 下午11.46.59.png

相似度算法分析

歐式距離
歐幾里得度量(euclidean metric)(也稱歐氏距離)是一個通常采用的距離定義,指在m維空間中兩個點之間的真實距離,或者向量的自然長度(即該點到原點的距離)。在二維和三維空間中的歐氏距離就是兩點之間的實際距離
場景:適合于特征數據量較小的情況


截屏2020-09-10 下午2.01.35.png

歐式距離相似度EuclideanDistanceSimilarity
原理:利用歐式距離d定義的相似度s,s=1 / (1+d)。
范圍:[0,1],值越大,說明d越小,也就是距離越近,則相似度越大。

曼哈頓距離
同歐式距離相似,都是用于多維數據空間距離的測度。
兩個點在標準坐標系上的絕對軸距總和
應用場景:主要應用場景,如棋盤、城市里兩個點之間的距離等


截屏2020-09-10 下午1.46.52.png

截屏2020-09-10 下午1.41.45.png

曼哈頓距離CityBlockSimilarity
范圍:[0,1],同歐式距離一致,值越小,說明距離值越大,相似度越大。
說明:比歐式距離計算量少,性能相對高。

余弦相似度
多維空間兩點與所設定的點形成夾角的余弦值。
余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"余弦相似性"。
應用場景:用余弦值衡量文本相似度,常用于文本識別,比如新聞的挖掘
舉例:
文本1中詞語a,b分別出現100,50次,向量表示為(100,50)
文本2中詞語a,b分別出現50,25次,向量表示為(50,25)
文本3中詞語a,b分別出現10,0次,向量表示為(10,0)
文本4中詞語a,b分別出現2,0次,向量表示為(2,0)
可以得知,1,2點向量平行(詞頻比例相同),
3,4點向量平行,那么是不是可以判斷1,2文本更相似,3,4文本更相似呢?


截屏2020-09-10 下午1.36.26.png

截屏2020-09-10 下午3.26.11.png

余弦相似度PearsonCorrelationSimilarityUncenteredCosineSimilarity
范圍:[-1,1],值越大,說明夾角越大,兩點相距就越遠,相似度就越小。

距離與余弦相似度區別:余弦相似度衡量的是維度間取值方向的一致性,注重維度之間的差異,不注重數值上的差異,而歐氏度量的正是數值上的差異性。
案例分析:如某T恤從100塊降到了50塊(A(100,50)),某西裝從1000塊降到了500塊(B(1000,500)),那么T恤和西裝都是降價了50%,兩者的價格變動趨勢一致,可以用余弦相似度衡量,即兩者有很高的變化趨勢相似度,但是從商品價格本身的角度來說,兩者相差了好幾百塊的差距,歐氏距離較大,即兩者有較低的價格相似度。


截屏2020-09-10 下午4.05.39.png

Pearson相關系數
是用來衡量兩個數據集合是否在一條線上面,它用來衡量定距變量間的線性關系。
這個相對于歐幾里德距離要復雜一點。它的一個好處是,當兩者對一件物品的評分差距較大時,并不一定兩者不想近,如果他兩對于其他的物品評價也有差距,但是都是正相關,那兩者的相似度還是相近的。這個比歐幾里德距離準確。
場景:適合于特征數據量較大的情況(效果較好)
適用于A的評價普遍高于B的評價

截屏2020-09-10 下午3.19.35.png

它是存在一條擬合線的,這條線盡量靠近所有點,結果也是求所有點和這條線的擬合程度。皮爾遜相關度評價算法首先會找出兩位評論者都曾評論過的物品,然后計算兩者的評分總和與平方和,并求得評分的乘積之和。最后,算法利用這些計算結果計算出皮爾遜相關度。
截屏2020-09-10 下午3.03.21.png

公式定義為: 兩個連續變量(X,Y)的pearson相關性系數(Px,y)等于它們之間的協方差cov(X,Y)除以它們各自標準差的乘積(σX,σY)。系數的取值總是在-1.0到1.0之間,接近0的變量被成為無相關性,接近1或者-1被稱為具有強相關性。
皮爾森相關度 PearsonCorrelationSimilarity
范圍:[-1,1],絕對值越大,說明相關性越強,負相關對于推薦的意義小。

Tanimoto 固本系數
這是一個計算交集和并集的比率的方法
度量兩個集合之間的相似程度的方法。
應用場景:比較文本相似度,用于文本查重與去重;計算對象間距離,用于數據聚類等
A=[1,2,3,4] 列表長度:4
B=[1,2,7] 列表長度:3
C = A & B = [1,2] 列表長度:2
T = Nc / ( Na + Nb -Nc) = len(c) / ( len(a) + len(b) - len(c)) = 2 / (4+3-2) = 0.4
可以用戶計算用戶之間的相似程度,這種方法適用于:數據表示為0、1這種二值化,而非有數量大小的情況


截屏2020-09-10 下午3.27.08.png

對數似然相似度:LogLikelihoodSimilarity
原理:重疊的個數,不重疊的個數,都沒有的個數
說明:處理無打分的偏好數據,比Tanimoto系數的計算方法更為智能。
對于事件A和事件B,我們考慮兩個事件發生的次數,具有如下矩陣


截屏2020-09-10 下午4.10.46.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374