數據挖掘算法(一)—協同過濾算法

這是本人第一篇介紹數據挖掘算法的博客。之前寫的大部分博客都是爲了解決具體問題或者解決問題中的思考。這次想籠統而又概括的去總結一些自己學習的算法。

廢話少說,進入正題。

一、什麼是協同過濾算法?

協同過濾算法,英文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、“過濾”

過濾是個很簡單的過程,繼續用電影爲例。假設判斷我和某個用戶相似,那麼說明我們共同看過一些電影,同時也有一些我們看了但是不相同的電影。那麼把他看過我沒看過的推薦給我。

當然我們要設定一個數量,來確認相似度排名前多少個算相似用戶。不同的取值推薦效果會有影響。

三、如果看待協同過濾算法

協同過濾最大的優勢,就是幾乎可以用於任何領域,這主要是取決於協同過濾本身就不是一個固定的解決方案。而是一種數學思維,正如之前寫到的,只要確定好怎麼樣算得上是相似,那就能進行過濾。

反過來說,在使用協同過濾的時候我們可以通過不同的角度去實驗,並且結合其他的算法。我們在計算相似度的時候,需要一個數值來代表個體對某個項目的“態度”,在電影推薦系統中我們直接用評分來代表態度。但實際上評分不只是態度的體現,態度也不只是用評分來決定。我們可以看出相似度計算其實是協同過濾的核心,怎麼來確定這個核心數值也是一個很值得研究的問題。同時我們就能引出其他算法,例如模糊聚類、遺傳算法等等。這些問題在之後我還會繼續研究。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章