Spark機器學習(11):協同過濾演算法

来源:http://www.cnblogs.com/mstk/archive/2017/07/21/7219278.html
-Advertisement-
Play Games

協同過濾(Collaborative Filtering,CF)演算法是一種常用的推薦演算法,它的思想就是找出相似的用戶或產品,向用戶推薦相似的物品,或者把物品推薦給相似的用戶。怎樣評價用戶對商品的偏好?可以有很多方法,如用戶對商品的打分、購買、頁面停留時間、保存、轉發等等。得到了用戶對商品的偏好,就可 ...


協同過濾(Collaborative Filtering,CF)演算法是一種常用的推薦演算法,它的思想就是找出相似的用戶或產品,向用戶推薦相似的物品,或者把物品推薦給相似的用戶。怎樣評價用戶對商品的偏好?可以有很多方法,如用戶對商品的打分、購買、頁面停留時間、保存、轉發等等。得到了用戶對商品的偏好,就可以給用戶推薦商品。有兩種方法:用戶A喜歡物品1,商品2和物品1很相似,於是把物品2推薦給用戶A;或者用戶A和用戶B很類似,B喜歡商品2,就將商品2推薦給用戶A。所以協同過濾分為兩類:基於用戶的協同過濾和基於物品的協同過濾

1. 相似度的計算

協同過濾演算法一個重要的問題就是相似度的計算,相似度即衡量兩個用戶,或者兩個物品之間相似的程度。計算相似度有幾種方法:同現相似度(Cooccurrence Similarity)、歐氏距離(Euclidean Distance)、皮爾遜相關係數(Pearson Correlarion Coefficient)、Cosine相似度(Cosine Similarity)、Tanimoto繫數(Tanimoto Coefficient)等。

1.1 同現相似度(Cooccurrence Similarity)

同現,即同時出現的意思,物品i和物品j的同現相似度的計算公式是:

N(i)是喜歡物品i的用戶集合,N(j)是喜歡物品j的用戶集合,可以理解為喜歡物品i的用戶中有多少喜歡物品j。但是這樣存在一個問題,如果物品j是熱門物品,喜歡它的用戶肯定很多,這樣不論i是什麼物品,wij的值就會很大。為了避免這個問題的出現,對公式進行了改進:

這樣如果j是熱門物品,分母會很大,從而懲罰了wij的值。

1.2 歐氏距離(Euclidean Distance)

n維空間中兩個點x和y的距離:

當n=2時,是平面上兩點之間的距離,當n=3時,是立體空間上兩點之間的距離。相似度計算公式:

即距離越大,相似度越低;距離越小,相似度越高。當計算兩個物品的相似度時,坐標軸是不同的用戶,如果所有用戶對這兩個物品的偏好都差不多,那麼這兩個物品之間的距離就近,相似度就低,說明這兩個物品很相似;反之,則說明這兩個物品相似度低。

2. 推薦計算

推薦計算分為兩類:基於用戶的協同過濾和基於物品的協同過濾。

2.1 基於用戶的協同過濾(User CF)

基於用戶的協同過濾的基本思想是,對於每一個個用戶,根據他對所有物品的偏好,計算他與所有其他用戶的相似度(可以使用同現相似度或歐式距離),得到一個用戶相似度矩陣Um×m。用戶對物品的偏好評分矩陣Pm×n,U×P得到一個m×n矩陣,即對每個用戶,每個物品的偏好,過濾掉已經存在的用戶對商品的偏好,剩下的數據降序排序,即得到了一個推薦列表。

2.2 基於物品的協同過濾(Item CF)

基於物品的協同過濾的基本思想是,對於每一個個物品,根據所有用戶對它的偏好,計算它與所有其他物品的相似度(可以使用同現相似度或歐式距離),得到一個物品相似度矩陣In×n。P×I得到一個m×n矩陣,即對每個用戶,每個物品的偏好,過濾掉已經存在的用戶對商品的偏好,剩下的數據降序排序,即得到了一個推薦列表。

3. 協同過濾演算法的實現

MLlib並沒有實現協同過濾演算法,可以自己實現。

程式代碼

/**
  * Created by Administrator on 2017/7/21.
  */

import org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }

object ALSTest02 {

  def main(args:Array[String]) = {

    // 設置運行環境
    val conf = new SparkConf().setAppName("Decision Tree")
      .setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\MachineLearning\\MachineLearning.jar"))
    val sc = new SparkContext(conf)
    Logger.getRootLogger.setLevel(Level.WARN)

    // 讀取樣本數據並解析
    val dataRDD = sc.textFile("hdfs://master:9000/ml/data/sample_itemcf3.txt")
    val userDataRDD = dataRDD.map(_.split(",")).map(f => (ItemPref(f(0), f(1), f(2).toDouble))).cache()

    // 建立模型
    val simModel = new ItemSimilarity()
    val itemRDD = simModel.Similarity(userDataRDD, "cooccurrence")
    val recomm = new RecommendedItem
    val recommRDD = recomm.Recommend(itemRDD, userDataRDD, 30)

    // 輸出結果
    println("物品相似度矩陣:")
    itemRDD.sortBy(f => (f.itemid1, f.itemid2)).collect.foreach { simItem =>
      println(simItem.itemid1 + ", " + simItem.itemid2 + ", " + simItem.similar)
    }
    println("用戶推薦列表:")
    recommRDD.sortBy(f => (f.pref)).collect.foreach { UserRecomm =>
      println(UserRecomm.userid + ", " + UserRecomm.itemid + ", " + UserRecomm.pref)
    }
  }

}

