思想類似線性回歸做**,大致如下
定義乙個**模型(數學公式),
然後確定乙個損失函式,
將已有資料作為訓練集,
不斷迭代來最小化損失函式的值,
最終確定引數,把引數套到**模型中做**。
矩陣分解的**模型是:
損失函式是:
我們就是要最小化損失函式,從而求得引數q和p。
矩陣分解模型的物理意義
我們希望學習到乙個p代表user的特徵,q代表item的特徵。特徵的每乙個維度代表乙個隱性因子,比如對電影來說,這些隱性因子可能是導演,演員等。當然,這些隱性因子是機器學習到的,具體是什麼含義我們不確定。
學習到p和q之後,我們就可以直接p乘以q就可以**所有user對item的評分了。
講完矩陣分解推薦模型,下面到als了(全稱alternatingleast squares
)。其實als就是上面損失函式最小化的乙個求解方法,當然還有其他方法比如sgd等。
als**中的損失函式是(跟上面那個稍微有點不同)
每次迭代,
固定m,逐個更新每個user的特徵u(對u求偏導,令偏導為0求解)。
固定u,逐個更新每個item的特徵m(對m求偏導,令偏導為0求解)。
**中是這樣推導的
這是每次迭代求u的公式。求m的類似。
為了更清晰的理解,這裡結合spark的als**講解。
spark原始碼中實現als有三個版本,乙個是localals.scala(沒有用spark),乙個是sparkals.scala(用了spark做並行優化),乙個是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
//更新第j個user的特徵向量
def updateuser(j: int, u: realvector, ms: array[realvector], r: realmatrix) : realvector =
// add regularization coefficients to diagonal terms
for (d
// solve it with cholesky 其實是解乙個a*x=b的方程
new choleskydecomposition(xtx).getsolver.solve(xty)
}
再結合**中的公式
其實**中的xtx就是公式中左邊紅圈的部分,xty就是右邊紅圈的部分。
同理,更新每個電影的特徵m類似,這裡不再重複。
sparkals.scala
for (iter
sparkals版本相對於localals的亮點時,做了並行優化。localals中,每個user的特徵是序列更新的。而sparkals中,是並行更新的。 ALS推薦系統實戰
拿到某超市的銷售資料,將資料整理後得到一年三千萬條交易記錄,想試試用spark中的推薦系統做一下 先把資料匯入到hdfs中,資料需要使用者id,商品id,和購買次數,這裡我拿購買次數當作電影推薦系統中的電影評分 hdfs中的資料用 分割開。如下 461365 22535 1.0 461365 505...
pyspark實現ALS矩陣分解演算法
準備工作 推薦演算法例項 開啟jupyter notebook,新建乙個python3 notebook import os import sys 動態載入pyspark目錄 spark home os.environ.get spark home sys.path.insert 0,os.path...
推薦系統例項 基於矩陣分解
使用matlab嘗試了隨機梯度下降的矩陣分解方法,實現了乙個比較簡單的推薦系統的原理。常用推薦系統的方法有協同過濾,基於物品內容過濾等等。這次是用的矩陣分解模型屬於協同過濾的一種方法,大致原理是通過一定數量的因子來描述各個使用者的喜好和各個物品的屬性。通過隨機梯度下降法分解後得到兩個矩陣,乙個是使用...