python簡單推薦系統(tǒng)(含完整代碼)_第1頁
python簡單推薦系統(tǒng)(含完整代碼)_第2頁
python簡單推薦系統(tǒng)(含完整代碼)_第3頁
python簡單推薦系統(tǒng)(含完整代碼)_第4頁
python簡單推薦系統(tǒng)(含完整代碼)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、似乎咱的產(chǎn)品七,八年前就想做個(gè)推薦系統(tǒng)的,就是類似根據(jù)用戶的喜好,自動(dòng) 的找到用戶喜歡的電影或者節(jié)目, 給用戶做推薦??墒沁@么多年過去了,不知道 是領(lǐng)導(dǎo)忘記了還是怎么了,連個(gè)影子還沒見到。而市場上各種產(chǎn)品的都有了推薦系統(tǒng)了。比如常見的各種購物網(wǎng)站京東,亞馬遜, 淘寶之類的商品推薦,視頻網(wǎng)站優(yōu)酷的的類似影片推薦,豆瓣音樂的音樂推 薦一個(gè)好的推薦系統(tǒng)推薦的精度必然很高,能夠真的發(fā)現(xiàn)用戶的潛在需求或喜好, 提高購物網(wǎng)詁的銷量,讓視頻網(wǎng)站發(fā)現(xiàn)用戶喜歡的收費(fèi)電影可是要實(shí)現(xiàn)一個(gè)高精度的推薦系統(tǒng)不是那么容易的,netflix曾經(jīng)懸賞高額獎(jiǎng)金尋找能給其推薦系 統(tǒng)的精確度提高10%的人,可見各個(gè)公司對推薦系統(tǒng)的

2、重視和一個(gè)好的推薦系統(tǒng) 確實(shí)能帶來經(jīng)濟(jì)效益。下面咱以電影電視的推薦系統(tǒng)為例,一步一步的來實(shí)現(xiàn)一個(gè)簡單的推薦系統(tǒng)吧 , 由于比較簡單,整個(gè)推薦系統(tǒng)源碼不到 100行,大概70-80行吧,應(yīng)該很容易掌 握。為了快速開發(fā)原型,咱采用Python代碼來演示1. 推薦系統(tǒng)的第一步,需要想辦法收集信息不同的業(yè)務(wù),不同的推薦系統(tǒng)需要收集的信息不一樣針對咱要做的電影推薦,自然是每個(gè)用戶對自己看過的電影的評價(jià)了,如下圖所示:Kai Zhou對Friends打分是4分,對Bedtime Stories打分是3分,沒有對RoboCop 打分 ShuaiGe沒有對Friends打分,對Bedtime Stories打

3、分是3.5分 為簡單,咱將此數(shù)據(jù)存成csv文件,形成一個(gè)二維的矩陣,假設(shè)存在D:train.csv,數(shù) 據(jù)如下:Name,Friends,Bedtime StoriesQawn of the Planet of theApes,RoboCop,Fargo,Cougar TownKai Zhou,4,3,5,1,2ShuaiGe,3.5,3,4,2.5,4.5MeiNv,3,4,2,3,2,3xiaoxia nrou,2.5,3.5,3,3.5,2.5,3fe ngzhi,3,4,5,3.5,3meinv,4.5,4,1,mi ncat,3,3.5,1.5,5,3.5,3alex,2.5,3,3

4、.5,4先從csv文件中加載二維矩陣,代碼如下:def load_matrix(): matrix = f = ope n("d:trai n. csv")columns = f.readline().split(',')for line in f:scores = lin e.split(',')matrix列名)for i in range(len(scores)1:matrix(scores0,colu mn si)= scoresi.strip("n")returnmatrix = load_matrix()pri

5、 nt "matrix:", matrixload_matrix()解析 csv 文件,返回一個(gè) dictionary,該 dictionary 以(行名, 為索引數(shù)據(jù)有了,下面咱就正式開始干活了,推薦系統(tǒng)要干些什么呢?咱以電影推薦來說,推薦系統(tǒng)需要解決的幾個(gè)主要問題:1) 判斷兩個(gè)電影,兩個(gè)觀影人之間的相似度2) 找到和某影片最相似的影片,或找到和某觀影人有同樣興趣的人3) 找到某觀影人可能喜歡的電影,或找到對某影片感興趣的人2. 推薦系統(tǒng)的基礎(chǔ),判斷相似度針對咱的電影推薦來說,就是判斷兩個(gè)電影,兩個(gè)觀影人之間的相似度。2.1歐幾里德距離計(jì)算相似度最簡單的,最容易理解的就

