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

熱線電話:13121318867

登錄
首頁精彩閱讀基于R語言構建的電影評分預測模型
基于R語言構建的電影評分預測模型
2017-07-16
收藏

基于R語言構建的電影評分預測模型

電影評分系統(tǒng)是一種常見的推薦系統(tǒng)?,F(xiàn)在使用R語言基于協(xié)同過濾算法來構建一個電影評分預測模型。

一,前提準備

1.R語言包:ggplot2包(繪圖),recommenderlab包,reshape包(數(shù)據(jù)處理)

2.獲取數(shù)據(jù):大家可以在明尼蘇達州大學的社會化計算研究中心官網上面下載這些免費數(shù)據(jù)集,這里包含了數(shù)據(jù)集和數(shù)據(jù)說明,該數(shù)據(jù)集是由943位用戶對1682部電影的一個評分,每個評分值為1,2,3,4,5。關于數(shù)據(jù)信息,在數(shù)據(jù)說明里面有詳細的說明,這里就不再贅述。

二,數(shù)據(jù)處理

首先加載我們所需要的包:

接下來我們就要讀取數(shù)據(jù),如果數(shù)據(jù)在當前的工作目錄,那么我們就可以在下面的代碼里面直接輸入數(shù)據(jù)名稱,即u.data。當數(shù)據(jù)不在當前工作目錄下的時候,我們就可以通過輸入路徑來讀取數(shù)據(jù)。

mydata<-read.table("E:/my blog/R blog/movie/ml-100k/u.data",header = FALSE,stringsAsFactors = TRUE)  

       代碼里面的stringsAsFactors = TRUE表示表中的所有列都不是因子,是數(shù)值型數(shù)據(jù)。
我們可以通過head()函數(shù)查看該數(shù)據(jù)集前6行的數(shù)據(jù)。第一列為用戶ID,第二列電影ID,第三列是評分,第四列是用戶評分的時間。這些在數(shù)據(jù)介紹中都要介紹。用戶的評論時間對我們的分析沒有用處,因此我們可以刪掉這一列。

mydata<-mydata[,-4]  

       現(xiàn)在這份數(shù)據(jù)集只有三列。我要使用ggplot2分析用戶對電影的評分結果。我決定要使用餅圖來展現(xiàn)出結果,這樣可以很好的展現(xiàn)評分列的分布特點。

    library(recommenderlab) 

    library(reshape)  

    library(ggplot2)


       由圖可知,評分為一分,兩分的特別少,用戶給出三分,四分的比較多,占了三分之二多。當一個新電影的評分低于3.5分時,差不多就失去了一半的用戶。
使用reshape包對數(shù)據(jù)進行處理,生成一個v1*v2,v3值的填充矩陣。
    mydata<-cast(mydata,V1~V2,value="V3")  
    #生成一個以v1為行,v2為列的矩陣,使用v3進行填充  
    mydata<-mydata[,-1]#第一列數(shù)字為序列,可以刪除 
          這個時候,mydata有兩個屬性值cast_df 和data.frame,想要了解更多關于cast_df,可以查看下面這個網址https://www.r-statistics.com/tag/cast_df/。我們要將mydata屬性改為數(shù)據(jù)框,其中cast_df是不能直接轉換為matrix的,因此需要去掉這個類屬性,只保留data.frame。
class(mydata)<-"data.frame"
接下來,我們仍要對數(shù)據(jù)進行處理,使之轉換成recommenderlab包可以處理的realRatingMatrix屬性。在下面,我們首先將mydata轉化為一個矩陣,然后使用as()函數(shù),進行強制類型轉換,達到了我們要的結果。
mydata<-as.matrix(mydata)  
mydata<-as(mydata,"realRatingMatrix")  
mydata  

#生成一個943*1682realRatingMatrix類型的矩陣,包括了100000條記錄

  我們還需要給我每列數(shù)據(jù)命名,否則后面建模會出現(xiàn)報錯。

   colnames(mydata)<-paste0("M",1:1682,sep="")  
    as(mydata,"matrix")[1:6,1:6]

三,建立模型

         在recommenderlab包里面,針對realRatingMatrix數(shù)據(jù)類型,總共提供了6種模型,分別是:基于項目協(xié)同過濾(IBCF),主成分分析(PCA),基于流行度推薦(POPULAR),隨機推薦(RANDOM),奇異值分解(SVD),基于用戶協(xié)同過濾算法(UBCF)。
         協(xié)同過濾主要有兩個步驟:①依據(jù)目標用戶的已知電影評分找到與目標用戶觀影風格相似的用戶群。②計算該用戶群對其他電影的評分,并作為目標用戶的預測評分。
         這份數(shù)據(jù)是943位用戶對1682部電影的一個評分,但每個人不可能將這些電影全都看完,而且不可能對所有看過的電影進行評分,因此我們我們剛剛生成的評分矩陣是一個非常稀疏,而且含有許多缺失值的矩陣。但這些并不影響協(xié)同過濾的工作效果。所以我們選擇了協(xié)同過濾來建立我們的模型。

     mydata.model<-Recommender(mydata[1:800],method="UBCF")  
    mydata.predict<-predict(mydata.model,mydata[801:803],type="ratings")  
    #預測  
    as(mydata.predict,"matrix")[1:3,1:6] 

         M1       M2       M3       M4       M5       M6
801 4.023833 4.017790 4.099041 4.061437 4.038462 4.038462
802 3.719220 3.505469 3.482577 3.485396 3.373351 3.493333
803 3.021637 3.090909 3.099141 3.099141 3.090909 3.090909
       上面這就是對801,802,803用戶對     M1       M2       M3       M4       M5       M6的預測評分,評分基本都在3—4分之間,與之前我們分析結果相同。
我們也可以給用戶推薦電影,我們可以使用predict()函數(shù),只需要給修改一下參數(shù)就行。
    mydata.predict2<-predict(mydata.model,mydata[801:803],n=5)  
    as(mydata.predict2,"list")  
運行結果如下:

$`801`
[1] "M272" "M258" "M315" "M327" "M298"

$`802`
[1] "M313" "M50"  "M298" "M328" "M127"

$`803`
[1] "M302" "M268" "M272" "M313" "M9"  
這里表示的意思是給用戶801推薦了電影有"M272" "M258" "M315" "M327" "M298"這么5個,其他代表含義相同。

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

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

數(shù)據(jù)分析師考試動態(tài)
數(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(); // 調用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調,回調的第一個參數(shù)驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產品形式,包括: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); }