1.基於內容的推薦
對於基於內容的推薦不多贅述,只說下基本的概念,根據使用者已經評分且喜歡(評分高)的電影,為使用者推薦和他過去喜歡的電影相似的電影,這裡的相似就要依據電影的"內容"來計算了,例如電影的型別等等。
利用到評分**上,就是對於目標使用者a和電影m,從a已經評價過的電影中找到與m相似的電影,利用這些電影的評分來**使用者a對m的評分。
2.協同過濾
協同過濾演算法主要分為基於使用者的協同過濾演算法和基於專案的協同過濾演算法。
基於使用者的協同過濾通俗的來說呢,就是對於待**的目標使用者a及電影m,找到與a相似的且評價過m的使用者,利用這些使用者對m的評分來**使用者a對m的評分。
基於專案的協同過濾呢,可以看作是基於使用者的協同過濾的對偶(暫且這麼說吧)。對於待**的目標使用者a及電影m,基於專案的協同過濾就是在a已評價過的電影中找到與m相似的那些電影,利用這些電影的評分來**使用者a對電影m的評分。看到這兒,你似乎很難理解基於內容的推薦和item-based cf的區別,事實上,它們的區別也確實很小,最關鍵性的區別就是:相似性的計算時,基於內容的推薦沒有利用到使用者資訊,而item-based cf利用了使用者資訊,item-based cf計算兩個電影m1和m2的相似性的時候,是依據使用者對m1和m2的打分來計算的,例如使用者a1、a2、a3對m1評分為3,3,3,使用者a1、a2、a3對m2評分為3,4,3,那麼m1和m2之間的相似度就是利用(3,3,3)和(3,4,3)來計算的(可用歐氏距離、余弦相似、皮爾森相似)。
3.user-based演算法實現
整個程式是小組多個人一起做的,我做的是user-based這部分,**是c++寫的,訓練資料有200多m,所以一般的pc就別浪費時間跑完整資料了,我們是放在伺服器上跑的,程式也容易修改,**比較長。下面說說我的程式得思想。
演算法思想:
假設需要**使用者a對電影m的評分,首先對於電影m,根據訓練資料集找出已經對電影m評過分的使用者,然後計算a和這些使用者之間的相似度,依據相似度和這些使用者對m的評分,來**使用者a對電影m的評分。
根據訓練資料集找出已經對電影m評過分的使用者很容易,**結果的好壞關鍵在於如何計算使用者a和這些使用者之間的相似度,以及採用何種方式來利用相似度和評分**出使用者a對電影m的評分。
1)相似度計算
已知電影1、2、3、4、5的風格如** 1:
action
adventure
comedy
crime
drama
fantasy
romance
thriller
war1√
√√√√
2√√√
√3√√
4√√√
5√√√
** 1 電影風格
假設使用者a評價過的電影有1、3、4,使用者b評價過的電影有1、2、5:
action
adventure
comedy
crime
drama
fantasy
romance
thriller
war1√
√√√√
2√√√
√3√√
4√√√
5√√√
** 2 使用者a所選電影
action
adventure
comedy
crime
drama
fantasy
romance
thriller
war1√
√√√√
2√√√
√3√√
4√√√
5√√√
** 3 使用者b所選電影
於是使用者a和使用者b的型別表示為:
action
adventure
comedy
crime
drama
fantasy
romance
thriller
wara2
1211
111b
1221
1212
** 4 使用者a和b的型別表示
計算a和b的相似度時,只選取a、b均有值的型別,對於沒有同時有值的型別不參與計算:
action
adventure
crime
drama
fantasy
romance
thrillera2
1211
11b1
2112
12** 5 實際有效的a和b型別維度
至於相似度的計算方法,可採取:
計算過程中特殊情況簡化處理:
2)評分**
**分的計算過程如下:
首先,對於待**的user::movie,找出評價過movie的使用者users[s]。
然後,計算user與這些使用者之間的相似度sim(u,i)。
最後,利用
**使用者u對電影m的評分
3)特殊情況處理
4)資料結構及程式流程圖
資料結構說明:
//用於訪問使用者基本資訊,對應userid, movieid, score
vectorlong, float> > users(80000);
//使用者型別,用於計算相似度,對應userid, type, type的權值
vectorlong> > users_type(80000);
//用於儲存待測試使用者的資訊,包括userid, movieid, 實際score, **score
vectorlong, pair > > users_test(80000);
map > users_sim; //用於儲存兩個使用者之間的相似度
map movies; //用於儲存電影的type
map > movie_users; //用於儲存看過某個電影的使用者
主程式流程圖:
圖 2 程式主體流程圖
相似度計算函式流程圖(本來打算採取空間換時間效率的策略,訪問計算過的使用者間的相似度,但是發現空間消耗太大,伺服器無法跑):
圖 3 相似度計算流程圖
5)rmse
相似計算方法
rmse
歐幾里得距離
0.978840
余弦相似
0.979142
皮爾森相似
0.977616
**和資料(**並沒有採取空間換時間策略,因為空間消耗真的不是一般的大,大概十幾g,程序會被kill):
資料該放在哪,具體看**的main函式裡面,自己改改路徑,想放哪都行。
協同過濾推薦演算法 協同過濾推薦演算法總結
推薦演算法具有非常多的應用場景和商業價值,因此對推薦演算法值得好好研究。推薦演算法種類很多,但是目前應用最廣泛的應該是協同過濾類別的推薦演算法,本文就對協同過濾類別的推薦演算法做乙個概括總結,後續也會對一些典型的協同過濾推薦演算法做原理總結。推薦演算法概述 1 基於內容的推薦 這一類一般依賴於自然語...
推薦演算法之協同過濾
舉例 以推薦使用者電影為例,假設有100w使用者,10w電影,使用者的id為uid1,uid2,uid3.電影的id為mid1,mid2,mid3.1 畫 橫座標表示所有電影,縱座標表示所有使用者,交叉點為某個使用者喜歡某部電影 mid1 mid2 mid3 mid4 mid5 mid10w uid...
推薦系統之協同過濾
協同過濾 collaborative filtering,簡稱cf 是目前最為流行的推薦演算法,它是根據具有相同興趣與生活經驗的群體的共同愛好推薦與使用者需求相符合的商品。在推薦過程中 cf演算法首先將使用者對於專案的評分矩陣作為輸入,輸入資料通過 cf 演算法計算出使用者或者專案的相似度,生成推薦...