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

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀在Python中實(shí)現(xiàn)推薦系統(tǒng)!
在Python中實(shí)現(xiàn)推薦系統(tǒng)!
2016-06-30
收藏

現(xiàn)今,推薦系統(tǒng)被用來(lái)個(gè)性化你在網(wǎng)上的體驗(yàn),告訴你買(mǎi)什么,去哪里吃,甚至是你應(yīng)該和誰(shuí)做朋友。人們口味各異,但通常有跡可循。人們傾向于喜歡那些與他們所喜歡的東西類似的東西,并且他們傾向于與那些親近的人有相似的口味。推薦系統(tǒng)試圖捕捉這些模式,以助于預(yù)測(cè)你還會(huì)喜歡什么東西。電子商務(wù)、社交媒體、視頻和在線新聞平臺(tái)已經(jīng)積極的部署了它們自己的推薦系統(tǒng),以幫助它們的客戶更有效的選擇產(chǎn)品,從而實(shí)現(xiàn)雙贏。

兩種最普遍的推薦系統(tǒng)的類型是基于內(nèi)容和協(xié)同過(guò)濾(CF)。協(xié)同過(guò)濾基于用戶對(duì)產(chǎn)品的態(tài)度產(chǎn)生推薦,也就是說(shuō),它使用“人群的智慧”來(lái)推薦產(chǎn)品。與此相反,基于內(nèi)容的推薦系統(tǒng)集中于物品的屬性,并基于它們之間的相似性為你推薦。

一般情況下,協(xié)作過(guò)濾(CF)是推薦引擎的主力。該算法具有能夠自身進(jìn)行特征學(xué)習(xí)的一個(gè)非常有趣的特性,這意味著它可以開(kāi)始學(xué)習(xí)使用哪些特性。CF可以分為基于內(nèi)存的協(xié)同過(guò)濾和基于模型的協(xié)同過(guò)濾。在本教程中,你將使用奇異值分解(SVD)實(shí)現(xiàn)基于模型的CF和通過(guò)計(jì)算余弦相似實(shí)現(xiàn)基于內(nèi)存的CF。

我們將使用MovieLens數(shù)據(jù)集,它是在實(shí)現(xiàn)和測(cè)試推薦引擎時(shí)所使用的最常見(jiàn)的數(shù)據(jù)集之一。它包含來(lái)自于943個(gè)用戶以及精選的1682部電影的100K個(gè)電影打分。你應(yīng)該添加解壓縮的movielens數(shù)據(jù)文件夾你的notebook目錄下。你也可以在這里(http://files.grouplens.org/datasets/movielens/ml-100k.zip)下載數(shù)據(jù)集。


讀入u.data文件,它包含完整的數(shù)據(jù)集。你可以 file, which contains the full dataset. You can(http://files.grouplens.org/datasets/movielens/ml-100k-README.txt)在這里閱讀該數(shù)據(jù)集的簡(jiǎn)要說(shuō)明。


先看看數(shù)據(jù)集中的前兩行。接下來(lái),讓我們計(jì)算唯一用戶和電影的數(shù)量。


你可以使用scikit-learn庫(kù)將數(shù)據(jù)集分割成測(cè)試和訓(xùn)練。Cross_validation.train_test_split根據(jù)測(cè)試樣本的比例(test_size),本例中是0.25,來(lái)將數(shù)據(jù)混洗并分割成兩個(gè)數(shù)據(jù)集。


基于內(nèi)存的協(xié)同過(guò)濾

基于內(nèi)存的協(xié)同過(guò)濾方法可以分為兩個(gè)主要部分:用戶-產(chǎn)品協(xié)同過(guò)濾和產(chǎn)品-產(chǎn)品協(xié)同過(guò)濾。一個(gè)用戶-產(chǎn)品協(xié)同過(guò)濾將選取一個(gè)特定的用戶,基于打分的相似性發(fā)現(xiàn)類似于該用戶的用戶,并推薦那些相似用戶喜歡的產(chǎn)品。相比之下,產(chǎn)品-產(chǎn)品協(xié)同過(guò)濾會(huì)選取一個(gè)產(chǎn)品,發(fā)現(xiàn)喜歡該產(chǎn)品的用戶,并找到這些用戶或相似的用戶還喜歡的其他的產(chǎn)品。輸入一個(gè)產(chǎn)品,然后輸出其他產(chǎn)品作為推薦。

· 用戶-產(chǎn)品協(xié)同過(guò)濾: “喜歡這個(gè)東西的人也喜歡……”

· 產(chǎn)品-產(chǎn)品協(xié)同過(guò)濾: “像你一樣的人也喜歡……”

在這兩種情況下,從整個(gè)數(shù)據(jù)集構(gòu)建一個(gè)用戶-產(chǎn)品矩陣。由于你已經(jīng)將數(shù)據(jù)拆分到測(cè)試集和訓(xùn)練集,那么你將需要?jiǎng)?chuàng)建兩個(gè)[943 x 1682]矩陣。訓(xùn)練矩陣包含75%的打分,而測(cè)試矩陣包含25%的打分。