6、是歐幾里德距離.那么,什么是歐幾里德距離,怎么 用呢?請對比評價(jià)數(shù)據(jù),看下圖:3ty Cougar Town2.5, gW Shuai Ge上護(hù)3 ¥ Mei Nv2J丿 Kai ZhouflFargo5Ith咱用兩個(gè)電影Fargo和CougrTown來取例 圖中X軸代表電影Fargo,Y軸代表 電影CougrTown, Kai Zhou給電影Fargo打1分,CougrTown打2分,畫到圖 上同理,咱可以將ShuaiGe和Mei Nv的數(shù)據(jù)點(diǎn)都畫到圖上 很明顯,咱可以看出 Kai Zhou與Mei Nv離得近,與ShuaiGe離得遠(yuǎn),所以說Kai Zhou與Mei Nv的 興趣更

7、相近.用數(shù)學(xué)式子表達(dá)出來就是:Kai Zhou 與 Mei Nv 的距離的平方:(2 -1)A2 + (3 -2)A2 = 2Kai Zhou 與 ShuaiGe 的距離的平方:(2.5 -1)八2 + (4.5 -2)八2 = 8.52 < 8.5,所以Kai Zhou與Mei Nv比ShuaiGe興趣更近.這就是利用歐幾里得 距離來判斷相似度 兩個(gè)用戶對所有電影的評價(jià)相似度的和,就是兩用戶的相似 度2.2歸一化處理為了方便比較處理后的數(shù)據(jù),一般還需要對計(jì)算出來的結(jié)果進(jìn)行歸一化處理。數(shù)據(jù)標(biāo)準(zhǔn)化(歸一化)處理是數(shù)據(jù)挖掘的一項(xiàng)基礎(chǔ)工作, 不同評價(jià)指標(biāo)往往具有 不同的量綱和量綱單位,這樣的情

8、況會(huì)影響到數(shù)據(jù)分析的結(jié)果, 為了消除指標(biāo)之 間的量綱影響,需要進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化處理,以解決數(shù)據(jù)指標(biāo)之間的可比性。原始數(shù)據(jù)經(jīng)過數(shù)據(jù)標(biāo)準(zhǔn)化處理后,各指標(biāo)處于同一數(shù)量級(jí),適合進(jìn)行綜合對比評 價(jià)。上面的介紹太學(xué)術(shù)化了吧,不容易懂,我的理解:歸一化化就是要把你需要處理 的數(shù)據(jù)經(jīng)過處理后(通過某種算法)限制在你需要的一 定范圍內(nèi)。簡單的說,我們希望,處理后的數(shù)據(jù)取值范圍在0-1之間.在數(shù)學(xué)上有很多歸一化處理的方法常用的有1) min-max 標(biāo)準(zhǔn)化(Min-Max Normalization )也稱為離差標(biāo)準(zhǔn)化,是對原始數(shù)據(jù)的線性變換,使結(jié)果值映射到0 -1之間。2) Z-score標(biāo)準(zhǔn)化方法這種方法給予原

