05機器學習協(xié)同過濾推薦算法與應用_第1頁
05機器學習協(xié)同過濾推薦算法與應用_第2頁
05機器學習協(xié)同過濾推薦算法與應用_第3頁
05機器學習協(xié)同過濾推薦算法與應用_第4頁
05機器學習協(xié)同過濾推薦算法與應用_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、1. CF 協(xié)同過濾推薦算法原理1.1 概述什么是協(xié)同過濾 (Collaborative Filtering, 簡稱 CF)?首先想一個簡單的問題,如果你現(xiàn)在想看個,但你不知道具體看哪部,你會怎么做?大部分的人會問問周圍的朋友,看看最近有什么好看的味比較類似的朋友那里得到推薦。這就是協(xié)同過濾的推薦,而我們一般更傾向于從口思想。協(xié)同過濾算法又分為基于用戶的協(xié)同過濾算法和基于物品的協(xié)同過濾算法1.2 案例需求如下數(shù)據(jù)是各用戶對各文檔的偏好:現(xiàn)在需要基于上述數(shù)據(jù),給 A 用戶推薦一篇文檔用戶/文檔文檔 A文檔 B文檔 C文檔 D用戶 A推薦?推薦?用戶 B用戶 C用戶 D1.3 算法分析1.3.1

2、基于用戶相似度的分析直覺分析:“用戶 A/B”都喜歡物品 A 和物品 B,從而“用戶 A/B”的口味最為相近因此,為“用戶 A”推薦物品時可參考“用戶 B”的偏好,從而推薦 D這種就是基于用戶的協(xié)同過濾算法 UserCF 指導思想1.3.2 基于物品相似度的分析直覺分析:物品組合(A,D)被同時偏好出現(xiàn)的次數(shù)最多,因而可以認為 A/D 兩件物品的相似度最高,從而,可以為選擇了 A 物品的用戶推薦 D 物品這種就是基于物品的協(xié)同過濾算法 ItemCF 指導思想1.4 算法要點1.4.1、指導思想這種過濾算法的有效性基礎在于:1、用戶偏好具有相似性,即用戶可分類。這種分類的特征越明顯,推薦準確率越

3、高2、物品之間具有相似性,即偏好某物品的人,都很可能也同時偏好另一件相似物品1.4.2、兩種 CF 算法適用的場景什么情況下使用哪種算法推薦效果會更好?不同環(huán)境下這兩種理論的有效性也不同,應用時需做相應調(diào)整。a.如豆瓣上的文藝,用戶對其的偏好程度與用戶自身的品位關聯(lián)性較強;適合 UserCFb.而對于電子商務來說,商品之間的內(nèi)在對用戶的行為影響更為顯著。1.5 算法實現(xiàn)總的來說,要實現(xiàn)協(xié)同過濾,需要一下幾個步驟:1收集用戶偏好2找到相似的用戶或物品3計算推薦1.5.1 收集用戶偏好用戶有很多方式向系統(tǒng)提供行介紹:的偏好信息,而且不同的應用也可能大不相同,下面舉例進1.5.2 原始偏好數(shù)據(jù)的預處

4、理v 用戶行為識別/組合在一般應用中,我們提取的用戶行為一般都多于一種,關于如何組合這些不同的用戶行為,比如,可以將用戶行為分為“查看”和“戶 / 物品相似度。”等等,然后基于不同的行為,計算不同的用類似于當當網(wǎng)或者京東給出的“看了 .”了該的人還了 .”,“查看了的人還查v 喜好程度根據(jù)不為反映用戶喜好的程度將它們進行,得到用戶對于物品的總體喜好。一般來說,顯式的用戶反饋比隱式的,但比較稀疏,畢竟進行顯示反饋的用戶是少數(shù);同時相對于“查看”,“”行為反映用戶喜好的程度更大,但這也因應用而異。v 數(shù)據(jù)減噪和歸一化。用戶行為類型特征作用評分顯式整數(shù)量化值0,n可以得到精確偏好投票顯式量化值 0|