用戶-產(chǎn)品矩陣的例子: blog8

在構(gòu)建了用戶-產(chǎn)品矩陣后,計(jì)算相似性并創(chuàng)建一個(gè)相似性矩陣。

在產(chǎn)品-產(chǎn)品協(xié)同過(guò)濾中的產(chǎn)品之間的相似性值是通過(guò)觀察所有對(duì)兩個(gè)產(chǎn)品之間的打分的用戶來(lái)度量的。


對(duì)于用戶-產(chǎn)品協(xié)同過(guò)濾,用戶之間的相似性值是通過(guò)觀察所有同時(shí)被兩個(gè)用戶打分的產(chǎn)品來(lái)度量的。


通常用于推薦系統(tǒng)中的距離矩陣是余弦相似性,其中,打分被看成n維空間中的向量,而相似性是基于這些向量之間的角度進(jìn)行計(jì)算的。用戶a和m的余弦相似性可以使用下面的公式進(jìn)行計(jì)算,其中,獲取用戶向量的點(diǎn)積和,然后用向量的歐幾里得長(zhǎng)度的乘積來(lái)除以它。



要計(jì)算產(chǎn)品m和b之間的相似性,使用公式:



第一步是創(chuàng)建用戶-產(chǎn)品矩陣。由于你既有測(cè)試數(shù)據(jù),又有訓(xùn)練數(shù)據(jù),那么你需要?jiǎng)?chuàng)建兩個(gè)矩陣。



你可以使用sklearn的pairwise_distances函數(shù)來(lái)計(jì)算余弦相似性。注意,輸出范圍從0到1,因?yàn)榇蚍侄际钦摹?/span>



下一步是做出預(yù)測(cè)。你已經(jīng)創(chuàng)建了相似性矩陣:user_similarity和item_similarity,因此,你可以通過(guò)為基于用戶的CF應(yīng)用下面的公式做出預(yù)測(cè):



你可以將用戶k和a之間的相似性看成權(quán)重,它乘以相似用戶a (校正的平均評(píng)分用戶)的評(píng)分。你需要規(guī)范化該值,使打分位于1到5之間,最后,對(duì)你嘗試預(yù)測(cè)的用戶的平均評(píng)分求和。

這里的想法是,某些用戶可能會(huì)傾向于對(duì)所有的電影,總是給予高或低評(píng)分。這些用戶提供的評(píng)分的相對(duì)差比絕對(duì)評(píng)分值更重要。舉個(gè)例子:假設(shè),用戶k對(duì)他最喜歡的電影打4星,而對(duì)所有其他的好電影打3星?,F(xiàn)在假設(shè)另一個(gè)用戶t對(duì)他/她喜歡的電影打5星,而對(duì)他/她感到無(wú)聊的電影打3星。那么這兩個(gè)用戶可能品味非常相似,但對(duì)打分系統(tǒng)區(qū)別對(duì)待。

