1. 程式人生 > >spark mllib中ALS演算法思想

spark mllib中ALS演算法思想

對於一個users-products-rating的評分資料集,ALS會建立一個user*product的m*n的矩陣
其中,m為users的數量,n為products的數量
但是在這個資料集中,並不是每個使用者都對每個產品進行過評分,所以這個矩陣往往是稀疏的,使用者i對產品j的評分往往是空的
ALS所做的事情就是將這個稀疏矩陣通過一定的規律填滿,這樣就可以從矩陣中得到任意一個user對任意一個product的評分,ALS填充的評分項也稱為使用者i對產品j的預測得分
所以說,ALS演算法的核心就是通過什麼樣子的規律來填滿(預測)這個稀疏矩陣
它是這麼做的:
假設m*n的評分矩陣R,可以被近似分解成U*(V)T

U為m*d的使用者特徵向量矩陣
V為n*d的產品特徵向量矩陣((V)T代表V的轉置,原諒我不會打轉置這個符號。。)
d為user/product的特徵值的數量

關於d這個值的理解,大概可以是這樣的
對於每個產品,可以從d個角度進行評價,以電影為例,可以從主演,導演,特效,劇情4個角度來評價一部電影,那麼d就等於4
可以認為,每部電影在這4個角度上都有一個固定的基準評分值
例如《末日崩塌》這部電影是一個產品,它的特徵向量是由d個特徵值組成的
d=4,有4個特徵值,分別是主演,導演,特效,劇情
每個特徵值的基準評分值分別為(滿分為1.0):
主演:0.9(大光頭還是那麼霸氣)
導演:0.7
特效:0.8
劇情:0.6
矩陣V由n個product*d個特徵值組成

對於矩陣U,假設對於任意的使用者A,該使用者對一部電影的綜合評分和電影的特徵值存在一定的線性關係,即電影的綜合評分=(a1*d1+a2*d2+a3*d3+a4*d4)
其中a1-4為使用者A的特徵值,d1-4為之前所說的電影的特徵值
參考:
協同過濾中的矩陣分解演算法研究

那麼對於之前ALS演算法的這個假設
m*n的評分矩陣R,可以被近似分解成U*(V)T
就是成立的,某個使用者對某個產品的評分可以通過矩陣U某行和矩陣V(轉置)的某列相乘得到

那麼現在的問題是,如何確定使用者和產品的特徵值?(之前僅僅是舉例子,實際中這兩個都是未知的變數)
採用的是交替的最小二乘法


在上面的公式中,a表示評分資料集中使用者i對產品j的真實評分,另外一部分表示使用者i的特徵向量(轉置)*產品j的特徵向量(這裡可以得到預測的i對j的評分)

用真實評分減去預測評分然後求平方,對下一個使用者,下一個產品進行相同的計算,將所有結果累加起來(其中,資料集構成的矩陣是存在大量的空打分,並沒有實際的評分,解決的方法是就只看對已知打分的項)
參考:
ALS 在 Spark MLlib 中的實現
但是這裡之前問題還是存在,就是使用者和產品的特徵向量都是未知的,這個式子存在兩個未知變數

解決的辦法是交替的最小二乘法
首先對於上面的公式,以下面的形式顯示:

為了防止過度擬合,加上正則化引數



首先用一個小於1的隨機數初始化V
根據公式(4)求U
此時就可以得到初始的UV矩陣了,計算上面說過的差平方和
根據計算得到的U和公式(5),重新計算並覆蓋V,計算差平方和
反覆進行以上兩步的計算,直到差平方和小於一個預設的數,或者迭代次數滿足要求則停止
取得最新的UV矩陣
則原本的稀疏矩陣R就可以用R=U(V)T來表示了
以上公式內容截圖來自:
基於矩陣分解的協同過濾演算法

總結一下:
ALS演算法的核心就是將稀疏評分矩陣分解為使用者特徵向量矩陣和產品特徵向量矩陣的乘積
交替使用最小二乘法逐步計算使用者/產品特徵向量,使得差平方和最小
通過使用者/產品特徵向量的矩陣來預測某個使用者對某個產品的評分