基於mllib的協同過濾實戰(電影推薦)

2022-08-28 17:03:31 字數 3672 閱讀 7428

//載入需要的包

import org.apache.spark.rdd._

import org.apache.spark.mllib.recommendation.

//讀取資料

//資料情況探索(評分數,使用者數,物品數)
val numratings = ratings.count()

val numusers = ratings.map(_._2.user).distinct().count()

val nummovies = ratings.map(_._2.product).distinct().count()

println("got " + numratings + " ratings from " + numusers + " users on " + nummovies + " movies.")

//某個人評分資料

//拆分訓練集,校驗集,測試集(ratings是(int,rating)格式,取values即可)

val numpartitions = 4

val training = ratings.filter(x => x._1 < 6)

.values

.union(myratingsrdd) //加入個人評分資料

.repartition(numpartitions)

.cache()

val validation = ratings.filter(x => x._1 >= 6 && x._1 < 8)

.values

.repartition(numpartitions)

.cache()

val test = ratings.filter(x => x._1 >= 8).values.cache()

val numtraining = training.count()

val numvalidation = validation.count()

val numtest = test.count()

println("training: " + numtraining + ", validation: " + numvalidation + ", test: " + numtest)

// 校驗集**資料和實際資料之間的均方根誤差

def computermse(model: matrixfactorizationmodel, data: rdd[rating], n: long): double =

//訓練不同引數下的模型,並在校驗集中驗證,獲取最佳引數下的模型

val ranks = list(8, 12)

val lambdas = list(0.1, 10.0)

val numiters = list(10, 20)

var bestmodel: option[matrixfactorizationmodel] = none

var bestvalidationrmse = double.maxvalue

var bestrank = 0

var bestlambda = -1.0

var bestnumiter = -1

for (rank

}

//用最佳模型作用於測試集,並計算**評分和實際評分之間的均方根誤差

//比較將最佳模型作用於測試集的結果:testrmse 與 僅僅用均值**的結果進行比較,計算模型提公升度。

val meanrating = training.union(validation).map(_.rating).mean

val baselinermse = math.sqrt(test.map(x => (meanrating - x.rating) * (meanrating - x.rating)).mean)

val improvement = (baselinermse - testrmse) / baselinermse * 100

println("the best model improves the baseline by " + "%1.2f".format(improvement) + "%.")

//裝載電影目錄對照表(電影id->電影標題)

// 推薦前十部最感興趣的電影,注意要剔除使用者已經評分的電影

//列印結果

協同過濾 基於使用者的協同過濾itemCF

基於使用者的協同過濾演算法也被稱為最近鄰協同過濾或knn k nearest neighbor,k最近鄰演算法 其核心思想就是,首先根據相似度計算出目標使用者的鄰居集合,然後用鄰居使用者評分的加權組合來為目標使用者作推薦。通常這些演算法都可以總結成三步 首先,使用使用者已有的評分來計算使用者之間的相...

基於使用者協同過濾與基於專案協同過濾的適用場景

一 在適合用途上的比較 基於使用者的協同過濾演算法主要有兩步 1 找到和目標使用者興趣相似的使用者集合 2 找到這個集合中的使用者喜歡的,且目標使用者沒有聽說過的物品推薦給目標使用者。基於物品的協同過濾演算法主要有兩步 1 計算物品之間的相似度。2 根據物品的相似度和使用者的歷史行為給使用者生成推薦...

基於使用者協同過濾與基於專案協同過濾的適用場景

一 在適合用途上的比較 基於使用者的協同過濾演算法主要有兩步 1 找到和目標使用者興趣相似的使用者集合 2 找到這個集合中的使用者喜歡的,且目標使用者沒有聽說過的物品推薦給目標使用者。基於物品的協同過濾演算法主要有兩步 1 計算物品之間的相似度。2 根據物品的相似度和使用者的歷史行為給使用者生成推薦...