ALS推薦系統實戰

2021-08-03 09:21:46 字數 1925 閱讀 5099

拿到某超市的銷售資料,將資料整理後得到一年三千萬條交易記錄,想試試用spark中的推薦系統做一下**

先把資料匯入到hdfs中,資料需要使用者id,商品id,和購買次數,這裡我拿購買次數當作電影推薦系統中的電影評分

hdfs中的資料用":"分割開。如下:

461365:22535:1.0

461365:5059:1.0

461365:5420:4.0

461366:1987:4.0

461366:31911:1.0

進入spark-shell

引入需要的mllib包和日誌的設定

import org.apache.spark.mllib.recommendation.

import org.apache.spark.sql.hive.hivecontext

import org.apache.log4j.

import org.apache.spark.mllib.evaluation.

logger.getlogger("org.apache.spark").setlevel(level.warn)

logger.getlogger("org.eclipse.jetty.server").setlevel(level.off)

將資料匯入,並劃分好存入ratings,這裡的rating其實就是購買次數

val data = sc.textfile("/input/rate")

val ratings = data.map(_.split(':') match )

檢視資料規模

scala> val users = ratings.map(_.user).distinct()

scala> val products = ratings.map(_.product).distinct()

scala> println("got "+ratings.count()+" ratings from "+users.count+" users on "+products.count+" products.")

got 30299054 ratings from 354172 users on 45786 products.

將資料劃分,我這裡用的8:2,

val splits = ratings.randomsplit(array(0.8, 0.2))

val training = splits(0)

val test = splits(1)

進行訓練,並設定引數

rank: 對應als模型中的因子個數,即矩陣分解出的兩個矩陣的新的行/列數

numiterations:模型迭代最大次數

引數0.01: 控制模型的正則化過程,從而控制模型的過擬合情況。

val rank = 30

val numiterations = 12

val model = als.train(training, rank, numiterations, 0.01)

然後將訓練結果得到的**分和原始分合併在一起,算出rmse

val testusersproducts = test.map 

val predictions = model.predict(testusersproducts).map

val ratesandpreds = ratings.map .join(predictions)

val rmse= math.sqrt(ratesandpreds.map .mean())

推薦系統ALS矩陣分解

思想類似線性回歸做 大致如下 定義乙個 模型 數學公式 然後確定乙個損失函式,將已有資料作為訓練集,不斷迭代來最小化損失函式的值,最終確定引數,把引數套到 模型中做 矩陣分解的 模型是 損失函式是 我們就是要最小化損失函式,從而求得引數q和p。矩陣分解模型的物理意義 我們希望學習到乙個p代表user...

推薦系統之ALS演算法詳解

als演算法是2008年以來,用的比較多的協同過濾演算法。它已經整合到spark的mllib庫中,使用起來比較方便。從協同過濾的分類來說,als演算法屬於user item cf,也叫做混合cf。它同時考慮了user和item兩個方面。使用者和商品的關係,可以抽象為如下的三元組 其中,rating是...

推薦系統實戰

其中,r u 表示對使用者推薦的n個物品,t u 表示使用者u在測試集上喜歡的物品集合。jaccard公式 其中,n u 表示使用者u有過正反饋的物品集合。余弦相似度公式 其中,s u,k 表示和使用者u興趣最接近的k個使用者集合 n i 表示對物品i有過正反饋的使用者集合 w u,v 表示使用者u...