http://blog.csdn.net/syani/article/details/52297093
mahout中有SVD的推薦策略,今天查了一下資料了解了一下算法原理,本質(zhì)上是使用SVD方法做特征降維,然后再計算相似度。下面這篇文章寫的不錯,和大家分享一下。
轉(zhuǎn)自:http://yanyiwu.com/work/2012/09/10/SVD-application-in-recsys.html
線性代數(shù)相關(guān)知識:
任意一個M*N的矩陣A(M行*N列,M>N),可以被寫成三個矩陣的乘積:
1. U:(M行M列的列正交矩陣)
2. S:(M*N的對角線矩陣,矩陣元素非負(fù))
3. V:(N*N的正交矩陣的倒置)
即 A=U*S*V'(注意矩陣V需要倒置)
直觀地說:
假設(shè)我們有一個矩陣,該矩陣每一列代表一個user,每一行代表一個item。
[圖片上傳失敗...(image-82f708-1520412554755)]
如上圖,ben,tom….代表user,season n代表item。
矩陣值代表評分(0代表未評分):
如 ben對season1評分為5,tom對season1 評分為5,tom對season2未評分。
機(jī)器學(xué)習(xí)和信息檢索:
機(jī)器學(xué)習(xí)的一個最根本也是最有趣的特性是數(shù)據(jù)壓縮概念的相關(guān)性。
如果我們能夠從數(shù)據(jù)中抽取某些有意義的感念,則我們能用更少的比特位來表述這個數(shù)據(jù)。
從信息論的角度則是數(shù)據(jù)之間存在相關(guān)性,則有可壓縮性。
SVD就是用來將一個大的矩陣以降低維數(shù)的方式進(jìn)行有損地壓縮。
降維:(相對于機(jī)器學(xué)習(xí)中的PCA)
下面我們將用一個具體的例子展示svd的具體過程。
首先是A矩陣。
<pre style="margin: 0px 0px 24px; padding: 0px; font-weight: 400; box-sizing: border-box; background-color: rgb(240, 240, 240); font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0);">`A =
5 5 0 5
5 0 3 4
3 4 0 3
0 0 5 3
5 4 4 5
5 4 5 5` </pre>
(代表上圖的評分矩陣)
使用matlab調(diào)用svd函數(shù):
<pre style="margin: 0px 0px 24px; padding: 0px; font-weight: 400; box-sizing: border-box; background-color: rgb(240, 240, 240); font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0);">`[U,S,Vtranspose]=svd(A)
U =
-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.1914 0.5341 -0.5485 0.2429
S =
17.7139 0 0 0
0 6.3917 0 0
0 0 3.0980 0
0 0 0 1.3290
0 0 0 0
0 0 0 0
Vtranspose =
-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` </pre>
分解矩陣之后我們首先需要明白S的意義。
可以看到S很特別,是個對角線矩陣。
每個元素非負(fù),而且依次減小,從幾何意義上來說,此值和特征向量中的特征值的權(quán)重有關(guān)。
[html] view plaincopy
<embed id="ZeroClipboardMovie_1" src="http://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent" style="box-sizing: border-box;">
<span style="font-size:14px;">若想進(jìn)一步了解<span style="color:#FF0000;"><strong>SVD分解</strong></span>,推薦讀下面這篇文章:
<strong>機(jī)器學(xué)習(xí)中的數(shù)學(xué)(5)-強(qiáng)大的矩陣奇異值分解(SVD)及其應(yīng)用</strong>
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html</span>
所以可以取S對角線上前k個元素。
當(dāng)k=2時候即將S(6*4)降維成S(2*2),
同時U(6*6),Vtranspose(4*4)相應(yīng)地變?yōu)?U(6*2),Vtranspose(4*2).
如下圖(圖片里的usv矩陣元素值和我自己matlab算出的usv矩陣元素值有些正負(fù)不一致,但是本質(zhì)是相同的):
[圖片上傳失敗...(image-b66b14-1520412554753)]
此時我們用降維后的U,S,V來相乘得到A2
<pre style="margin: 0px 0px 24px; padding: 0px; font-weight: 400; box-sizing: border-box; background-color: rgb(240, 240, 240); font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0);">A2=U(1:6,1:2)*S(1:2,1:2)*(V(1:4,1:2))' //matlab語句 </pre>
<pre style="margin: 0px 0px 24px; padding: 0px; font-weight: 400; box-sizing: border-box; background-color: rgb(240, 240, 240); font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0);">`A2 =
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` </pre>
此時我們可以很直觀地看出,A2和A很接近,這就是之前說的降維可以看成一種數(shù)據(jù)的有損壓縮。
接下來我們開始分析該矩陣中數(shù)據(jù)的相關(guān)性
我們將u的第一列當(dāng)成x值,第二列當(dāng)成y值(即u的每一行用一個二維向量表示)
同理,v的每一行也用一個二維向量表示。
如下圖:
[圖片上傳失敗...(image-7a84c9-1520412554753)]
從圖中可以看出:
Season5,Season6特別靠近。Ben和Fred也特別靠近。
同時我們仔細(xì)看一下A矩陣可以發(fā)現(xiàn),A矩陣的第5行向量和第6行向量特別相似,Ben所在的列向量和Fred所在的列向量也特別相似。
所以,從直觀上我們發(fā)現(xiàn),U矩陣和V矩陣可以近似來代表A矩陣,換據(jù)話說就是將A矩陣壓縮成U矩陣和V矩陣,至于壓縮比例得看當(dāng)時對S矩陣取前k個數(shù)的k值是多少。
到這里,我們已經(jīng)完成了一半。
尋找相似用戶
我們假設(shè),現(xiàn)在有個名字叫Bob的新用戶,并且已知這個用戶對season n的評分向量為:[5 5 0 0 0 5]。(此向量為行向量)
我們的任務(wù)是要對他做出個性化的推薦。
我們的思路首先是利用新用戶的評分向量找出該用戶的相似用戶。
[圖片上傳失敗...(image-c7b306-1520412554753)]
對圖中公式不做證明,只需要知道結(jié)論:得到一個Bob的二維向量,即知道Bob的坐標(biāo)。(本質(zhì)上是特征的降維轉(zhuǎn)換)
將Bob坐標(biāo)添加進(jìn)原來的圖中:
[圖片上傳失敗...(image-f23c97-1520412554753)]
然后從圖中找出和Bob最相似的用戶。
注意,最相似并不是距離最近的用戶,這里的相似用余弦相似度計算,即夾角與Bob最小的用戶坐標(biāo),可以計算出最相似的用戶是ben。
接下來的推薦策略就完全取決于個人選擇了。
這里介紹一個非常簡單的推薦策略:
找出最相似的用戶,即ben。
觀察ben的評分向量為:【5 5 3 0 5 5】。
對比Bob的評分向量:【5 5 0 0 0 5】。
然后找出ben評分過而Bob未評分的item并排序,即【season 5:5,season 3:3】。
即推薦給Bob的item依次為 season5 和 season3。
最后還有一些關(guān)于整個推薦思路的可改進(jìn)的地方:
1.svd本身就是時間復(fù)雜度高的計算過程,如果數(shù)據(jù)量大的情況恐怕時間消耗無法忍受。不過可以使用梯度下降等機(jī)器學(xué)習(xí)的相關(guān)方法來進(jìn)行近似計算,以減少時間消耗。
2.相似度計算方法的選擇,有多種相似度計算方法,每種都有對應(yīng)優(yōu)缺點,對針對不同場景使用最適合的相似度計算方法。
3.推薦策略:首先是相似用戶可以多個,每個由相似度作為權(quán)重來共同影響推薦的item的評分。