這是本人第一篇介紹數據挖掘算法的博客。之前寫的大部分博客都是爲了解決具體問題或者解決問題中的思考。這次想籠統而又概括的去總結一些自己學習的算法。
廢話少說,進入正題。
一、什麼是協同過濾算法?
協同過濾算法,英文Collaborative Filtering。這個名詞的意思有兩層,首先過濾很好理解,過濾就是爲了在一大堆信息中過濾出想要的信息。協同的意思就是利用社羣的作用,不同個體之間相互協作來進行過濾。
因爲最開始是用來過濾電子郵件的算法,根據用戶自己選擇的喜好來發送儘可能精確的信息(用戶想看到的)。後來,goruplens對其有了革命性的應用。grouplens甚至不需要用戶選擇自己的喜好而是根據用戶過往的記錄來判斷。當然,無法人工的去設定“喜歡”這個界限,什麼樣的行爲纔算是“喜歡”?於是,他們引入了“協同”。兩個行爲模式相似的人,興趣愛好也一樣。這就是最開始的假設,這個假設一直沿用到現在,無論是電影,電商平臺,搜索引擎都是沿用這個假設。
總而言之,協同過濾可以大體分爲兩步:
1、“協同”:尋找個體在羣體中相似個體,相似個體我們稱之爲鄰居。
2、“過濾”:根據某個體的鄰居的行爲,猜測該個體的未來行爲。
二、協同過濾的具體流程
1、具體怎麼“協同”?
第一步,我們需要確定我們依照什麼來確定個體之間的相似。
例如,電影推薦中我們根據電影評分、在電商推薦系統中我們也許通過評論,打星,是否分享推薦、在新聞推薦時也許通過用戶在新聞瀏覽界面停留了多久等等。也就是說,我們要確立的是一個假設。假設兩個個體的XX行爲和屬性相似,那麼這兩個個體相似。
確定了假設之後,就需要計算。我們需要將假設數字化才能計算。拿電影來舉例子,如果對電影只有喜歡和不喜歡兩種態度。那麼可以設定喜歡就是1不喜歡就是0。假設還有個中等選項,也許就有0、1、2三種標準。我們需要的就是數字量化用戶對電影的態度。籠統的說,量化個體的某個屬性。
第二步,尋找相似度高的個體。
習慣上我們把兩兩相似度高的個體稱爲“鄰居”。尋找鄰居的方法很多,不過都有一個共同點,那就是把個體想像成一個高維空間的向量。我們把個體的各個屬性設定成向量的各個維度。
繼續拿電影舉例,例如:用戶X對10部電影評分 X[1,4,5,3,2,5,1,2,3,4]。用戶Y同樣 Y[4,3,2,1,5,2,3,5,4,1]。
這樣就建立了兩個用戶的評分向量,這個便是10維向量。當我們有了每個用戶的向量之後就可以計算他們之間的“相似度”了。
“相似度”計算方法很多,常用歐氏距離、餘弦相似度、皮爾遜係數(實際上皮爾遜是餘弦相似度的去中心化,這裏不細講)等等。往往這些相似度計算,可以想像成兩個點(兩個個體)計算距離(歐氏距離),或者是兩個向量計算夾角(餘弦相似度)。
這樣我們計算每兩個個體之間的相似度,n個用戶計算次數爲:1+2+3+........+(n-1)次。時間複雜度大概是n^2。不過如果我們考慮到維度的話,假設有m個維度,每次計算就需要m次那麼實際時間複雜度爲n^2*m。
2、“過濾”
過濾是個很簡單的過程,繼續用電影爲例。假設判斷我和某個用戶相似,那麼說明我們共同看過一些電影,同時也有一些我們看了但是不相同的電影。那麼把他看過我沒看過的推薦給我。
當然我們要設定一個數量,來確認相似度排名前多少個算相似用戶。不同的取值推薦效果會有影響。
三、如果看待協同過濾算法
協同過濾最大的優勢,就是幾乎可以用於任何領域,這主要是取決於協同過濾本身就不是一個固定的解決方案。而是一種數學思維,正如之前寫到的,只要確定好怎麼樣算得上是相似,那就能進行過濾。
反過來說,在使用協同過濾的時候我們可以通過不同的角度去實驗,並且結合其他的算法。我們在計算相似度的時候,需要一個數值來代表個體對某個項目的“態度”,在電影推薦系統中我們直接用評分來代表態度。但實際上評分不只是態度的體現,態度也不只是用評分來決定。我們可以看出相似度計算其實是協同過濾的核心,怎麼來確定這個核心數值也是一個很值得研究的問題。同時我們就能引出其他算法,例如模糊聚類、遺傳算法等等。這些問題在之後我還會繼續研究。