協同過濾簡單來說就是利用某個興趣相投、擁有共同經驗之群體的喜好來為使使用者推薦其感興趣的資訊,個人通過合作的機制給予諮詢相當程度的回應並記錄下來達到過濾的目的,進而幫助別人篩選。
import org.apache.spark.ml.pipeline
import org.apache.spark.ml.evaluation.regressionevaluator
import org.apache.spark.ml.recommendation.
import org.apache.spark.sql.
//這個類必須定義在單例物件外面,否則就會報錯
case class rating2(userid:int,movieid:int,rating: float,timestamp:long)
object alsdemo
// 讀取並快取資料
val ratings = spark.read.textfile("d:\\hadoop\\spark\\ml-100k\\u.data").map(parserating)
.todf("userid","movieid","rating","timestamp").cache()
ratings.show(5)
ratings.describe("userid","movieid","rating").show()
// 訓練資料
val array(training,test) = ratings.randomsplit(array(0.8,0.2),seed=1234)
// als的引數:numblocks:用於並行化計算的分塊個數,rank是模型中隱語因子的個數,maxiter:迭代次數(當機器計算能力不夠建議設小不然出錯),regparam:正則化引數
// implicitprefs:該引數適用顯性反饋,還是適用隱性反饋,預設false即顯性反饋
// alpha改引數決定偏好行為強度的基準
// nonnegative對最小二乘法適用非負的限制
// val als = new als().setmaxiter(5)
.setrank(10)
.setregparam(0.01)
.setnonnegative(true)
.setusercol("userid")
.setitemcol("movieid")
.setratingcol("rating")
// 建立流水線,把資料組裝,模型訓練等任務組裝在一條流水線上。
val pipeline = new pipeline().setstages(array(als))
// 訓練模型
val model = pipeline.fit(training)
// 做出**
val predictions = model.transform(test)
// 檢視**值與原來的值
predictions.show(5)
// 評估模型
// **時會產生nan,nan表示不推薦,2.1版本前有,2.2版本後修復
predictions.filter(predictions("prediction").isnan).select("userid","movieid","rating","prediction").count()
// 刪除含nan的行,nan有一定合理性,不推薦,但為評估指標,可以先過濾這些數
val predictions1 = predictions.na.drop()
val evaluator = new regressionevaluator().setmetricname("rmse").setlabelcol("rating").setpredictioncol("prediction")
val rmse = evaluator.evaluate(predictions1)
println(rmse)
// 模型優化
// 將樣本評分表分成三個部分,分別用於訓練,校驗,測試
val splits = ratings.randomsplit(array(0.6,0.2,0.2),12)
// 把訓練樣本快取起來
val training2 = splits(0).cache()
val validation2 = splits(1).todf().cache()
val test2 = splits(2).todf().cache()
// 計算各集合總數
val numtraining = training.count()
val numvalidation = validation2.count()
val numtest = test2.count()
// 訓練不同引數下的模型,並在校驗集中驗證,獲取最佳引數的模型
val ranks = list(10,20)
val lambdas = list(0.01,0.1)
val numiters = list(2,4)
var bestmodel:option[alsmodel] = none
var bestvalidationrmse = double.maxvalue
var bestrank = 0
var bestlambda = 1.0
var bestnumiter = 1
def computermse(model:alsmodel,data:dataframe,n:long):double = .join(predictions.rdd.map).values
math.sqrt(p1.map(x=>(x._1.tostring.todouble-x._2.tostring.todouble)*(x._1.tostring.todouble-x._2.tostring.todouble)).reduce(_+_)/n)
}for (rank<-ranks; lambda<-lambdas; numiter<-numiters)
}}}
Spark機器學習
spark機器學習 注 spark簡介 spark是乙個分布式計算框架,旨在簡化執行於計算集群上的並行程式的編寫。該框架對資源排程,任務的提交 執行和跟蹤,節點間的通訊以及資料並行處理的內在底層操作都進行了抽象。它提供了乙個更高階別的api用於處理分布式資料。spark支援的四種執行模式 本地單機模...
django部署機器學習模型 搭建新聞推薦系統
關鍵操作 一 演算法中引入使用者偏好的時間指數修正模型 以 為例 在實際生活中,人們的興趣與行為偏好並不是一成不變的,而是隨著時間與環境的變化而發生相應地改變,以 推薦為例,假設使用者a在2018年之前更偏好爵士樂,收聽 渠道主要來自本地 庫,而從2018年開始,該使用者收聽搖滾 的資料在不斷增多,...
Spark推薦系統中使用者 物品模型
如 假設使用者和物品數目分別是u和i,那對應的使用者 物品矩陣的維度為u i。要找到 使用者 物品 矩陣近似的k維 低階 矩陣,最終是求出如下2個矩陣 表示使用者的u k 表示物品的k i維矩陣。這兩個矩陣也稱為因子矩陣。因子分解型別也存在某些弱點。相比最鄰近模型,這類模型在理解和可解釋性難度上都有...