9、始數(shù)據(jù)的均值(mear)和標(biāo)準(zhǔn)差(standarddeviation)進(jìn)行數(shù)據(jù) 的標(biāo)準(zhǔn)化。經(jīng)過處理的數(shù)據(jù)符合標(biāo)準(zhǔn)正態(tài)分布,即均值為0,標(biāo)準(zhǔn)差為1咱可以根據(jù)需要選擇,不過,針對咱這系統(tǒng)采用的是歐幾里德距離,咱可以用下面的更簡單的公式:假設(shè)計(jì)算出來的歐幾里德距離為:n1 /(1 + n)當(dāng)距離為0,歸一化后的值為:1距離越大,歸一化后的值越接近 0有了上面的基礎(chǔ)知識(shí)之后,下面的代碼就水到渠成了def sim_distance(matrix, row1, row2):columns = set(map(lambda l: l1, matrix.keys()si = filter(lambda l:

10、matrix.has_key(row1, l) and matrix(row1, l)!= "" and matrix.has_key(row2, l) and matrix(row2, l)!="",colum ns)if len(si) = 0: return 0sum_of_dista nee = sum(pow(float(matrix(row1,colu mn)-float(matrix(row2,column),2) for column in si)return 1 / (1 + sqrt(sum_of_distanee) print si

11、m_distance(matrix, "Kai Zhou", "Shuai Ge")3) 找到和和某觀影人有同樣興趣的人,某影片最相似的影片 a有了上面的代碼,找到和某用戶有同樣興趣的人,就非常簡單了。只要將某用 戶和其它所有用戶的相似度計(jì)算出來,排下序就行了。def top_matches(matrix, row, similarity=sim_distanee):rows = set(map(lambda l: l0, matrix.keys()scores = (similarity(matrix,row, r), r) for r in rows

12、 if r != rowscores.sort()scores.reverse()retur n scoresperson = "Kai Zhou"print "top match for:",personprint top_matches(matrix,pers on)b.找到和某影片相似的影片,這個(gè)需要稍微變化下。咱的輸入數(shù)據(jù)是以用戶為 行數(shù)據(jù),影片為列數(shù)據(jù),只要改成以影片為行數(shù)據(jù),用戶為列數(shù)據(jù),一樣的調(diào)用。所以需要一個(gè)函數(shù),將矩陣轉(zhuǎn)置def transform(matrix):rows = set(map(lambda l: l0, matrix.

13、keys()columns = set(map(lambda l: l1, matrix.keys()tran sform_matrix = for row in rows:for column in columns:tran sform_matrix(colu mn,row) = matrix(row, colum n)return tran sform_matrix找到和Friends相似的影片:tran s_matrix= tran sform(matrix)pri nt"tra ns:",tran s_matrixfilm = "Friends"

14、print "top match for:",filmprinttop_matches(tra ns_matrix,film) 4.找到某觀影人可能喜歡的電影,找到對某影片感興趣的人最理想的是找到兩個(gè)相似度一樣的人,可以認(rèn)為某個(gè)人喜歡的電影,另外那個(gè)也喜歡。但是這樣有它的缺點(diǎn),比較好的辦法是把所有人的數(shù)據(jù)都用上,方法如 下:1.先計(jì)算所有人和Kai Zhou的相似度2.對于Kai Zhou沒有看過,沒有評 分,而其它人有評分的的影片,將其評分與相似度相乘,得到的值再除以相似 度之和3.排序 咱先以給Kai Zhou推薦影片為例來說明,DawnofthePlanetof th

15、e Apes和RoboCop這兩部影片Kai Zhou都沒有看,我們該推薦他看哪部呢? 假設(shè)我們計(jì)算出來Kai Zhou與其它人的相似度如下:(0.3333333333333333, MeNv'),(0.29429805508554946, xiaoxianrou '),(0.2857142857142857, alex '),(0.2553967929896867, min cat '),(0.252650308587072, ShuGe'),(0.2474401533514073, fengzhi ')即 Kai Zhou 與 Mei Nv

16、相似度為 0.3333333333333333,與 xiaoxiaorou 相似度為 0.29429805508554946,其它類似 那么計(jì)算 Daw nofthePla net of the Apes 對 Kai Zhou的推薦值過程如下:1. 找到 ShuaiGe 對 Daw nofthePla net of the Apes 的評價(jià)值 乘以 ShuaiGe 與 Kai Zhou 的相似度:3 * 0.2526503085870722. 找到 Mei Nv 對 Dawn of the Planetof the Apes 的評價(jià)值 乘以其與 Kai Zhou 的 相似度:2 * 0.333

17、33333333333333. 找到 xiaoxianrou 對 DawnofthePlanetoftheApes的評價(jià)值 乘以其與 Kai Zhou 的相似度:3 * 0.294298055085549464. fe ngzhi 沒有對 Daw nofthePla netoftheApes 評價(jià),不用計(jì)算5. 找到 mincat 對 Daw nofthePla netoftheApes 的評價(jià)值 乘以其與 Kai Zhou 的 相似度:1.5* 0.25539679298968676. alex 沒有對 Daw nofthePla netoftheApes 評價(jià),不用計(jì)算7. 將1, 2,

18、3, 5步的計(jì)算結(jié)果相加得到:3 * 0.252650308587072+ 2 *0.3333333333333333+ 3 * 0.29429805508554946+ 1.5* 0.2553967929896867= 2.69060694716906128. 將1,2,3,5步的參與計(jì)算的人的相似度相加:0.252650308587072+0.3333333333333333+ 0.29429805508554946+ 0.2553967929896867= 1.13567848999564169. 將第7步結(jié)果除以第8步的結(jié)果,就是Daw nofthePla net對Kai Zhou的推

19、薦 值:2.6906069471690612/1.1356784899956416= 2.369162549851047 同樣的方法,計(jì)算出來RoboCop對Kai Zhou的推薦值為 39277923180363326所 以 RoboCop應(yīng)該對 Kai Zhou 的吸引力比 DawnofthePlanetof theApes 更大.代 碼如下:def get_recommendations(matrix,row, similarity=sim_distanee):rows = set(map(lambda l: l0, matrix.keys()columns = set(map(lamb

20、da l:l1, matrix.keys()sum_of_colu mn_sim = sum_of_column = for rin rows:if r = row:con ti nuesim = similarity(matrix,row, r)if sim <= 0:continueforc incolu mns:ifmatrix(r,c) = "": continuesum_of_colum n_sim.setdefault(c.0)sum_of_colum n_simc+= simsum_of_colum n.setdefault(c,0)sum_of_columnc += float(matrix(r, c)* simscores = (sum_of_columnc / sum_of_colum

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論