5、1可以得到精確偏好轉發(fā)顯式量化值 0|1可以得到精確偏好保存書簽顯式量化值 0|1可以得到精確偏好標記書簽 Tag顯式一些單詞需要進一步分析得到偏好評論顯式一些文字需要進一步分析得到偏好點擊流隱式一組點擊需要進一步分析得到偏好頁面停留時間隱式一組時間信息噪音偏大,不好利用隱式量化值 0|1可以得到精確偏好減噪:用戶行為數(shù)據(jù)是用戶在使用應用過程中產(chǎn)生的,它可能存在大量的噪音和用戶的誤操作,我們可以通過經(jīng)典的數(shù)據(jù)挖掘算法過濾掉行為數(shù)據(jù)中的噪音,這樣可以是我們的分析更加精確。歸一化:如前面講到的,在計算用戶對物品的喜好程度時,可能需要對不同的行為數(shù)據(jù)進行。但可以想象,不為的數(shù)據(jù)取值可能相差很大,比如

6、,用戶的查看數(shù)據(jù)必然比數(shù)據(jù)大的多,如何將各個行為的數(shù)據(jù)統(tǒng)一在一個相同的取值范圍中,從而使得求和得到的總體喜好更加精確,就需要我們進行歸一化處理。最簡單的歸一化處理,就是將各類數(shù)據(jù)除以此類中的最大值,以保證歸一化后的數(shù)據(jù)取值在 0,1 范圍中。v 形成用戶偏好矩陣一般是二維矩陣,一維是用戶列表,另一維是物品列表,值是用戶對物品的偏好,一般是 0,1或者 -1, 1 的浮點數(shù)值。1.5.3 找到相似用戶或物品當已經(jīng)對用戶行為進行分析得到用戶喜好后,我們可以根據(jù)用戶喜好計算相似用戶和物品, 然后基于相似用戶或者物品進行推薦,這就是最典型的 CF 的兩個分支:基于用戶的 CF 和基于物品的 CF。這兩

7、種方法都需要計算相似度,下面我們先看看最基本的幾種計算相似度的方法。1.5.4 相似度的計算相似度的計算,現(xiàn)有的幾種基本方法都是基于向量(Vector)的,其實也就是計算兩個向量的距離,距離越近相似度越大。在推薦的場景中,在用戶 - 物品偏好的二維矩陣中,我們可以將一個用戶對所有物品的偏好作為一個向量來計算用戶之間的相似度,或者將所有用戶對某個物品的偏好作為一個向量來計算物品之間的相似度。CF 的常用方法有三種,分別是歐式距離法、相關系數(shù)法、余弦相似度法。為了測試算法,給出以下簡單的用好偏好數(shù)據(jù)矩陣:行表示三名用戶,列表示三個品牌,對品牌的喜愛度按照 15 增加。(1)距離法就是計算每兩個點的

8、距離,比如 Nike 和 Sony 的相似度 。數(shù)值越小,表示相似度越高。(2)相關系數(shù)兩個變量之間的相關系數(shù)越高,從一個變量去另一個變量的精確度就越高,這是因為相關系數(shù)越高,就意味著這兩個變量的共變部分越多,所以從其中一個變量的變化就可越多地獲知另一個變量的變化。如果兩個變量之間的相關系數(shù)為 1 或-1,那么你完全可由變量 X 去獲知變量 Y 的值。當相關系數(shù)為 0 時,X 和 Y 兩變量無關系。當X 的值增大,Y 也增大,正相關關系,相關系數(shù)在 0.00 與 1.00 之間當X 的值減小,Y 也減小,正相關關系,相關系數(shù)在 0.00 與 1.00 之間當X 的值增大,Y 減小,負相關關系,

9、相關系數(shù)在-1.00 與 0.00 之間當 X 的值減小,Y 增大,負相關關系,相關系數(shù)在-1.00 與 0.00 之間相關系數(shù)的絕對值越大,相關性越強,相關系數(shù)越接近于 1 和-1,相關度越強,相關系數(shù)越接近于 0,相關度越弱。def OsDistance(vector1, vector2): sqDiffVector = vector1-vector2 sqDiffVector=sqDiffVector*2 sqDistances = sqDiffVector.sum() distance = sqDistances*0.5return distance用戶蘋果小米魅族zhangsan55

