多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 服務器 > ALS矩陣分解推薦模型

ALS矩陣分解推薦模型

來源:程序員人生   發布時間:2015-03-25 11:45:25 閱讀次數:9468次
ALS矩陣分解推薦模型

其實通過模型來預測1個user對1個item的評分,思想類似線性回歸做預測,大致以下

定義1個預測模型(數學公式),

然后肯定1個損失函數,

將已有數據作為訓練集,

不斷迭代來最小化損失函數的值,

終究肯定參數,把參數套到預測模型中做預測。

 

矩陣分解的預測模型是:


損失函數是:


我們就是要最小化損失函數,從而求得參數q和p。

 

矩陣分解模型的物理意義


我們希望學習到1個P代表user的特點,Q代表item的特點。特點的每個維度代表1個隱性因子,比如對電影來講,這些隱性因子多是導演,演員等。固然,這些隱性因子是機器學習到的,具體是甚么含義我們不肯定。

學習到P和Q以后,我們就能夠直接P乘以Q就能夠預測所有user對item的評分了。



講完矩陣分解推薦模型,下面到als了(全稱Alternatingleast squares)。其實als就是上面損失函數最小化的1個求解方法,固然還有其他方法比如SGD等。

als論文中的損失函數是(跟上面那個略微有點不同)


每次迭代,

         固定M,逐一更新每一個user的特點u(對u求偏導,令偏導為0求解)。

         固定U,逐一更新每一個item的特點m(對m求偏導,令偏導為0求解)。

論文中是這樣推導的


這是每次迭代求u的公式。求m的類似。

 

為了更清晰的理解,這里結合spark的als代碼講授。

spark源碼中實現als有3個版本,1個是LocalALS.scala(沒有用spark),1個是SparkALS.scala(用了spark做并行優化),1個是mllib中的ALS。

 

本來LocalALS.scala和SparkALS.scala這個兩個實現是官方為了開發者學習使用spark展現的,

mllib中的ALS可以用于實際的推薦。

但是mllib中的ALS做了很多優化,不合適初學者研究來理解als算法。

因此,下面我拿LocalALS.scala和SparkALS.scala來說解als算法。

 

LocalALS.scala

// Iteratively update movies then users for (iter <- 1 to ITERATIONS) { println(s"Iteration $iter:") ms = (0 until M).map(i => updateMovie(i, ms(i), us, R)).toArray //固定用戶,逐一更新所有電影的特點 us = (0 until U).map(j => updateUser(j, us(j), ms, R)).toArray //固定電影,逐一更新所有用戶的特點 println("RMSE = " + rmse(R, ms, us)) println() }

//更新第j個user的特點向量 def updateUser(j: Int, u: RealVector, ms: Array[RealVector], R: RealMatrix) : RealVector = { var XtX: RealMatrix = new Array2DRowRealMatrix(F, F) //F是隱性因子的數量 var Xty: RealVector = new ArrayRealVector(F) // For each movie that the user rated 遍歷該user評分過的movie.明顯,這里默許該用戶評分過所有電影,所以是0-M.實際利用求解,只需要遍歷該用戶評分過的電影. for (i <- 0 until M) { val m = ms(i) // Add m * m^t to XtX 外積后 累加到XtX XtX = XtX.add(m.outerProduct(m)) //向量與向量的外積:1個當作列向量,1個當作行向量,做矩陣乘法,結果是1個矩陣 // Add m * rating to Xty Xty = Xty.add(m.mapMultiply(R.getEntry(i, j))) } // Add regularization coefficients to diagonal terms for (d <- 0 until F) { XtX.addToEntry(d, d, LAMBDA * M) } // Solve it with Cholesky 實際上是解1個A*x=b的方程 new CholeskyDecomposition(XtX).getSolver.solve(Xty) }

再結合論文中的公式


其實代碼中的XtX就是公式中左側紅圈的部份,Xty就是右側紅圈的部份。

同理,更新每一個電影的特點m類似,這里不再重復。

SparkALS.scala

for (iter <- 1 to ITERATIONS) { println(s"Iteration $iter:") ms = sc.parallelize(0 until M, slices) .map(i => update(i, msb.value(i), usb.value, Rc.value)) .collect() msb = sc.broadcast(ms) // Re-broadcast ms because it was updated us = sc.parallelize(0 until U, slices) .map(i => update(i, usb.value(i), msb.value, Rc.value.transpose())) .collect() usb = sc.broadcast(us) // Re-broadcast us because it was updated println("RMSE = " + rmse(R, ms, us)) println() }

SparkALS版本相對LocalALS的亮點時,做了并行優化。LocalALS中,每一個user的特點是串行更新的。而SparkALS中,是并行更新的。

 

 

參考資料:

《Large-scale Parallel Collaborative Filtering for the Netflix Prize》(als-wr原論文)

《Matrix Factorization Techniques for Recommender Systems》(矩陣分解模型的好材料)

https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/LocalALS.scala

https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/SparkALS.scala




本文作者:linger

本文鏈接:http://blog.csdn.net/lingerlanlan/article/details/44085913



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产成人性色视频 | 国产免费福利片 | 亚洲综合欧美日韩 | 欧美日韩在线视频播放 | 手机在线成人精品视频网 | 成人动漫中文字幕 | 国产精品视频自拍 | 九色最新| 德国free 性video | 亚洲一区在线视频 | 欧美成人h版整片合集 | 欧美精品99久久久久久人 | 一区二区在线精品免费视频 | 中文字幕一区在线观看视频 | 中日韩欧美一级毛片 | 国产老妇一性一交一乱 | 日本在线不卡免费视频一区 | 美国毛片免费观看 | 亚洲精品www久久久久久久软件 | 精品一区二区三 | 亚洲一区二区三区夜色 | 亚洲高清成人 | 国产女人18毛片水真多18精品 | 亚洲精品不卡午夜精品 | 欧美整片完整片视频在线 | 午夜欧美成人久久久久久 | 老司机免费福利视频无毒午夜 | 国产精品福利影院 | 岛国在线最新 | 国产99视频精品免视看7 | 真人性做爰aa毛片免费视频观看 | 欧美视频福利 | 国产性色视频在线高清 | 亚洲小视频在线观看 | 日韩a级毛片免费视频 | 欧美一级毛片欧美一级成人毛片 | 久久大 | 一本毛片 | 欧洲自拍 | 久久国产免费一区 | 人人澡人人爱 |