SVD在推薦系統中的應用

<center>SVD在推薦系統中的應用</center>

摘要

隨著網絡信息爆炸性增長,用戶很難在海量的信息中找到自己需要的產品;商家也難以通過人工的方式向用戶推薦其喜愛的產品,錯失商機。基于SVD的協同過濾算法能夠通過分析用戶——產品的評分矩陣,來對空白評分進行預測,根據預測結果來對用戶進行產品推薦。但是傳統的SVD方法不支持對稀疏矩陣進行分解,因此需要對稀疏評分矩陣進行填充。利用總體平均值進行填充,效率太低,很難應用于實際生產,通過Funk-SVD方法可以既能夠填充稀疏矩陣,也能夠兼顧效率。

??關鍵字:SVD ?Funk—SVD ?推薦系統 ?協同過濾

??協同過濾(Collaborative Filtering,簡稱CF)是利用集體智慧的一個典型方法,算法的核心思想類似于我們在選擇看一本書時,往往會參考與自己口味相近的朋友的意見。基于CF算法的主要有兩種,一種是基于領域的方法,另一種是基于隱語義的方法。

??基于領域的方法主要是通過收集用戶行為,得到用戶和物品的特征向量,進一步計算相似度,找到物品或用戶的相似鄰居。基于隱語義的方法不依賴與共同評分,其基本思想是將用戶和物品分別映射到兩個真實含義未知的特征向量上去。這兩個特征向量的含義并不能通過人為給定,只能通過SVD模型自己來確定。模型讀取用戶和物品組成的評分矩陣,通過最小化損失來學習這兩個向量。

??SVD又稱奇異值分解,是線性代數中一種矩陣分解的技術,它能夠將任意一個m*n的矩陣A分解成為U、S、V,U是m*m的正交矩陣,V是n*n的正交矩陣,S是m*n的矩陣,且A=U*S*V。通過SVD方式將矩陣A分解后,如果只保留前k個最大的奇異值,就實現了對矩陣降維的目的。我們之所以能夠通過保留前k個最大的奇異值來實現降維,是因為在很多情況下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上的比例。盡管我們能夠通過降維來減少運算量,但是k值的選取是我們需要面對的重要問題。如果k值選的過大,那么降維的意義就不大;如果k值選的過小,那么降維之后就有可能丟失重要信息。下面通過一個例子來具體說明SVD算法在推薦系統中的應用。

??假設存在以下行為user和列為item的數據矩陣A,0表示沒有看過該電影:
A= \left[ \begin{matrix} 5 & 5 & 0 & 5\\ 5 & 0 & 3 & 4\\ 3 & 4 & 0 & 3\\ 0 & 0 & 5 & 3\\ 5 & 4 & 4 & 5\\ 5 & 4 & 5 & 5 \end{matrix} \right]

??通過SVD分解之后產生U、S、V三個矩陣:

U= \left[ \begin{matrix} -0.4472 & -0.5373 & -0.0064 & -0.5037 & -0.3857 & -0.3298\\ -0.3586 & 0.2461 & 0.8622 & -0.1458 & 0.0780 & 0.2002\\ -0.2925 & -0.4033 & -0.2275 & -0.1038 & 0.4360 & 0.7065\\ -0.2078 & 0.6700 & -0.3951 & -0.5888 & 0.0260 & 0.0667\\ -0.5099 & 0.0597 & -0.1097 & 0.2869 & 0.5946 & -0.5371\\ -0.5316 & 0.1887 & -0.19145 & 0.5341 & -0.5485 & 0.2429 \end{matrix} \right]
S= \left[ \begin{matrix} 17.7139 & 0 & 0 & 0\\ 0 & 6.3917 & 0 & 0\\ 0 & 4 & 3.0980 & 0\\ 0 & 0 & 0 & 1.3290\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 \end{matrix} \right]
V= \left[ \begin{matrix} -0.5710 & -0.2228 & 0.6749 & 0.4109\\ -0.4275 & -0.5172 & -0.6929 & 0.2637\\ -0.3846 & 0.8246 & -0.2532 & 0.3286\\ -0.5859 & 0.0532 & 0.0140 & -0.8085 \end{matrix} \right]

