◆版權聲明:本文出自胖喵~的博客,轉載必須注明出處。
轉載請注明出處:https://www.cnblogs.com/by-dream/p/9016289.html
前言
通常我們在網購的時候會遇到這樣的情況,當我們買了一個物品A后,網站上可能會給你推薦一些和A相似的物品。這樣的推薦就是典型的協同過濾算法,今天就來給大家說說協同過濾算法。
算法概念
協調過濾算法一般有兩種,一種是基於物品的,一種是基於用戶的,基於物品的是itembase,基於用戶的是userbase,簡單來說,基於物品的是當用戶購買了物品A,如果發現A和C的相似度比較高,就給用戶推薦物品C,基於用戶的推薦是如果用戶1和用戶2相似度高,用戶2買了物品A而用戶1沒有買,那么就給用戶1推薦物品A。是不是很好理解。今天我主要說說itembase。
簡單的推薦
剛才講到itembase是根據物品的相似度來進行推薦,那么怎么計算物品的相似度呢?我們看一個簡單的例子。
下面是一個用戶的觀看電影的行為的數據:
上面的表格反應的是:
用戶1看了電影 A、B;
用戶2看了電影 A、C;
用戶3看了電影 A、B、C;
后面的打分我們可以先忽略,因為得分都是一樣的。
那么對於電影來說,被人看過的統計就是
電影A:1、2、3
電影B:1、3
電影C:2、3
這里我們利用jaccard公式(下方)來計算電影A和B的距離:
那么A和B的 jaccard = (A交B)/(A並B) = [1,3] / [1,2,3] = 2/3
后面依次類我們可以算出A、B、C分別和另外兩個jaccard系數。
這個時候,當一個用戶看了電影B ,而我們要決定給他推薦電影A或者C的時候,我們就能很明顯的看出來B和A之間的jaccard系數更大,固推薦電影A。
帶用戶打分權重的推薦
上面的流程中,不知道大家有沒有注意到,我們忽略了一步,那就是用戶對這個電影的打分,我們並沒有用上。而現實生活中很有可能會出現這樣的問題:我看了一個電影A和電影F,我對電影A打分特別低,但是電影A和電影B的相似度非常高,而我看電影F之后,我對電影F的打分相當的高,但是電影F和電影E之間的相似度是一般高(低於電影A和B的相似度),而如果我們還是用上面的算法的話,那么推薦給我的就是電影B了,而事實上我可能更想看的是電影E。那么如何解決這個問題呢,我們繼續看。
這里我得用一個復雜的例子來講解一下,假如我們有如下數據源:
首先第一步,我們需要構造一個item的同現矩陣。
這里講一下同現矩陣的構造方法:
[A, A] 這個地方的值代表的是 A這部電影一共出現了多少次,我們數數可以看到一共是5次,固這里值為5;
[A, B] 和 [B, A] 的值是相同的,代表的是,A和B同時被一個人觀看的次數,我們可以看到用戶1、2、5同時看過A和B電影,固這個值就是3;
[C, G] 類型這樣的就是說,沒有人同時看過C和G這兩部電影。
構造完同現矩陣后,這時候,我們可以得到每一個人的打分,再構造一個評分矩陣,這里為了演示過程,我以用戶4為例。
首先構造評分矩陣,這里需要注意,沒有看過的電影直接記為0即可,即矩陣為:[5, 0, 3, 4.5, 0, 4, 0]
這里我們將 同現矩陣 * 評分矩陣 得到最終的得分矩陣 :
我們看下我標黑的這一列,最終的數值是 3*5+3*0+3*3+2*5+1*0+1*4+0*0 = 38,這一行代表的是B這個電影推薦給用戶4的得分是38,由於我們知道用戶4沒有看過B、E、G,而B的得分是最高的,因此最后我們給B推薦的時候,就會優先推薦B電影。
由於同現矩陣中的數據代表是電影之間的相互權重,固在最終相乘的時候,權重高並且得分高的最終就能得到高分,這也符合推薦相似的且是用戶愛看的電影。