一,前提准備
訪問密碼 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表示表中的所有列都不是因子,是數值型數據。
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分時,差不多就失去了一半的用戶。
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分之間,與之前我們分析結果相同。
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語言實戰:編程基礎,統計分析與數據挖掘寶典