參考自:
其實說參考也不準確,準確地說應該是半翻譯半學習筆記。
仔細整理一遍,感覺還是收穫很大的。
任意乙個m*n
的矩陣a(m行*n列
,m>n
),可以被寫成三個矩陣的乘積:
1. u:(m行m列的列正交矩陣)
2. s:(m*n
的對角線矩陣,矩陣元素非負)
3. v:(n*n
的正交矩陣的倒置)
即a=u*s*v'
(注意矩陣v需要倒置)
直觀地說:
假設我們有乙個矩陣,該矩陣每一列代表乙個user,每一行代表乙個item。
如上圖,ben,tom....代表user,season n代表item。
矩陣值代表評分(0代表未評分):
如 ben對season1評分為5,tom對season1 評分為5,tom對season2未評分。
機器學習和資訊檢索:
機器學習的乙個最根本也是最有趣的特性是資料壓縮概念的相關性。
如果我們能夠從資料中抽取某些有意義的感念,則我們能用更少的位元位來表述這個資料。
從資訊理論的角度則是資料之間存在相關性,則有可壓縮性。
svd就是用來將乙個大的矩陣以降低維數的方式進行有損地壓縮。
降維:下面我們將用乙個具體的例子展示svd的具體過程。
首先是a矩陣。
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
(代表上圖的評分矩陣)
使用matlab呼叫svd函式:
[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
分解矩陣之後我們首先需要明白s的意義。
可以看到s很特別,是個對角線矩陣。
每個元素非負,而且依次減小,具體要講明白元素值的意思大概和線性代數的特徵向量,特徵值有關。
但是可以大致理解如下:
所以特徵值是代表該矩陣向著該特徵值對應的特徵向量的方向的變化權重。
所以可以取s對角線上前k個元素。
當k=2時候即將s(6*4)
降維成s(2*2)
,
同時u(6*6)
,vtranspose(4*4)
相應地變為u(6*2)
,vtranspose(4*2)
.
如下圖(裡的usv矩陣元素值和我自己matlab算出的usv矩陣元素值有些正負不一致,但是本質是相同的):
此時我們用降維後的u,s,v來相乘得到a2
a2=u(1:6,1:2)*s(1:2,1:2)*(v(1:4,1:2))' //matlab語句
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
此時我們可以很直觀地看出,a2和a很接近,這就是之前說的降維可以看成一種資料的有失真壓縮。
接下來我們開始分析該矩陣中資料的相關性。
我們將u的第一列當成x值,第二列當成y值。即u的每一行用乙個二維向量表示,同理v的每一行也用乙個二維向量表示。
如下圖:
從圖中可以看出:
season5,season6特別靠近。ben和fred也特別靠近。
同時我們仔細看一下a矩陣可以發現,a矩陣的第5行向量和第6行向量特別相似,ben所在的列向量和fred所在的列向量也特別相似。
所以從直觀上我們發現u矩陣和v矩陣可以近似來代表a矩陣,換據話說就是將a矩陣壓縮成u矩陣和v矩陣,至於壓縮比例得看當時對s矩陣取前k個數的k值是多少。
到這裡,我們已經完成了一半。
尋找相似使用者:
依然用例項來說明:
我們假設,現在有個名字叫bob的新使用者,並且已知這個使用者對season n的評分向量為:[5 5 0 0 0 5]。(此向量為列向量)
我們的任務是要對他做出個性化的推薦。
我們的思路首先是利用新使用者的評分向量找出該使用者的相似使用者。
如上圖(圖中第二行式子有錯誤,bob的轉置應為行向量)。
對圖中公式不做證明,只需要知道結論,結論是得到乙個bob的二維向量,即知道bob的座標。
將bob座標新增進原來的圖中:
然後從圖中找出和bob最相似的使用者。
注意,最相似並不是距離最近的使用者,這裡的相似用余弦相似度計算。(關於相似度還有很多種計算方法,各有優缺點)
即夾角與bob最小的使用者座標。
可以計算出最相似的使用者是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。
最後還有一些關於整個推薦思路的可改進的地方:
1.svd本身就是時間複雜度高的計算過程,如果資料量大的情況恐怕時間消耗無法忍受。 不過可以使用梯度下降等機器學習的相關方法來進行近似計算,以減少時間消耗。
2.相似度計算方法的選擇,有多種相似度計算方法,每種都有對應優缺點,對針對不同場景使用最適合的相似度計算方法。
3.推薦策略:首先是相似使用者可以多個,每個由相似度作為權重來共同影響推薦的item的評分。
SVD在推薦系統中的應用
其實說參考也不準確,準確地說應該是半翻譯半學習筆記。仔細整理一遍,感覺還是收穫很大的。任意乙個m n的矩陣a m行 n列,m n 可以被寫成三個矩陣的乘機 1.u m行m列的列正交矩陣 2.s m n的對角線矩陣,矩陣元素非負 3.v n n的正交矩陣的倒置 即a u s v 注意矩陣v需要倒置 直...
SVD在推薦系統中的應用
其實說參考也不準確,準確地說應該是半翻譯半學習筆記。仔細整理一遍,感覺還是收穫很大的。任意乙個m n的矩陣a m行 n列,m n 可以被寫成三個矩陣的乘積 1.u m行m列的列正交矩陣 2.s m n的對角線矩陣,矩陣元素非負 3.v n n的正交矩陣的倒置 即a u s v 注意矩陣v需要倒置 直...
SVD在推薦系統中的應用
mahout中有svd的推薦策略,今天查了一下資料了解了一下演算法原理,本質上是使用svd方法做特徵降維,然後再計算相似度。下面這篇文章寫的不錯,和大家分享一下。任意乙個m n的矩陣a m行 n列,m n 可以被寫成三個矩陣的乘積 1.u m行m列的列正交矩陣 2.s m n的對角線矩陣,矩陣元素非...