運行結果:

物品相似度矩陣:
1, 2, 0.6666666666666666
1, 3, 0.6666666666666666
1, 5, 0.4082482904638631
1, 6, 0.3333333333333333
2, 1, 0.6666666666666666
2, 3, 0.3333333333333333
2, 4, 0.3333333333333333
2, 6, 0.6666666666666666
3, 1, 0.6666666666666666
3, 2, 0.3333333333333333
3, 4, 0.3333333333333333
3, 5, 0.4082482904638631
4, 2, 0.3333333333333333
4, 3, 0.3333333333333333
4, 5, 0.4082482904638631
4, 6, 0.6666666666666666
5, 1, 0.4082482904638631
5, 3, 0.4082482904638631
5, 4, 0.4082482904638631
5, 6, 0.4082482904638631
6, 1, 0.3333333333333333
6, 2, 0.6666666666666666
6, 4, 0.6666666666666666
6, 5, 0.4082482904638631
用戶推薦列表:
3, 1, 1.3333333333333333
6, 3, 1.8164965809277263
2, 4, 2.7079081189859817
1, 3, 3.0
5, 4, 3.666666666666666
3, 2, 3.6666666666666665
5, 5, 3.6742346141747673
6, 1, 3.8164965809277263
1, 5, 4.08248290463863
4, 5, 4.4907311951024935
3, 5, 4.4907311951024935
4, 3, 5.0
2, 6, 5.041241452319316
1, 4, 5.666666666666666
4, 1, 5.666666666666666
3, 6, 6.0
5, 6, 6.333333333333332
2, 2, 6.666666666666667
6, 2, 7.0

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 剛剛學習了資料庫,並且安裝了MySQL,正當高興之餘,發現我的MySQL出現了閃退的顯現。上網搜了好久的解決方案。最後解決了這個問題,也舒心了。 問題從這裡開始: 接著我打開MySQL,尋思能不能用,結果閃退了。 接著我去服務端,檢查它有沒有開啟,試著開啟,發現也不行。 網上有結果說要刪除Windo ...
  • indexedDB資料庫的基本概念:在HTML5中,新增一種被稱為“indexedDB”的資料庫,該資料庫是一種存儲在客戶端本地的NoSQL資料庫。 顯示效果: ...
  • 一、資料庫的基本概念 資料庫: 以一定方式儲存在一起、能為多個用戶共用、具有儘可能小的冗餘度的特點、是與應用程式彼此獨立的數據集合。 DBMS(DataBase Management System,資料庫管理系統)和資料庫。平時談到“資料庫”可能有兩種含義:MSSQLServer、Oracle等某種 ...
  • 高飛狗這幾天特別鬱悶,不知該如何通過TCP/IP協議連接SQL Server資料庫。好在功夫不負有心人,經過幾天的刻苦研究,終於得到了答案。 高飛狗呼叫UDP1434埠,"叮鈴鈴,叮鈴鈴…" UDP1434埠:您好,我是SQL Server Browser,我的名字是黛絲,請問有什麼可以幫您的嗎 ...
  • 1. hbase簡介 1.1. 什麼是hbase HBASE是一個高可靠性、高性能、面向列、可伸縮的分散式存儲系統,利用HBASE技術可在廉價PC Server上搭建起大規模結構化存儲集群。 HBASE的目標是存儲並處理大型的數據,更具體來說是僅需使用普通的硬體配置,就能夠處理由成千上萬的行和列所組 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/7218316.html (保留出處並非什麼原創作品權利,本人拙作還遠遠達不到,僅僅是為了鏈接到原文,因為後續對可能存在的一些錯誤進行修正或補充,無他) 資料庫中的事物是具有原子性(Atomicity),一致性(Consiste ...
  • 在一個完整的大數據處理系統中,除了hdfs+mapreduce+hive組成分析系統的核心之外,還需要數據採集、結果數據導出、任務調度等不可或缺的輔助系統,而這些輔助工具在hadoop生態體系中都有便捷的開源框架。 1 日誌採集框架Flume Flume是一個分散式、可靠、和高可用的海量日誌採集、聚 ...
  • Hive Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供類SQL查詢功能。 1.1為什麼使用Hive 為什麼要使用Hive 操作介面採用類SQL語法,提供快速開發的能力。 避免了去寫MapReduce,減少開發人員的學習成本。擴展功能很方便。 1.2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...