1. 基礎回顧
矩陣的奇異值分解 SVD
(特別詳細的總結,參考 http://blog.csdn.net/wangzhiqing3/article/details/7446444)
- 矩陣與向量相乘的結果與特征值,特征向量有關。
- 數值小的特征值對矩陣-向量相乘的結果貢獻小
1)低秩近似
2)特征降維
相似度和距離度量
(參考 http://blog.sina.com.cn/s/blog_62b83291010127bf.html)
2. ALS
交替最小二乘(alternating least squares
)
在機器學習中,ALS
指使用交替最小二乘求解的一個協同推薦算法。
- 它通過觀察到的所有用戶給商品的打分,來推斷每個用戶的喜好並向用戶推薦適合的商品。
每一行代表一個用戶(u1,u2,…,u8),
每一列代表一個商品(v1,v2,…,v8),
用戶的打分為1-9
分。
這個矩陣只顯示了觀察到的打分,我們需要推測沒有觀察到的打分。
ALS
的核心就是這樣一個假設:打分矩陣是近似低秩的。
換句話說,就是一個m*n
的打分矩陣可以由分解的兩個小矩陣U(m*k)
和V(k*n)
的乘積來近似,即 A=UVT,k<=m,n 。這就是ALS
的矩陣分解方法。
這樣我們把系統的自由度從O(mn)
降到了O((m+n)k)
。
-
低維空間的選取。
這個低維空間要能夠很好的區分事物,那么就需要一個明確的可量化目標,這就是重構誤差。
在ALS
中我們使用 F范數 來量化重構誤差,就是每個元素重構誤差的平方和。這里存在一個問題,我們只觀察到部分打分,A
中的大量未知元是我們想推斷的,所以這個重構誤差是包含未知數的。
解決方案很簡單:只計算已知打分的重構誤差。
3. 協同過濾
協同過濾分析用戶以及用戶相關的產品的相關性,用以識別新的用戶-產品相關性。
協同過濾系統需要的唯一信息是用戶過去的行為信息,比如對產品的評價信息。
- 推薦系統依賴不同類型的輸入數據,最方便的是高質量的顯式反饋數據,它們包含用戶對感興趣商品明確的評價。例如,
Netflix
收集的用戶對電影評價的星星等級數據。 - 但是顯式反饋數據不一定總是找得到,因此推薦系統可以從更豐富的隱式反饋信息中推測用戶的偏好。 隱式反饋類型包括購買歷史、瀏覽歷史、搜索模式甚至鼠標動作。
4. 顯示反饋模型
通過內積 rij = uiT vj 來預測,另外加入正則化參數 lamda 來預防 過擬合。
最小化重構誤差:
5. 隱式反饋模型
最小化損失函數:
6. 求解:最優化
1)顯示和隱式的異同:
- 顯示模型只基於觀察到的值;隱式需要考慮不同的信任度,最優化時需要考慮所有可能的
u,v
對
2) 交替最小二乘求解:
即固定 ui 求 vi+1 再固定 vi+1 求 ui+1
7. 例子
import org.apache.spark.mllib.recommendation._
//處理訓練數據 val data = sc.textFile("data/mllib/als/test.data") val ratings = data.map(_.split(',') match { case Array(user, item, rate) => Rating(user.toInt, item.toInt, rate.toDouble) }) // 使用ALS訓練推薦模型 val rank = 10 val numIterations = 10 val model = ALS.train(ratings, rank, numIterations, 0.01)
ALS
算法實現於org.apache.spark.ml.recommendation.ALS.scala
文件中- Rating也在recommendation里面