1. 程式人生 > >人工智慧演算法(一)—協同過濾演算法

人工智慧演算法(一)—協同過濾演算法

這是本人第一篇介紹人工智慧演算法的部落格。之前寫的大部分部落格都是為了解決具體問題或者解決問題中的思考。這次想籠統而又概括的去總結一些自己學習的演算法。

廢話少說,進入正題。

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

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

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

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

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

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

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