99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀矩陣分解在推薦系統(tǒng)中的應用:NMF和經(jīng)典SVD實戰(zhàn)
矩陣分解在推薦系統(tǒng)中的應用:NMF和經(jīng)典SVD實戰(zhàn)
2016-05-06
收藏

矩陣分解在推薦系統(tǒng)中的應用:NMF和經(jīng)典SVD實戰(zhàn)

數(shù)據(jù) 

關(guān)于NMF,在隱語義模型和NMF(非負矩陣分解)已經(jīng)有過介紹。

用戶和物品的主題分布


運行后輸出:


可視化物品的主題分布:


結(jié)果:

從距離的角度來看,item 5和item 6比較類似;從余弦相似度角度看,item 2、5、6 比較相似,item 1、3比較相似。

可視化用戶的主題分布:


結(jié)果:

從距離的角度來看,F(xiàn)red、Ben、Tom的口味差不多;從余弦相似度角度看,F(xiàn)red、Ben、Tom的口味還是差不多。


如何推薦

現(xiàn)在對于用戶A,如何向其推薦物品呢?

方法1: 找出與用戶A最相似的用戶B,將B評分過的、評分較高、A沒評分過的的若干物品推薦給A。

方法2: 找出用戶A評分較高的若干物品,找出與這些物品相似的、且A沒評分的若干物品推薦給A。

方法3: 找出用戶A最感興趣的k個主題,找出最符合這k個主題的、且A沒評分的若干物品推薦給A。

方法4: 由NMF得到的兩個矩陣,重建評分矩陣。例如:


運行結(jié)果:

對于Tom(評分矩陣的第2行),其未評分過的物品是item 2、item 3、item 4。item 2的推薦值是2.19148602,item 3的推薦值是1.73560797,item 4的推薦值是0,若要推薦一個物品,推薦item 2。

如何處理有評分記錄的新用戶

NMF是將非負矩陣V分解為兩個非負矩陣W和H:

V=W×H

在本文上面的實現(xiàn)中,V對應評分矩陣,W是用戶的主題分布,H是物品的主題分布。

對于有評分記錄的新用戶,如何得到其主題分布?

方法1: 有評分記錄的新用戶的評分數(shù)據(jù)放入評分矩陣中,使用NMF處理新的評分矩陣。

方法2: 物品的主題分布矩陣H保持不變,將V更換為新用戶的評分組成的行向量,求W即可。

下面嘗試一下方法2。

設(shè)新用戶Bob的評分記錄為:


運行結(jié)果是:

經(jīng)典SVD

關(guān)于SVD的一篇好文章:強大的矩陣奇異值分解(SVD)及其應用。

相關(guān)分析與上面類似,這里就直接上代碼了。

運行結(jié)果:

可視化一下:

經(jīng)典SVD + 協(xié)同過濾

0代表沒有評分,但是上面的方法(如何推薦這一節(jié)的方法4)又確實把0看作了評分,所以最終得到的只是一個推薦值(而且總體都偏?。?,而無法當作預測的評分。在How do I use the SVD in collaborative filtering?有這方面的討論。


SVD簡要介紹

SVD的目標是將m*n大小的矩陣A分解為三個矩陣的乘積:

[latex]
A = U S V^{T}
[/latex]

U和V都是正交矩陣,大小分別是m*m、n*n。S是一個對角矩陣,大小是m*n,對角線存放著奇異值,從左上到右下依次減小,設(shè)奇異值的數(shù)量是r。

取k,k<<r。

取得UU的前k列得到UkUk,SS的前k個奇異值對應的方形矩陣得到SkSk,VTVT的前k行得到VTkVkT,于是有

[latex]
A_{k} = U_{k} S_{k} V^{T}_{k}
[/latex]

AkAk可以認為是AA的近似。

下面的算法將協(xié)同過濾SVD結(jié)合了起來。

Item-based Filtering Enhanced by SVD

這個算法來自下面這篇論文:

Vozalis M G, Margaritis K G. Applying SVD on Generalized Item-based Filtering[J]. IJCSA, 2006, 3(3): 27-51.

1、 設(shè)評分矩陣為R,大小為m*n,m個用戶,n個物品。R中元素rijrij代表著用戶uiui對物品ijij的評分。

2、 預處理R,消除掉其中未評分數(shù)據(jù)(即值為0)的評分。


計算R中每一行的平均值(平均值的計算中不包括值為0的評分),令Rfilled?in=RRfilled?in=R,然后將Rfilled?inRfilled?in中的0設(shè)置為該行的平均值。

計算R中每一列的平均值(平均值的計算中不包括值為0的評分)riri,Rfilled?inRfilled?in中的所有元素減去對應的riri,得到正規(guī)化的矩陣RnormRnorm。(norm,即normalized)。


3、 對RnormRnorm進行奇異值分解,得到:
[latex]
R_{norm} = U S V^{T}
[/latex]

4、 設(shè)正整數(shù)k,取得UU的前k列得到UkUk,SS的前k個奇異值對應的方形矩陣得到SkSk,VTVT的前k行得到VTkVkT,于是有

[latex]
R_{red} = U_{k} S_{k} V^{T}_{k}
[/latex]

red,即dimensionality reduction中的reduction??梢哉J為k是指最重要的k個主題。定義RredRred中元素rrijrrij用戶i對物品j在矩陣RredRred中的值。

5、 [latex] U_{k} S_{k}^{\frac{1}{2}}[/latex],是用戶相關(guān)的降維后的數(shù)據(jù),其中的每行代表著對應用戶在新特征空間下位置。[latex] S_{k}^{\frac{1}{2}}V^{T}_{k}[/latex],是物品相關(guān)的降維后的數(shù)據(jù),其中的每列代表著對應物品在新特征空間下的位置。

S12k?VTkSk12?VkT中的元素mrijmrij代表物品j在新空間下維度i中的值,也可以認為是物品j屬于主題i的程度。(共有k個主題)。

6、 獲取物品之間相似度。

根據(jù)S12k?VTkSk12?VkT計算物品之間的相似度,例如使用余弦相似度計算物品j和f的相似度:


相似度計算出來后就可以得到每個物品最相似的若干物品了。


7、 使用下面的公式預測用戶a對物品j的評分:

這個公式里有些變量的使用和上面的沖突了(例如k)。
ll是指取物品j最相似的ll個物品。
mrijmrij代表物品j在新空間下維度i中的值,也可以認為是物品j屬于主題i的程度。
simjksimjk是物品j和物品k的相似度。
RredRred中元素rrakrrak是用戶a對物品k在矩陣RredRred中對應的評分。raˉraˉ是指用戶a在評分矩陣RR中評分的平均值(平均值的計算中不包括值為0的評分)。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }