協同過濾與推薦
協同過濾是一種根據用戶對各種產品的交互與評分來推薦新產品的推薦系統技術。
協同過濾引入的地方就在於它只需要輸入一系列用戶/產品的交互記錄;
無論是顯式的交互(例如在購物網站上進行評分)還是隱式的(例如用戶訪問了一個
產品的頁面但是沒有對產品評分)交互皆可。僅僅根據這些交互,協同過濾算法就能
夠知道哪些產品之間比較相似(因為相同的用戶與它們發生了交互)以及哪些用戶之間
比較相似,然后就可以做出新的推薦。
交替最小二乘法
MLlib中包含交替最小二乘法(ALS)的一個實現,這是一個協同過濾的常用算法,可以很好的
擴展到集群上。它位於mllib.recommendation.ALS類中。
ALS會為每個用戶和產品都設一個特征向量,這樣用戶向量與產品向量的點積就接近於它們的得分。
它接收下面所列幾個參數:
rank
使用的特征向量的大小,更大的特征向量會產生更好的模型,但是也需要話費更大的計算代價,默認10
iterations
要執行的迭代次數,默認10
lamda
正則化參數,默認0.01
alpha
用來在ALS中計算置信度的常量,默認1.0
numUserBlocks, numProductBlocks
切分用戶和產品數據的塊的數目,用來控制並行度,可以選擇傳遞-1來上MLlib自動決定.
要使用ALS算法,需要有一個由mllib.recommendation.Rating對象組成的RDD,
其中每個包含一個用戶id,一個產品id和一個評分。
實現過程中的一個挑戰是每個id都需要是一個32位的整數值。
如果id是字符串或者更大的數字,那么可以直接在ALS中使用id的哈希值,
即使有兩個用戶或者產品映射到同一個Id上,總體結果依然會不錯。
還有一種辦法是broadcast()一張從產品id到正興致的表,來付給每個產品獨特的id。
ALS返回一個MatrixFactorizationModel對象來表示結果,
可以調用predict()來對一個由(UserId,productId)對組成的RDD進行預測評分。
也可以對使用model.recommendProducts(userId,numProducts)來為一個給定用戶找到最值得推薦的前numProduct個產品。
注意,和MLlib中的其他模型不同,MatrixFactorizationModel對象很大,為每個用戶和產品都存儲了一個向量。
這樣我們就不能把它存儲到磁盤上,然后在另一個程序中讀取回來。
不過,可以把模型中生成的特征向量RDD,也就是model.userFeatures和model.productFeatures保存到分布式文件系統上。
最后,ALS有兩個變種:顯示評分(默認情況)和隱式反饋(通過調用ALS.trainImplicit()而非ALS.train()來打開)。
用於顯式評分時,每個用戶對於一個產品的評分需要是一個得分(例如1到5星),而預測出來的評分也是得分。
而用於隱式反饋時,每個評分代表的是用戶會和給定產品發送交互的置信度(比如隨着用戶訪問一個網頁次數
的增加,評分也會提高),預測出來的也是置信度。