當(dāng)為基于產(chǎn)品的CF進(jìn)行預(yù)測(cè)時(shí),你無(wú)須糾正用戶的平均打分,因?yàn)椴樵冇脩舯臼戮褪怯脕?lái)做預(yù)測(cè)的。







評(píng)估

有許多評(píng)價(jià)指標(biāo),但其中最受歡迎的用來(lái)度量預(yù)測(cè)評(píng)分的準(zhǔn)確性的指標(biāo)是均方根誤差 (RMSE)。



你可以使用sklearn的mean_square_error (MSE)函數(shù),其中,RMSE僅僅是MSE的平方根。要了解更多不同的評(píng)價(jià)指標(biāo),你可以看看這篇文章。

由于你只是想要考慮測(cè)試數(shù)據(jù)集中的預(yù)測(cè)評(píng)分,因此,使用prediction[ground_truth.nonzero()]篩選出預(yù)測(cè)矩陣中的所有其他元素。


基于內(nèi)存的算法事很容易實(shí)現(xiàn)并產(chǎn)生合理的預(yù)測(cè)質(zhì)量的。

基于內(nèi)存的CF的缺點(diǎn)是,它不能擴(kuò)展到真實(shí)世界的場(chǎng)景,并且沒(méi)有解決眾所周知的冷啟動(dòng)問(wèn)題,也就是當(dāng)新用戶或新產(chǎn)品進(jìn)入系統(tǒng)時(shí)?;谀P偷腃F方法是可擴(kuò)展的,并且可以比基于內(nèi)存的模型處理更高的稀疏度,但當(dāng)沒(méi)有任何評(píng)分的用戶或產(chǎn)品進(jìn)入系統(tǒng)時(shí),也是苦不堪言的。

基于模型的協(xié)同過(guò)濾

基于模型的協(xié)同過(guò)濾是基于矩陣分解(MF),它已獲得更大的曝光,它主要是作為潛變量分解和降維的一個(gè)無(wú)監(jiān)督學(xué)習(xí)方法。矩陣分解廣泛用于推薦系統(tǒng),其中,它比基于內(nèi)存的CF可以更好地處理與擴(kuò)展性和稀疏性. MF的目標(biāo)是從已知的評(píng)分中學(xué)習(xí)用戶的潛在喜好和產(chǎn)品的潛在屬性(學(xué)習(xí)描述評(píng)分特征特征),隨后通過(guò)用戶和產(chǎn)品的潛在特征的點(diǎn)積預(yù)測(cè)未知的評(píng)分。

當(dāng)你有一個(gè)非常稀疏的多維矩陣時(shí),通過(guò)進(jìn)行矩陣分解可以調(diào)整用戶-產(chǎn)品矩陣為低等級(jí)的結(jié)構(gòu),然后你可以通過(guò)兩個(gè)低秩矩陣(其中,每行包含該本征矢量)的乘積來(lái)代表該矩陣。你通過(guò)將低秩矩陣相乘,在原始矩陣填補(bǔ)缺少項(xiàng),以調(diào)整這個(gè)矩陣,從而盡可能的近似原始矩陣。

讓我們計(jì)算MovieLens數(shù)據(jù)集的稀疏度:



舉例說(shuō)明用戶和產(chǎn)品的學(xué)習(xí)隱藏偏好:假設(shè)MovieLens數(shù)據(jù)集中有以下信息:(user id, age, location, gender, movie id, director, actor, language, year, rating)。通過(guò)應(yīng)用矩陣分解,模型學(xué)習(xí)到重要的用戶特征是年齡組(10歲以下,10-18歲,18-30歲,30-90歲),位置和性別,而對(duì)于電影特性,它學(xué)習(xí)到年份,導(dǎo)演和演員是最重要的?,F(xiàn)在,如果你看看你所存儲(chǔ)的信息,其中并沒(méi)有年份這樣的特性,但該模型可以自己學(xué)習(xí)。重要方面是,CF模型僅使用數(shù)據(jù)(user_id, movie_id, rating)來(lái)學(xué)習(xí)潛在特征。如果只有少數(shù)可用的數(shù)據(jù),那么基于模型的CF模式將預(yù)測(cè)不良,因?yàn)檫@將更難以學(xué)習(xí)潛在特征

