標籤:image ade 基於 nbsp 分解 lan 路徑 之間 uid
一,前提準備 1.R語言套件:ggplot2包(繪圖),recommenderlab包,reshape包(資料處理) 2.擷取資料:大家可以在明尼蘇達州大學的社會化計算研究中心官網上面下載這些免費資料集,網站連結為http://grouplens.org/datasets/movielens/,也可以通過網盤下載https://yunpan.cn/Oc6R9apvCnVXGc
訪問密碼 e1af。這裡包含了資料集和資料說明,該資料集是由943位使用者對1682部電影的一個評分,每個評分值為1,2,3,4,5。關於資料資訊,在資料說明裡面有詳細的說明,這裡就不再贅述。二,資料處理 首先載入我們所需要的包:
library(recommenderlab)library(reshape)library(ggplot2)
接下來我們就要讀取資料,如果資料在當前的工作目錄,那麼我們就可以在下面的代碼裡面直接輸入資料名稱,即u.data。當資料不在當前工作目錄下的時候,我們就可以通過輸入路徑來讀取資料。
mydata<-read.table("E:/my blog/R blog/movie/ml-100k/u.data",header = FALSE,stringsAsFactors = TRUE)
代碼裡面的stringsAsFactors = TRUE表示表中的所有列都不是因子,是數值型資料。
我們可以通過head()函數查看該資料集前6行的資料。第一列為使用者ID,第二列電影ID,第三列是評分,第四列是使用者評分的時間。這些在資料介紹中都要介紹。使用者的評論時間對我們的分析沒有用處,因此我們可以刪掉這一列。
mydata<-mydata[,-4]
現在這份資料集只有三列。我要使用ggplot2分析使用者對電影的評分結果。我決定要使用餅圖來展現出結果,這樣可以很好的展現評分列的分布特點。
ggplot(mydata,x=V3,aes(x=factor(1),fill=factor(V3)))+geom_bar(width = 1)+ coord_polar(theta="y")+ggtitle("評分分布圖")+ labs(x="",y="")+ guides(fill=guide_legend(title = ‘評分分數‘))
由圖可知,評分為一分,兩分的特別少,使用者給出三分,四分的比較多,佔了三分之二多。當一個新電影的評分低於3.5分時,差不多就失去了一半的使用者。
使用reshape包對資料進行處理,產生一個v1*v2,v3值的填充矩陣。
mydata<-cast(mydata,V1~V2,value="V3")#產生一個以v1為行,v2為列的矩陣,使用v3進行填充mydata<-mydata[,-1]#第一列數字為序列,可以刪除
這個時候,mydata有兩個屬性值cast_df 和data.frame,想要瞭解更多關於cast_df,可以查看下面這個網址https://www.r-statistics.com/tag/cast_df/。我們要將mydata屬性改為資料框,其中cast_df是不能直接轉換為matrix的,因此需要去掉這個類屬性,只保留data.frame。
class(mydata)<-"data.frame"
接下來,我們仍要對資料進行處理,使之轉換成recommenderlab包可以處理的realRatingMatrix屬性。在下面,我們首先將mydata轉化為一個矩陣,然後使用as()函數,進行強制類型轉換,達到了我們要的結果。
mydata<-as.matrix(mydata)mydata<-as(mydata,"realRatingMatrix")mydata#產生一個943*1682realRatingMatrix類型的矩陣,包括了100000條記錄
我們還需要給我每列資料命名,否則後面建模會出現報錯。
colnames(mydata)<-paste0("M",1:1682,sep="")as(mydata,"matrix")[1:6,1:6]
三,建立模型
在recommenderlab包裡面,針對realRatingMatrix資料類型,總共提供了6種模型,分別是:基於項目協同過濾(IBCF),主成分分析(PCA),基於流行度推薦(POPULAR),隨機推薦(RANDOM),奇異值分解(SVD),基於使用者協同過濾演算法(UBCF)。
協同過濾主要有兩個步驟:①依據目標使用者的已知電影評分找到與目標使用者觀影風格相似的使用者群。②計算該使用者群對其他電影的評分,並作為目標使用者的預測評分。
這份資料是943位使用者對1682部電影的一個評分,但每個人不可能將這些電影全都看完,而且不可能對所有看過的電影進行評分,因此我們我們剛剛產生的評分矩陣是一個非常稀疏,而且含有許多缺失值的矩陣。但這些並不影響協同過濾的工作效果。所以我們選擇了協同過濾來建立我們的模型。
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()函數,只需要給修改一下參數就行。
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個,其他代表含義相同。
參考書籍:R語言實戰:編程基礎,統計分析與資料採礦寶典
【轉】基於R語言構建的電影評分預測模型