10、2Lisi354wangwu125在 python 中用函數(shù) corrcoef 實現(xiàn),具體方法見參考資料(3)余弦相似度通過測量兩個向量內(nèi)積空間的夾角的余弦值來度量它們之間的相似性。0 度角的余弦值是 1, 而其他任何角度的余弦值都不大于 1;并且其最小值是-1。從而兩個向量之間的角度的余弦值確定兩個向量是否大致指向相同的方向。兩個向量有相同的指向時,余弦相似度的值為 1;兩個向量夾角為 90時,余弦相似度的值為 0;兩個向量指向完全相反的方向時,余弦相似度的值為-1。在比較過程中,向量的規(guī)模大小不予考慮,僅僅考慮到向量的指向方向。余弦相似度通常用于兩個向量的夾角小于 90之內(nèi),因此余弦相似度

11、的值為 0 到 1 之間。注:本課程的實戰(zhàn)案例基于相關系數(shù)法實現(xiàn)1.5.3 計算推薦UserCF 基于用戶相似度的推薦計算推薦的過程其實就是 KNN 算法的計算過程ItemCF 基于物品相似度的推薦算法思路1. 構建物品的同現(xiàn)矩陣2. 構建用戶對物品的評分矩陣3. 通過矩陣計算得出推薦結果def cosSim(inA,inB):num = float(inA.T*inB)denom = la.norm(inA)*la.norm(inB) return 0.5+0.5*(num/denom)推薦結果=用戶評分矩陣*同現(xiàn)矩陣實質(zhì):計算各種物品組合的出現(xiàn)次數(shù)2. CF 協(xié)同過濾算法 Python 實

12、戰(zhàn)2.1推薦需求根據(jù)一個用戶對評分的數(shù)據(jù)集來實現(xiàn)基于用戶相似度的協(xié)同過濾算法推薦,相似度的算法采用相關系數(shù)法數(shù)據(jù)樣例如下:用戶 ID:ID:評分:時間1:1193:5:9783007601:661:3:9783021091:914:3:9783019681:3408:4:9783002751:2355:5:9788242911:1197:3:9783022681:1287:5:9783020391:2804:5:9783007191:594:4:9783022681:919:4:9783013682.2 算法實現(xiàn)本案例使用的數(shù)據(jù)分析包為 pandas,Numpy 和matplotlib2.2.

13、1 數(shù)據(jù)規(guī)整首先將評分數(shù)據(jù)從 ratings.dat 中讀出到一個 DataFrame里:ratings 表中對我們有用的僅是 user_id、movie_id 和 rating 這三列,因此出,放到一個以 user 為行,movie 為列,rating 為值的表 data 里面。這三列取可以看到這個表相當?shù)孟∈?,填充率大約只有 5%,接下來要實現(xiàn)推薦的第一步是計算 user data = ratings.pivot(index=user_id,columns=movie_id,values=rating)#形成一個表 data:5 import pandas as pd from panda

14、s import Series,DataFrame rnames = user_id,movie_id,rating,timestamp ratings = pd.read_table(rratings.dat,sep=:,header=None,names=rnames) ratings:3user_idmovie_idratingtimestamp01119359783007601166139783021092191439783019683 rows x 4 columns之間的相關系數(shù)2.2.2 相關度測算DataFrame 對象有一個很親切的方法:.corr(method=pearso

15、n, min_periods=1) 方法,可以對所有列互相計算相關系數(shù)。其中:method 默認為相關系數(shù),min_periods 參數(shù),這個參數(shù)的作用是設定計算相關系數(shù)時的最小樣本量,低于此值的一對列將不進行運算。這個值的取舍關系到相關系數(shù)計算的準確性,因此有必要先來確定 一下這個參數(shù)。min_periods 參數(shù)測定2.2.3測定這樣一個參數(shù)的基本方法:v 統(tǒng)計在 min_periods 取不同值時,相關系數(shù)的標準差大小,越小越好;但同時又要考慮到,我們的樣本空間十分稀疏,min_periods 定得太高會導致出來的結果集太小,所以只能選定一個折中的值。這里我們測定評分系統(tǒng)標準差的方法為:

16、v 在 data 中挑選一對重疊評分最多的用戶,用他們之間的相關系數(shù)的標準差去對整體標準差做點估計。在此前提下對這一對用戶在不同樣本量下的相關系數(shù)進行統(tǒng)計,觀察其標準差變化。首先,要找出重疊評分最多的一對用戶。我們新建一個以 user 為行列的方陣 foo,然后挨個填充不同用戶間重疊評分的個數(shù):這段代碼特別費時間,因為最后一行語句要執(zhí)行 4000*4000 = 1600 萬遍;找到的最大值所對應的行列分別為424 和4169,這兩位用戶之間的重疊評分數(shù)為998:把 424 和 4169 的評分數(shù)據(jù)單獨拿出來,放到一個名為 test 的表里,另外計算了一下這兩個用戶之間的相關系數(shù)為 0.456,