同時(shí)使用評(píng)分和內(nèi)容特性的模型稱為混合推薦系統(tǒng),其中,協(xié)同過(guò)濾和基于內(nèi)容的模型相結(jié)合?;旌?a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推薦系統(tǒng)通常比協(xié)同過(guò)濾或基于內(nèi)容的模型自身表現(xiàn)出更高的精度:它們有能力更好的解決冷啟動(dòng)問(wèn)題,因?yàn)槿绻銢](méi)有一個(gè)用戶或者一個(gè)產(chǎn)品的評(píng)分,那么你可以使用該用戶或產(chǎn)品的元數(shù)據(jù)進(jìn)行預(yù)測(cè)?;旌?a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推薦系統(tǒng)將在未來(lái)的教程中介紹。

SVD

一個(gè)眾所周知的矩陣分解方法是奇異值分解(SVD)。通過(guò)使用奇異值分解,協(xié)同過(guò)濾可以被近似一個(gè)矩陣X所制定。Netflix Prize比賽中的獲勝隊(duì)伍使用SVD矩陣分解模型來(lái)生成產(chǎn)品建議,更多的信息,推薦閱讀文章:Netflix推薦:5星之外和Netflix Prize和SVD

一般的方程可以表示為:



給定m x n矩陣X:

· U是一個(gè)(m x r)正交矩陣
· S是一個(gè)對(duì)角線上為非負(fù)實(shí)數(shù)的(r x r)對(duì)角矩陣
· V^T是一個(gè)(r x n)正交矩陣

S的對(duì)角線上的元素被稱為X的奇異值。

矩陣X可以被分解成U,S和V。U矩陣表示對(duì)應(yīng)于隱藏特性空間中的用戶的特性矩陣,而V矩陣表示對(duì)應(yīng)于隱藏特性空間中的產(chǎn)品的特性矩陣。



現(xiàn)在,你可以通過(guò)U, S和V^T的點(diǎn)積進(jìn)行預(yù)測(cè)了。




草草解決只有相對(duì)較少為人所知的問(wèn)題是非常容易出現(xiàn)的過(guò)度擬合。SVD可能會(huì)非常緩慢,并且計(jì)算成本比較高。更近期的工作通過(guò)應(yīng)用交替最小二乘或隨機(jī)梯度下降最小化平方誤差,并使用正則項(xiàng)以防止過(guò) ??度擬合。你可以看到我們之前的一個(gè)關(guān)于隨機(jī)梯度下降的教程,以獲取更多詳細(xì)信息。用于CF的交替最小二乘和隨機(jī)梯度下降的方法將在未來(lái)的教程中介紹。

總結(jié)一下:

· 在這篇文章中,我們講了如何實(shí)現(xiàn)簡(jiǎn)單的協(xié)同過(guò)濾方法,包括基于內(nèi)存的CF和基于模型的CF。

· 基于內(nèi)存的模型是基于產(chǎn)品或用戶之間的相似性,其中,我們使用余弦相似性。

· 基于模型的CF是基于矩陣分解,其中,我們使用SVD來(lái)分解矩陣。

· 構(gòu)建在冷啟動(dòng)的情況下(其中,對(duì)于新用戶和新產(chǎn)品來(lái)說(shuō),數(shù)據(jù)不可用)表現(xiàn)良好的推薦系統(tǒng)仍然是一個(gè)挑戰(zhàn)。標(biāo)準(zhǔn)的協(xié)同過(guò)濾方法在這樣的設(shè)置下表現(xiàn)不佳。在接下來(lái)的教程中,你將深入研究這一問(wèn)題。


原文鏈接:
http://online.cambridgecoding.com/notebooks/eWReNYcAfB/implementing-your-own-recommender-systems-in-python-2

譯文鏈接:https://github.com/ictar/pythondocument/blob/master/Science%20and%20Data%20Analysis/在Python中實(shí)現(xiàn)你自己的推薦系統(tǒng).md

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

若不方便掃碼,搜微信號(hào):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(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }