1. 程式人生 > >Spark MLlib 1.6 -- 協同過濾

Spark MLlib 1.6 -- 協同過濾

4.1  協同過濾演算法

協同過濾演算法主要用於推薦系統中,推薦系統用於給使用者和物品之間建立實體關係。Spark.mllib暫支援基於協同過濾,在這個模型中,使用者和物品這間用關聯因子確定兩者之間的關聯關係。Spark.mllib 使用交替最小二乘法(ALS演算法學習使用者和物品之間關聯因子。Spark.mllib 協同過濾演算法中需要以下引數:

1) numBlocks 平行計算的資料塊(-1 是自動配置)

2) rank 模型中關聯矩陣的秩

3) iterations 迭代次數

4) lambda ALS 中正規化引數

5) implicitPrefs設定是使用顯式ALS回饋或隱式ALS

回饋

6) alpha 當使用隱式ALS回饋時,式引數確定預設觀察樣本的基線置信度。

4.1.1 顯式或隱式回饋

標準的基於矩陣分解的協同過濾演算法,使用者和物品矩陣中每個元素代表使用者對某個物品的偏好度。

在實際生活的例子中,更多的是隱式回饋(例如,看頁面,點選連結,購買商品,喜歡商品,分享文章等)。針對此場景,spark.mllib 中專門描述如何處理協同過濾演算法中隱式回饋的資料集()。實質上,顯式回饋使用使用者對商品的打分值,而在隱式回饋中,直接可以看成兩項偏好(譯者注:如喜歡或不喜歡,需要或不需要)和置信度(譯者注:如喜歡的可信度有多大,或不喜歡的置信度)。這樣,在顯式中的使用者對物品的打分值,在隱式中變成了通過觀察使用者偏好而得出的置信水平(

the level of confidence)。模型通過這些因子來預測使用者對每個物品可能的偏好。

4.1.2 放縮正規化引數

1.1開始,我們引入正規化引數的放縮因子lambda , 對使用者偏好物品程度(因子)給出使用者一個級別權重,或對物品吸引使用者的程度(因子)給物品一個級別權重,以解決此類最小二乘問題。這就是”ALS-WR” 演算法,詳見大規模並行協同過濾考慮到此引數並不依賴於資料集,因此可以對樣本集使用最優的引數,並應用於全量資料集。

1.2   例子

下面的例子載入評分資料集,每行是使用者對物品的打分值。對顯式回饋使用預設ALS.train() 方法。使用最小均方差來評估推薦模型匹配度。

importorg.apache.spark.mllib.recommendation.ALS

importorg.apache.spark.mllib.recommendation.MatrixFactorizationModel

importorg.apache.spark.mllib.recommendation.Rating

// Load andparse the data

val data = sc.textFile("data/mllib/als/test.data")

val ratings = data.map(_.split(',')match{caseArray(user, item, rate)=>

Rating(user.toInt, item.toInt, rate.toDouble)

})

// Build therecommendation model using ALS

val rank =10

val numIterations =10

val model =ALS.train(ratings, rank, numIterations,0.01)

// Evaluate themodel on rating data

val usersProducts = ratings.map {caseRating(user, product, rate)=>

(user, product)

}

val predictions =

  model.predict(usersProducts).map {caseRating(user, product, rate)=>

((user, product), rate)

}

val ratesAndPreds = ratings.map {caseRating(user, product, rate)=>

((user, product), rate)

}.join(predictions)

valMSE= ratesAndPreds.map {case((user, product),(r1, r2))=>

val err =(r1 - r2)

  err* err

}.mean()

println("MeanSquared Error = "+MSE)

// Save and loadmodel

model.save(sc,"target/tmp/myCollaborativeFilter")

val sameModel =MatrixFactorizationModel.load(sc,"target/tmp/myCollaborativeFilter")

詳細的例子見:"examples/src/main/scala/org/apache/spark/examples/mllib/RecommendationExample.scala"

如果訓練資料是從其它資訊系統而來(如從其它訊號系統),可以使用trainImplicit 方式得到隱式回饋的結果。

val alpha =0.01

val lambda =0.01

val model =ALS.trainImplicit(ratings, rank, numIterations, lambda, alpha)

1.2.1      教程

Spark summit2014 中包含手把手的訓練練習:使用spark.mllib來對使用者進行電影推薦:

https://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html