版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算廣告學(xué)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目:Projectl:Movierecommendedsystem.實(shí)驗(yàn)內(nèi)容來(lái)自1682部電影943位用戶的100000條評(píng)分?jǐn)?shù)據(jù)。每個(gè)用戶都至少評(píng)價(jià)過20部電孽。用戶和項(xiàng)從1開始連續(xù)編號(hào),數(shù)據(jù)被隨機(jī)排序。數(shù)據(jù)格式是一個(gè)制表符分隔的列表:userid|itemid|rating|timestampo數(shù)據(jù)已經(jīng)被抽樣分割為train文件和test文件。多次重復(fù)抽樣得到ul.train-u5.train和ul.test?u5.test,以進(jìn)行交叉驗(yàn)證。ul.test-u5.test數(shù)據(jù)不重疊。每個(gè)作為輸入的train文件得到一個(gè)推薦結(jié)果文件ui.res(i=1...5)數(shù)據(jù)格式:userid(制表符)itemid為每個(gè)用戶推薦的條數(shù)不限。提供了test文件,可自行測(cè)試結(jié)果Fl值,按F1值的高低評(píng)價(jià)推薦結(jié)果的好壞。.實(shí)驗(yàn)準(zhǔn)備.弄清題意,了解數(shù)據(jù)集構(gòu)成及含義。.查閱書籍資料,了解推薦系統(tǒng)和數(shù)據(jù)挖掘方面的相關(guān)內(nèi)容。.在PC機(jī)上下載安裝R語(yǔ)言,并學(xué)習(xí)R語(yǔ)言的基本操作。.實(shí)驗(yàn)方法.整體思路:通過預(yù)測(cè)某位用戶U0對(duì)某部電影M0的評(píng)分,分為0-5分,將評(píng)分較高的電影推薦給用戶。首先,選擇用戶U0已經(jīng)給出評(píng)分的n部電影,并獲取這些電影的ID,分別為Ml-Mn;接著,找出對(duì)電影M0已經(jīng)進(jìn)行過評(píng)分的m位用戶,并獲取這些用戶的ID,分別為Ul-Um;然后,利用以上獲取的三組ID,構(gòu)造訓(xùn)練集data_train和測(cè)試集data」est,結(jié)構(gòu)如下所示:7F分電影ID待評(píng)分電影已知評(píng)分電影用 二^;M0Ml Mn待評(píng)分用戶U0測(cè)試集(data_test_y)測(cè)試集(data_test_x)已知評(píng)分用戶U1Un訓(xùn)練集(data_train_y)訓(xùn)練集(data_train_x)最后,將相應(yīng)的訓(xùn)練集與測(cè)試集按順序放入knn()函數(shù),即可預(yù)測(cè)出用戶U0對(duì)電影M0的評(píng)分值。.knn()函數(shù)基本格式:knn(train,test,cl,k=l,1=0,prob二FALSE,use.all=TRUE)knn()函數(shù)默認(rèn)選擇歐氏距離來(lái)尋找所需的K的最近樣本,在可變參數(shù)中,train和test參數(shù)分別代表訓(xùn)練集和測(cè)試集;cl用來(lái)放置訓(xùn)練集中已知類別樣本的類別取值;k為控制最近鄰域大小的參數(shù);1設(shè)置得到確切判別結(jié)果所需滿足的最少票數(shù)。prob控制輸出“勝出”類別的得票比例,比如k=10時(shí),若其中有8個(gè)屬于類別1,2個(gè)屬于類別2,類別1則為“勝出”類別,且prob取TRUE時(shí),可輸出該待判樣本所對(duì)應(yīng)的prob值為8/10=0.8;use.all用于選擇再出現(xiàn)“結(jié)點(diǎn)”時(shí)的處理方式,所謂結(jié)點(diǎn)即指距離待判樣本第K近的已知樣本不止一個(gè),比如己知樣本i和j與待判樣本n的距離相等,都剛好第K近,那么當(dāng)useall默認(rèn)取TRUE時(shí)就將i和j都納入判別過程,這時(shí)n的K近鄰就有K+1個(gè)樣本,若use.all取FALSE,則R軟件會(huì)在i與j中隨機(jī)選出一個(gè)以保證K近鄰中剛好有K個(gè)樣本。knn()函數(shù)需要加載class軟件包才可以運(yùn)行。.數(shù)據(jù)集信息>setwd(nF://R//R-3.2.0//DATA2n)>data=read.table(nul.basen)>head(data);dim(data)VIV2V311152 12 3VIV2V311152 12 313 414 31536 17 4VIV2V311152 12 313 4VIV2V311152 12 313 414 31536 17 4V4874965758876893171878542960876893119889751712875071561[1]80000>1這里我們使用ul.base為例,通過使用R我們將數(shù)據(jù)集ul.base讀入,將其命名為data,并查看數(shù)據(jù)的基本信息,數(shù)據(jù)集data共有4個(gè)變量,正如前面所介紹的分別為用戶ID、電影ID、評(píng)分及時(shí)間戳,共計(jì)8萬(wàn)條數(shù)據(jù),評(píng)分分別為1-5。.數(shù)據(jù)預(yù)處理我們先將data數(shù)據(jù)集的第四列時(shí)間戳去掉,并將其他三列命名data=data[F-4]names(data)=c(nuseridnrnitemidnrnratingn)head(data);dim(data)useriditemidrating111512 3在進(jìn)行構(gòu)造實(shí)驗(yàn)所需數(shù)據(jù)集之前,我們先要提高data數(shù)據(jù)集的質(zhì)量。首先,data數(shù)據(jù)集沒有缺失值問題。為了排除一些噪聲數(shù)據(jù)的干擾,我們將數(shù)據(jù)集中電影ID觀看條目總數(shù)低于10條(包括10)的相關(guān)行刪除。>head(data);dim(data)useriditeiEldrating111521233134414351536174[1]774563這時(shí)data數(shù)據(jù)集里就剩下77456條數(shù)據(jù)了。還考慮過同一用戶對(duì)同一電影多次打分的情況,將其取平均值并只留下這一條信息,處理過后發(fā)現(xiàn)和直接觀察的一樣并沒有存在這樣的情況。.MovieLens_KNN函數(shù)的編寫>MovieLens_KNN(Userid=lrItemid=6rn=50rK=10)MovieLens_KNN函數(shù)用來(lái)預(yù)測(cè)某一用戶對(duì)某部影片的評(píng)分,共有4個(gè)參數(shù),Userid和Itemid即為所要預(yù)測(cè)的用戶ID,即U0和電影ID,即MO;n為我們選擇的預(yù)測(cè)的用戶U0已經(jīng)給出評(píng)分電影的個(gè)數(shù);K為kNN算法中的參與判別最近鄰樣本的個(gè)數(shù)。按照整體思路,我們先來(lái)分別獲取U0、M0及Ml-Mn。對(duì)應(yīng)于代碼中,我
們得到sub表示待預(yù)測(cè)用戶U0在數(shù)據(jù)集中各條信息所在的行標(biāo)簽;sub_n表示隨機(jī)抽出的n個(gè)U0已評(píng)分電影Ml-Mn的行標(biāo)簽;known_itemid表示U0已評(píng)分電影Ml-Mn的電影ID;unknown_itemid表示待預(yù)測(cè)電影M0的ID。+sub=which(data$userid==Userid)+if(length(sub)>=n)sub_n=sample(subrn)+if(length(sub)<n)sub_n=sample(sub,length(sub))+known_itemid=data$itemid[sub_n]+un]cnown_iteniid=Iteniid接著我們我出已經(jīng)對(duì)電影MO做出評(píng)分的用戶,即Ul-Um,將這m位用戶的ID存于user中。+un)cnown_sub=which(data$itemid-un)cnown_iteniid)+user=data$userid[unknown_sub[-1]]然后我們開始構(gòu)造data_all數(shù)據(jù)集,data_all是根據(jù)原始數(shù)據(jù)集data以及參數(shù)設(shè)定值在函數(shù)中新構(gòu)造出的數(shù)據(jù)集,它的結(jié)構(gòu)和上面給出的訓(xùn)練集data_train和測(cè)試集datajest,結(jié)構(gòu)相同。最終放入knn()函數(shù)中的訓(xùn)練集和測(cè)試集都來(lái)自于該data_all數(shù)據(jù)集。data_all數(shù)強(qiáng)集的部分圖如下:$'data_all:Tuseridunknownitemld6itemld95itemld28iteirild220itemld1091234567zc1711234567zc17176181198486524537035二2452O40:'00031r\0,j00003r\3Jj0j300r\50二0301r\第一行數(shù)據(jù)為待評(píng)分用戶(圖中用戶ID為1)、待評(píng)分電影的實(shí)際評(píng)分(圖中電影ID為6,若未觀看過待預(yù)測(cè)的話原始得分自然為0)以及待評(píng)分用戶看過的50部電影的評(píng)分值。從第二行開始,就是對(duì)待評(píng)分電影(ID為6)已經(jīng)進(jìn)行評(píng)分的m位用戶的相應(yīng)信息。根據(jù)data.all的結(jié)構(gòu)進(jìn)行構(gòu)造:設(shè)置data_all的行列數(shù),對(duì)所有值初始為0,將各變量進(jìn)行命名,對(duì)userid變量進(jìn)行賦值:+data_all=matrix(0r1+length(user),2+length(known__item±d))+data_all=data?frame(data_all)+names(data_all)=c(nuseridnrpaste(r,unknown_itemid_n,Itemid)zpaste(nitemid_n$+item=c(unknown_iteniicirknown_izemid)+data_all$userid=c(Useridruser)對(duì)data_all數(shù)據(jù)集的主體部分進(jìn)行賦值,通過兩層循環(huán)實(shí)現(xiàn)。這里有一點(diǎn)要考慮到的是并不是我們所選出的對(duì)電影M0已評(píng)分的m位用戶都對(duì)Ml-Mn這n部電影全都做出了評(píng)分。所有data_all數(shù)據(jù)集中的部分?jǐn)?shù)據(jù)存在缺失,所以使用一條if判斷語(yǔ)句,僅對(duì)data_all中有相應(yīng)取值的位置賦值,缺失的位置取0。+for(iin1:nrow(data_all))+{+ data_temp=data[which(data$userid==data_all$userid[i])r]+for(jin1:length(item))+ {if(sum(as.numeric(data_temp$iteinid=item[j]))!=0)+{data_all[ifj+1]=data_tenLp$rating[which(data_temp$iteniid==itenL[jJ)]}+}}根據(jù)data_alL從中分割出用戶knn()函數(shù)參數(shù)設(shè)置的訓(xùn)練集與測(cè)試集。+data_test_x=data_all[1,c(-1,-2)]+data_test_y=data_all[1,2]+data_train_x=data_all[-1,c(一1,-2)]+data_train_y=data_all[-1,2]最后,將相應(yīng)的部分放入knn()函數(shù)中,并將MovieLens_KNN()中參數(shù)K的值賦給knn()函數(shù)的參數(shù)k。+fit=knn(data_train_xfdata_test_xfcl=data_train_yFJc=K).獲取數(shù)據(jù)集中存在的用戶ID和電影ID我們使用兩層循環(huán)對(duì)每個(gè)用戶對(duì)每部電影進(jìn)行預(yù)測(cè)得分,將未打過分,即真實(shí)得分為0,預(yù)測(cè)得分較高的電影推薦給用戶。為了提高預(yù)測(cè)的準(zhǔn)確度并降低不必要的推薦,我們要獲取data數(shù)據(jù)集中存在的用戶ID和電影ID。在經(jīng)過刪減處理后的data數(shù)據(jù)集中,用戶ID仍是連續(xù)的,這在一定程度上給我們提供了便利,但是電影ID就不是了。針對(duì)data數(shù)據(jù)集中不存在的電影我們是不予以推薦的。user_data=data[-2]user_data=user_data[order(user_data[[1]])Fuser_data=data[-2]user_data=user_data[order(user_data[[1]])F]y=unique(user_data[f1])sub=rep(0rlength(y))for(iin1:length(y))+sub[i]=which(user_data[f1]—y[i])[1]user_data=user_data[subf]head(user_data);dim(user_data)useridrating1 1 5136 2 4176 3 4204 4 4218 5 3309 6 4943 2>user_data[943rl][1]943Item_data=data[-1]Item_data=Item_data[order(Item_data[[1]])f]y=unique(Item_data[F1])sub=rep(0rlength(y))for(iin1:length(y))+sub[i]=which(Iteni_data[,l]=y[i])[1]Item_data=Item_data[subf]head(Item_data);dim(Item_data)itemidrating1 52 33 44 35 31461 6 5[1]1046 2>Item_data[1046f1][1]1483通過將數(shù)據(jù)集data按userid或itemid進(jìn)行排序,并按其獲得唯一性。這里將用戶ID存于變量usejdata中,共有943行數(shù)據(jù),最后一行的用戶ID也為943,證明其是連續(xù)的,可以從1開始一直運(yùn)行到943。將電影ID存于變量item_data中,共有1046行數(shù)據(jù),最后一行的電影ID也為1483,證明其不是連續(xù)的,存在不應(yīng)推薦的電影ID要跳過,就不需要從1開始一直不斷運(yùn)行到1483,避免預(yù)測(cè)不存在的電影。.獲取每個(gè)用戶看過電影的最大和最小ID為了進(jìn)一步提高推薦的準(zhǔn)確性和降低推薦的數(shù)量,由于這里的data數(shù)據(jù)集的特殊性,用戶觀看的電影存在最大值和最小值,并且電影ID具有一定的連續(xù)性或者相差不遠(yuǎn)。按用戶ID和電影ID從小到大排序,可以將推薦縮小到這個(gè)范圍左右。但對(duì)于其他情況(如天池大數(shù)據(jù)競(jìng)賽)可能不太適用,就需要對(duì)所有電影(或其他)進(jìn)行預(yù)測(cè)打分進(jìn)行推薦。A=data[order(data[[1]]A=data[order(data[[1]]F-data[[2]])F]y=unique(A[r1])sub=rep(0flength(y))for(iin1:length(y))+sub[i]=which(A[rl]=y[i])[1]itemMax=A[subf]head(itenil*Iax);dim(itenil-Iax)A=datay=unique(A[F1])sub=rep(0flength(y))for(iin1:length(y))+sub[i]=which[k[r1]=y[i])[1]itemMin=A[subf]head(iteniMin);dim(iteml-Iin)useriditemidrating135127121752311520333553217436253085456141865392[1]9433useriditeirJ.drating11151362141763181420441142185213309614[1]943 3比如用戶ID為3的用戶,最小的電影ID為181,我們就從181開始之后對(duì)電影進(jìn)行預(yù)測(cè)得分然后進(jìn)行推薦。不考慮181之前的,雖然也可能會(huì)遺漏一些電影,但是只是一點(diǎn)點(diǎn),相比可能會(huì)多預(yù)測(cè)推薦的條目,這一點(diǎn)犧牲是值得的。.構(gòu)造結(jié)果集通過對(duì)某一用戶和某一電影使用(例如)MovieLens_KNN(Userid=l,Itemid=6,n=50,K=10)函數(shù)來(lái)進(jìn)行評(píng)分預(yù)測(cè),選擇合適的參數(shù)n和K來(lái)獲取較好的預(yù)測(cè)情況。在真實(shí)得分為。(意味著該用戶沒有看過這個(gè)電影)和預(yù)測(cè)得分較高的情況下,將對(duì)應(yīng)的用戶ID和電影ID添加到結(jié)果集中。4.實(shí)驗(yàn)結(jié)果ul.base推薦結(jié)果與ul.test進(jìn)行比較:D:\計(jì)算廣告學(xué)、評(píng)分程序》jaua-jareua.jarul.testul.resprecision:6.6383657Zrecall:51.370003ZFlscore:0.11757368D:\計(jì)算廣告學(xué)、評(píng)■分程序》jaua-jareua.jarul.testul<2>.resprecision:8.653105Zrecall:12.91ZFlscore:0.10361364圖中ul.res是將預(yù)測(cè)得分為4分和5分的結(jié)果都寫入結(jié)果集,致使結(jié)果集較大,條目較多,所以召回率較高。ul(2).res是只將預(yù)測(cè)得分為5分的結(jié)果寫入結(jié)果集,精確度和召回率比較接近。但因?yàn)榍罢叩腇1得分更高,所以就使用前者作為最終結(jié)果。但是之后的u2.base,u3.base,u4.base,u5,base用戶數(shù)量比ul.base翻了一番,所以將預(yù)測(cè)得分為4分和5分的電影都推薦的話,會(huì)造成推薦數(shù)目太多,精確度和召回率相差懸殊。所以最終使用預(yù)測(cè)得分為5分的電影進(jìn)行推薦。u2.base推薦結(jié)果與u2.test進(jìn)行比較:D:\計(jì)算廣告學(xué)、評(píng)分程序》jaua-jareua.jaru2.testu2.resprecision:7.014284zrecall:12.08zFlscore:0.08875174u3.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人用水協(xié)議書
- 2024版水電清工承包合同范本
- 農(nóng)學(xué)研究之路
- 牛奶盛宴模板
- 2024年生態(tài)環(huán)保型綠化苗木種植承包合同3篇
- 碳金融風(fēng)險(xiǎn)管理合同
- 裝飾材料采購(gòu)合同范本
- 2024標(biāo)準(zhǔn)動(dòng)力煤銷售協(xié)議樣式版B版
- 2024年股東權(quán)益分配協(xié)議:公司內(nèi)部股東分紅規(guī)定
- 2《我向國(guó)旗敬個(gè)禮》(說(shuō)課稿)-2024-2025學(xué)年統(tǒng)編版道德與法治一年級(jí)上冊(cè)
- 電工高級(jí)工練習(xí)題庫(kù)(附參考答案)
- 村里干零工協(xié)議書
- 光伏電站環(huán)境保護(hù)施工方案
- 足浴技師與店內(nèi)禁止黃賭毒協(xié)議書范文
- 銑工高級(jí)工測(cè)試題(含答案)
- 送貨員崗位勞動(dòng)合同模板
- 2024年自然資源部所屬事業(yè)單位招聘(208人)歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 上海南洋模范2025屆高二生物第一學(xué)期期末檢測(cè)模擬試題含解析
- 網(wǎng)絡(luò)與信息安全管理責(zé)任制度
- 《建筑施工安全檢查標(biāo)準(zhǔn)》JGJ59-2019
- 小區(qū)物業(yè)服務(wù)投標(biāo)方案(技術(shù)標(biāo))
評(píng)論
0/150
提交評(píng)論