17、還算不錯,另外通過柱狀圖了解一下他倆的評分分布情 for i in foo.index:foo.ixi,i=0#先把對角線的值設為 0 ser = Series(np.zeros(len(foo.index) for i in foo.index:seri=fooi.max()#計算每行中的最大值 ser.idxmax()#返回 ser 的最大值所在的行號4169 ser4169#取得最大值998 foofoo=9984169.dropna()#取得另一個 user_id 4244169Name: user_id, dtype: float64 foo = DataFrame(np.empty

18、(len(data.index),len(data.index),dtype=int),index=data.index,columns=data.index)#print(empt.shape): (6040, 6040) for i in foo.index:for j in foo.columns:foo.ixi,j = data.ixidata.ixj.notnull().dropna().count()況: data.ix4169.corr(data.ix424) 0.45663851303413217 test = data.reindex(424,4169,columns=dat

19、a.ix4169data.ix424.notnull().dropna().index) testmovie_id2610111217 .424444415 .4169344425 . test.ix424.value_counts(sort=False).plot(kind=bar) test.ix4169.value_counts(sort=False).plot(kind=bar)對這倆用戶的相關系數(shù)統(tǒng)計,我們分別隨機抽取 20、50、100、200、500 和 998 個樣本值,各抽 20 次。并統(tǒng)計結果: periods_test = DataFrame(np.zeros(20,7)

20、,columns=10,20,50,100,200,500,998) for i in periods_test.index:for j in periods_test.columns:sample = test.reindex(columns=np.random.permutation(test.columns):j) periods_test.ixi,j = sample.iloc0.corr(sample.iloc1) periods_test:51020501002005009980 -0.3067190.7090730.5043740.3769210.4771400.4269380.

21、45663910.3866580.6075690.4347610.4719300.4372220.4307650.45663920.5074150.5858080.4406190.6347820.4905740.4367990.45663930.6281120.6282810.4523310.3800730.4720450.4442220.45663940.7925330.6415030.4449890.4992530.4264200.4412920.4566395 rows x 7 columns periods_test.describe()102050100200500#998略coun

22、t20.00000020.00000020.00000020.00000020.00000020.000000mean0.3468100.4647260.4588660.4501550.4675590.452448std0.3985530.1817430.1038200.0936630.0364390.029758min-0.4443020.0873700.1923910.2421120.4122910.39987525%0.1745310.3209410.4347440.3756430.4392280.43529050%0.4871570.5252170.4766530.4688500.47