??此時,我們選取k=2來對U,S,V進行降維,k=2即表示我們默認該數據集含有兩個隱形因子:

U'= \left[ \begin{matrix} -0.4472 & -0.53738\\ -0.3586 & 0.2461\\ -0.2925 & -0.4033\\ -0.2078 & 0.6700\\ -0.5099 & 0.0597\\ -0.5316 & 0.1887 \end{matrix} \right]
S'= \left[ \begin{matrix} 17.7139 & 0\\ 0 & 6.3917 \end{matrix} \right]
'= \left[ \begin{matrix} -0.5710 & -0.2228\\ -0.4275 & -0.5172\\ -0.3846 & 0.8246\\ -0.5859 & 0.0532 \end{matrix} \right]

??此時我們通過降維后的U、S、V相乘來得到A':

A'= \left[ \begin{matrix} 5.2885 & 5.1627 & 0.2149 & 4.4591\\ 3.2768 & 1.9021 & 3.7400 & 3.8058\\ 3.5324 & 3.5479 & -0.1332 & 2.8984\\ 1.1475 & -0.6417 & 4.9472 & 2.3846\\ 5.0727 & 3.6640 & 3.7887 & 5.3130\\ 5.1086 & 3.4019 & 4.6166 & 5.5822 \end{matrix} \right]

??通過矩陣A和A'的比較,我們可以很直觀的看出這兩個矩陣十分相似,可以看做是一種數據有損的壓縮。此時我們可以開始對一個新用戶進行初步的推薦。假設該用戶的評分向量p=[5,5,0,0,0,5],首先我們通過公式p'=p*U'*S'l來得出用戶的二維向量,接著通過余弦相似度計算來找出與新用戶最相似的用戶評分向量q=[5,5,3,0,5,5],這樣我們可以根據向量q來對向量p進行填充,也就是預測。但是,這種預測存在非常大的誤差。因為奇異分解要求矩陣是稠密的,也就是說奇異分解不允許待分解矩陣中存在空白的部分,這與現實生活是沖突的。在現實生活中,評分矩陣一定是稀疏的,因為用戶沒有評分的物品一定是占大多數。為了解決這一問題,我們可以預先對缺失值進行填充,例如使用全局平均值。但是這一方法也有一個缺點——時間復雜度非常高。顯示生活中,用戶和物品的數目成千上萬,計算總體平均值的效率非常低。

??為了解決矩陣稀疏性,同時提高運算效率,我們引入了Funk—SVD算法。該算法又稱為隱語義模型,主要思路是,將原始評分矩陣A(m*n)分解成兩個矩陣P(m*k)和Q(k*n),同時僅考察原始評分矩陣中有評分的項分解結果是否準確,而判別標準則是均方差。即對于矩陣A(m*n),我們想辦法將其分解為P(m*k)、Q(k*n),此時對于原始矩陣中有評分的位置M'ui來說,其在分解后矩陣中對應的值就是:


p1.png

那么對于整個評分矩陣而言,總的損失就是:


p2.png

SSE越小,說明總體的損失越小,預測結果越精確。我們可以通過隨機梯度下降法來求SSE的最小值,隨機梯度下降法在此就不展開敘述。得出最小SSE后,我們通過公式(1)來對原評分矩陣進行填充,也就是對用戶的空白評分進行預測。

??將SVD用于推薦系統,推薦結果比較準確,模型的拓展性也很強,能夠應用于各種場景。但是SVD模型的可解釋性很差,其中的隱性因子無法對應與現實生活中的具體概念,模型的訓練速度仍然有待提高。總體來說,SVD在推薦系統的應用方面擁有良好的前景。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容