23、25620.44377275%0.6386850.6166430.5198270.5008250.4873890.465787從 std 這一行來看,理想的接近)。min_periods 參數(shù)值應當為 200 左右(標準差和均值、極值最2.2.3 算法檢驗為了確認在 min_periods=200 下本推薦算法的靠譜程度,最好還是先做個檢驗。具體方法為:在評價數(shù)大于 200 的用戶中隨機抽取 1000 位用戶,每人隨機提取一個評價另存到一個數(shù)組里,并在數(shù)據(jù)表中刪除這個評價。然后基于過的數(shù)據(jù)表計算被提取出的1000 個評分的期望值,最后與真實評價數(shù)組進行相關性比較,看結果如何。 check_si

24、ze = 1000 check = check_data = data.copy()#一份 data 用于檢驗,以免篡改原數(shù)據(jù) check_data = check_data.ixcheck_data.count(axis=1)200#濾除評價數(shù)小于 200 的用戶 for user in np.random.permutation(check_data.index):movie = np.random.permutation(check_data.ixuser.dropna().index)0 check(user,movie) = check_data.ixuser,moviecheck_

25、data.ixuser,movie = np.nan check_size -= 1if not check_size: break corr = check_data.T.corr(min_periods=200) corr_clean = corr.dropna(how=all) corr_clean = corr_clean.dropna(axis=1,how=all)#刪除全空的行和列 check_ser = Series(check)#這里是被提取出來的 1000 個真實評分max0.8509630.7090730.5920400.6347820.5460010.5134868 ro

26、ws x 7 columns接下來要基于 corr_clean 給 check_ser 中的 1000 個用戶-影片對計算評分期望。計算方法為:對與用戶相關系數(shù)大于 0.1 的其他用戶評分進行平均,相關系數(shù) result = Series(np.nan,index=check_ser.index) for user,movie in result.index:#這個循環(huán)很亂,實際內(nèi)容就是平均而已prediction = if user in corr_clean.index:corr_set = corr_cleanusercorr_cleanuser0.1.dropna()#僅限大于 0.1

27、 的用戶else:continuefor other in corr_set.index:if not np.isnan(data.ixother,movie) and other != user:#注意 bool(np.nan)=True prediction.append(data.ixother,movie,corr_setother)if prediction:result(user,movie) = sum(value*weight for value,weight in prediction)/sum(pair1 for pair inprediction) resuropna(i

28、nplace=True) len(result)#隨機抽取的 1000 個用戶中也有被 min_periods=200 刷掉的862 result:5 check_ser:5 (15, 593)4(23, 555)3(33, 3363)4(36, 2355)5(53, 3605)4dtype: float64862 的樣本量能達到 0.436 的相關系數(shù),應該說結果還不錯。如果一開始沒有濾掉評價數(shù)小于 200 的用戶的話,那么首先在計算 corr 時會明顯感覺時間變長,其次 result 中的樣本量會很小,大約 200+個。但因為樣本量變小的緣故,相關系數(shù)可以提升到 0.50.6 。另外從期望

29、與實際評價的差的絕對值的統(tǒng)計量上看,數(shù)據(jù)也比較理想。2.2.4 實現(xiàn)推薦在上面的檢驗,尤其是平均的部分做完后,推薦的實現(xiàn)就沒有什么新東西了。首先在原始未的 data 數(shù)據(jù)上重做一份 corr 表:(23, 555)3.967617(33, 3363)4.073205(36, 2355)3.903497(53, 3605)2.948003(62, 1488)2.606582dtype: float64 result.corr(check_ser.reindex(result.index) 0.436227437429696 (result-check_ser.reindex(result.ind

30、ex).abs().describe()#推薦期望與實際評價之差的絕對值count862.000000mean0.785337std0.605865min0.00000025%0.29038450%0.68603375%1.132256max3.629720dtype: float64我們在 corr_clean 中隨機挑選一位用戶為他做一個推薦列表:最后的任務就是填充這個 gift: corr_lucky = corr_cleanlucky.drop(lucky)#lucky 與其他用戶的相關系數(shù) Series,不包含 lucky自身 corr_lucky = corr_luckycorr_

31、lucky0.1.dropna()#篩選相關系數(shù)大于 0.1 的用戶 for movie in gift.index:#遍歷所有 lucky 沒看過的prediction = for other in corr_lucky.index:#遍歷所有與 lucky 相關系數(shù)大于 0.1 的用戶if not np.isnan(data.ixother,movie):prediction.append(data.ixother,movie,corr_cleanluckyother) if prediction:giftmovie = sum(value*weight for value,weight

32、in prediction)/sum(pair1 for pair inprediction) gift.dropna().order(ascending=False)#將 gift 的非空元素按降序排列movie_id32455.00000029305.00000028305.000000 lucky = np.random.permutation(corr_clean.index)0 gift = data.ixlucky gift = giftgift.isnull()#現(xiàn)在 gift 是一個全空的序列 corr = data.T.corr(min_periods=200) corr_c

33、lean = corr.dropna(how=all) corr_clean = corr_clean.dropna(axis=1,how=all)25695.00000017955.0000009815.0000006965.0000006825.0000006665.0000005725.00000014205.00000033384.8453316694.6604642144.65579834104.624088.28331277712039117731172011692115381143011311111641843166013、CF 協(xié)同過濾算法補充3.1、計算距離的數(shù)學公式距離(Euclidean Distance)最初用于計算空間中兩個點的距離,假設 x,y 是 n的兩個點,它們之間的距離是:可以看出,當 n=2 時,距離就是平面上兩個點的距離。當用距離表示相似度,一般采用以下公式進行轉換:距離越小,相似度越大相關系數(shù)(Pearson

溫馨提示

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