推薦系統演算法合集,滿滿都是乾貨(建議收藏)

七月線上實驗室發表於2018-07-23
640?wx_fmt=gif

點選藍字關注我們,小七等你好久嘍


640?wx_fmt=jpeg

推薦引擎演算法學習導論:

協同過濾、聚類、分類


引言

    昨日看到幾個關鍵詞:語義分析,協同過濾,智慧推薦,想著想著便興奮了。於是昨天下午開始到今天凌晨3點,便研究了一下推薦引擎,做了初步瞭解。日後,自會慢慢深入仔細研究(日後的工作亦與此相關)。當然,此文也會慢慢補充完善。

    本文作為對推薦引擎的初步介紹的一篇導論性的文章,將略去大部分的具體細節,側重用最簡單的語言簡要介紹推薦引擎的工作原理以及其相關演算法思想,且為了著重淺顯易懂有些援引自本人1月7日在微博上發表的文字(特地整理下,方便日後隨時翻閱),儘量保證本文的短小。不過,事與願違的是,文章後續補充完善,越寫越長了。

    同時,本文所有相關的演算法都會在日後的文章一一陸續具體闡述。本文但求微言導論,日後但求具體而論。若有任何問題,歡迎隨時不吝賜教或批評指正。謝謝。


640?wx_fmt=jpeg

1

推薦引擎原理

推薦引擎盡最大努力的收集儘可能多的使用者資訊及行為,所謂廣撒網,勤捕魚,然後“特別的愛給特別的你”,最後基於相似性的基礎之上持續“給力”,原理如下圖所示(圖引自本文的參考資料之一:探索推薦引擎內部的祕密):

640?wx_fmt=jpeg


640?wx_fmt=jpeg

2

推薦引擎的分類

推薦引擎根據不同依據如下分類:


1、根據其是不是為不同的使用者推薦不同的資料,分為基於大眾行為(網站管理員自行推薦,或者基於系統所有使用者的反饋統計計算出的當下比較流行的物品)、及個性化推薦引擎(幫你找志同道合,趣味相投的朋友,然後在此基礎上實行推薦);


2、根據其資料來源,分為基於人口統計學的(使用者年齡或性別相同判定為相似使用者)、基於內容的(物品具有相同關鍵詞和Tag,沒有考慮人為因素),以及基於協同過濾的推薦(發現物品,內容或使用者的相關性推薦,分為三個子類,下文闡述);


3、根據其建立方式,分為基於物品和使用者本身的(使用者-物品二維矩陣描述使用者喜好,聚類演算法)、基於關聯規則的(The Apriori algorithm演算法是一種最有影響的挖掘布林關聯規則頻繁項集的演算法)、以及基於模型的推薦(機器學習,所謂機器學習,即讓計算機像人腦一樣持續學習,是人工智慧領域內的一個子領域)。


 關於上述第二個分類(2、根據其資料來源)中的基於協同過濾的推薦:隨著 Web2.0 的發展,Web 站點更加提倡使用者參與和使用者貢獻,因此基於協同過濾的推薦機制因運而生。它的原理很簡單,就是根據使用者對物品或者資訊的偏好,發現物品或者內容本身的相關性,或者是發現使用者的相關性,然後再基於這些關聯性進行推薦。


而基於協同過濾的推薦,又分三個子類

1、基於使用者的推薦(通過共同口味與偏好找相似鄰居使用者,K-鄰居演算法,你朋友喜歡,你也可能喜歡),

2、基於專案的推薦(發現物品之間的相似度,推薦類似的物品,你喜歡物品A,C與A相似,可能也喜歡C),

3、基於模型的推薦(基於樣本的使用者喜好資訊構造一個推薦模型,然後根據實時的使用者喜好資訊預測推薦)。


我們看到,此協同過濾演算法最大限度的利用使用者之間,或物品之間的相似相關性,而後基於這些資訊的基礎上實行推薦。下文還會具體介紹此協同過濾。


    不過一般實踐中,我們通常還是把推薦引擎分兩類:

• 第一類稱為協同過濾,即基於相似使用者的協同過濾推薦(使用者與系統或網際網路互動留下的一切資訊、蛛絲馬跡,或使用者與使用者之間千絲萬縷的聯絡),以及基於相似專案的協同過濾推薦(盡最大可能發現物品間的相似度);

• 第二類便是基於內容分析的推薦(調查問卷,電子郵件,或者推薦引擎對本blog內容的分析)。


640?wx_fmt=jpeg

3

新浪微博推薦機制

在新浪微博推薦好友的機制中:

1、我與A非好友,但我的好友中有不少人與A是好友,即我和A有不少共同的好友,那麼系統便會把A也推薦給我(新浪稱之為共同好友);

2、我關注的人中有不少人關注了B,那麼系統推測我也可能會喜歡B,從而亦會把B也推薦給我(新浪稱之為間接關注人)。

    但新浪實際操作起來,這兩種方式會攪在一起,如我關注的人中,有不少人關注了B,但事實上這關注B的不少人中有些也是我的好友。以上推薦方式,統稱為基於相似使用者的協同過濾推薦(無非就是找到:使用者與使用者之間千絲萬縷的聯絡,或是從你的好友入手,或是從你關注的人入手)。

    當然,還有一類比如人氣使用者推薦,便是上文所述的基於大眾行為的推薦,即人云亦云、跟風。系統推測大家都喜歡的,可能你也會喜歡。如大家都知道姚晨新浪微博粉絲數量排第一,則爭相關注,最終粉絲量越推越高。兩種推薦方式如下圖所示:

640?wx_fmt=jpeg

   不過,上述不論是基於使用者的推薦方式,還是基於大眾行為的推薦都並沒有真正尋找到使用者與使用者之間共同的興趣,偏好和口味,因為很多的時候,朋友的朋友不一定能成為你自己的朋友,且有的人清高於世,你們都追求的,我偏不屑。所以,從分析使用者發表的微博的內容相關入手,找到各自共同的關注點、興趣點才是王道。當然新浪微博最近讓使用者選擇給自己發表的微博內容打上標籤,以利於日後尋找微博內容中相關使用者共同的標籤tag,關鍵詞,此種推薦方式正是基於微博內容分析的推薦。如下圖:

640?wx_fmt=jpeg

 

只是問題是,誰會不遺餘力發完微博後,還去給它新增什麼標籤呢?所以,新浪微博還得努力,尋找另一種更好地分析微博內容的方式。不然系統全盤掃描海里使用者的海量微博內容,則恐怕吃不消也負擔不起。

    然個人覺得倒是可以從微博關鍵詞(標籤tag雲)和每個使用者為自己打的標籤(打著越多的共同標籤可定義為相似使用者)入手,如下圖左右部分所示:

640?wx_fmt=jpeg640?wx_fmt=jpeg

 也就是說,通過共同的好友和通過間接關注的人來定義相似使用者是不靠譜的,只有通過基於微博內容的分析尋找相似使用者才是可行之道,同時,更進一步,通過微博內容分析得到標籤tag雲後,再從中找到相同或相近的標籤tag雲尋找相似的使用者無疑比已有推薦好友方式(通過共同的好友和通過間接關注的人來定義相似使用者)更靠譜。


3.1、多種推薦方式結合

    在現行的 Web 站點上的推薦往往都不是單純只採用了某一種推薦的機制和策略,他們往往是將多個方法混合在一起,從而達到更好的推薦效果。

    舉個例子如Amazon中除此基於使用者的推薦之外,還會用到基於內容的推薦(物品具有相同關鍵詞和Tag):如新產品的推薦;基於專案的協同過濾推薦(喜歡A,C與A類似,可能也喜歡C):如捆綁銷售and別人購買/瀏覽的商品。

    總之,多種推薦方式結合,加權(用線性公式(linear formula)將幾種不同的推薦按照一定權重組合起來,具體權重的值需要在測試資料集上反覆實驗,從而達到最好的推薦效果。)、切換、分割槽、分層等混合。但不論是哪種推薦方式,一般也就涵蓋在上文所述的推薦方式中。


640?wx_fmt=jpeg

4

協同過濾推薦

  協同過濾是利用集體智慧的一個典型方法。要理解什麼是協同過濾 (Collaborative Filtering, 簡稱 CF),首先想一個簡單的問題,如果你現在想看個電影,但你不知道具體看哪部,你會怎麼做?大部分的人會問問周圍的朋友或者稱之為廣義上的鄰居(neighborhood),看看最近有什麼好看的電影推薦,而我們一般更傾向於從口味比較類似的朋友那裡得到推薦。這就是協同過濾的核心思想。如下圖,你能從圖中看到多少資訊?

640?wx_fmt=jpeg

4.1、協同過濾推薦步驟


    做協同過濾推薦,一般要做好以下幾個步驟:

1)若要做協同過濾,那麼收集使用者偏好則成了關鍵。可以通過使用者的行為諸如評分(如不同的使用者對不同的作品有不同的評分,而評分接近則意味著喜好口味相近,便可判定為相似使用者),投票,轉發,儲存,書籤,標記,評論,點選流,頁面停留時間,是否購買等獲得。如下面第2點所述:所有這些資訊都可以數字化,如一個二維矩陣表示出來。


2)收集了使用者行為資料之後,我們接下來便要對資料進行減噪與歸一化操作(得到一個使用者偏好的二維矩陣,一維是使用者列表,另一維是物品列表,值是使用者對物品的偏好,一般是 [0,1] 或者 [-1, 1] 的浮點數值)。下面再簡單介紹下減噪和歸一化操作:

所謂減噪:使用者行為資料是使用者在使用應用過程中產生的,它可能存在大量的噪音和使用者的誤操作,我們可以通過經典的資料探勘演算法過濾掉行為資料中的噪音,這樣可以是我們的分析更加精確(類似於網頁的去噪處理)。

所謂歸一化:將各個行為的資料統一在一個相同的取值範圍中,從而使得加權求和得到的總體喜好更加精確。最簡單的歸一化處理,便是將各類資料除以此類中的最大值,以保證歸一化後的資料取值在 [0,1] 範圍中。至於所謂的加權,很好理解,因為每個人佔的權值不同,類似於一場唱歌比賽中對某幾個選手進行投票決定其是否晉級,觀眾的投票抵1分,專家評委的投票抵5分,最後得分最多的選手直接晉級。


3)找到相似的使用者和物品,通過什麼途徑找到呢?便是計算相似使用者或相似物品的相似度。


4)相似度的計算有多種方法,不過都是基於向量Vector的,其實也就是計算兩個向量的距離,距離越近相似度越大。在推薦中,使用者-物品偏好的二維矩陣下,我們將某個或某幾個使用者對莫兩個物品的偏好作為一個向量來計算兩個物品之間的相似度,或者將兩個使用者對某個或某幾個物品的偏好作為一個向量來計算兩個使用者之間的相似度。

        相似度計算演算法可以用於計算使用者或者專案相似度。以專案相似度計算(Item Similarity Computation)為列,通性在於都是從評分矩陣中,為兩個專案i,j挑選出共同的評分使用者,然對這個共同使用者的評分向量,進行計算相似度si,j,如下圖所示,行代表使用者,列代表專案(注意到是從i,j向量中抽出共有的評論,組成的一對向量,進行相似度計算):


640?wx_fmt=png

    所以說,很簡單,找物品間的相似度,使用者不變,找多個使用者對物品的評分;找使用者間的相似度,物品不變,找使用者對某些個物品的評分。


5)而計算出來的這兩個相似度則將作為基於使用者、專案的兩項協同過濾的推薦。


    常見的計算相似度的方法有:歐幾里德距離,皮爾遜相關係數(如兩個使用者對多個電影的評分,採取皮爾遜相關係數等相關計算方法,可以抉擇出他們的口味和偏好是否一致),Cosine相似度,Tanimoto係數。


下面,簡單介紹其中的歐幾里得距離與皮爾遜相關係數:


• 歐幾里德距離(Euclidean Distance)是最初用於計算歐幾里德空間中兩個點的距離,假設 x,y 是 n 維空間的兩個點,它們之間的歐幾里德距離是:

640?wx_fmt=jpeg

   可以看出,當 n=2 時,歐幾里德距離就是平面上兩個點的距離。當用歐幾里德距離表示相似度,一般採用以下公式進行轉換:距離越小,相似度越大(同時,避免除數為0):

640?wx_fmt=jpeg

•  餘弦相似度Cosine-based Similarity
兩個專案 i ,j 視作為兩個m維使用者空間向量,相似度計算通過計算兩個向量的餘弦夾角,那麼,對於m*n的評分矩陣,i ,j 的相似度sim( i , j ) 計算公式:

640?wx_fmt=png

(其中 " · "記做兩個向量的內積)


•  皮爾遜相關係數一般用於計算兩個定距變數間聯絡的緊密程度,為了使計算結果精確,需要找出共同評分的使用者。記使用者集U為既評論了 i 又評論了 j 的使用者集,那麼對應的皮爾森相關係數計算公式為:

640?wx_fmt=png

 其中Ru,i 為使用者u 對專案 i 的評分,對應帶橫槓的為這個使用者集U對專案i的評分評分。


6)相似鄰居計算。鄰居分為兩類:1、固定數量的鄰居K-neighborhoods (或Fix-size neighborhoods),不論鄰居的“遠近”,只取最近的 K 個,作為其鄰居,如下圖A部分所示;2、基於相似度門檻的鄰居,落在以當前點為中心,距離為 K 的區域中的所有點都作為當前點的鄰居,如下圖B部分所示。

640?wx_fmt=jpeg


再介紹一下K最近鄰(k-Nearest Neighbor,KNN)分類演算法:這是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。


7)經過4)計算出來的基於使用者的CF(基於使用者推薦之用:通過共同口味與偏好找相似鄰居使用者,K-鄰居演算法,你朋友喜歡,你也可能喜歡),基於物品的CF(基於專案推薦之用:發現物品之間的相似度,推薦類似的物品,你喜歡物品A,C與A相似,那麼你可能也喜歡C)。


4.2、基於基於使用者相似度與專案相似度


    上述3.1節中三個相似度公式是基於專案相似度場景下的,而實際上,基於使用者相似度與基於專案相似度計算的一個基本的區別是,基於使用者相似度是基於評分矩陣中的行向量相似度求解,基於專案相似度計算式基於評分矩陣中列向量相似度求解,然後三個公式分別都可以適用,如下圖:

640?wx_fmt=png

(其中,為0的表示未評分)


•  基於專案相似度計算式計算如Item3,Item4兩列向量相似度;

•  基於使用者相似度計算式計算如User3,User4量行向量相似度。


千言萬語不如舉個例子。我們來看一個具體的基於使用者相似度計算的例子。


假設我們有一組使用者,他們表現出了對一組圖書的喜好。使用者對一本圖書的喜好程度越高,就會給其更高的評分。我們來通過一個矩陣來展示它,行代表使用者,列代表圖書。

如下圖所示,所有的評分範圍從1到5,5代表喜歡程度最高。第一個使用者(行1)對第一本圖書(列1)的評分是4,空的單元格表示使用者未給圖書評分。


640?wx_fmt=png

使用基於使用者的協同過濾方法,我們首先要做的是基於使用者給圖書做出的評價,計算使用者之間的相似度。

讓我們從一個單一使用者的角度考慮這個問題,看圖1中的第一行,要做到這一點,常見的做法是將使用包含了使用者喜好項的向量(或陣列)代表每一個使用者。相較於使用多樣化的相似度量這種做法,更直接。

在這個例子中,我們將使用餘弦相似性去計算使用者間的相似度。

當我們把第一個使用者和其他五個使用者進行比較時,就能直觀的看到他和其他使用者的相似程度。

對於大多數相似度量,向量之間相似度越高,代表彼此更相似。本例中,第一個使用者第二、第三個使用者非常相似,有兩本共同書籍,與第四、第五個使用者的相似度低一些,只有一本共同書籍,而與最後一名使用者完全不相似,因為沒有一本共同書籍。


640?wx_fmt=png


更一般的,我們可以計算出每個使用者的相似性,並且在相似矩陣中表示它們。這是一個對稱矩陣,單元格的背景顏色表明使用者相似度的高低,更深的紅色表示它們之間更相似。

640?wx_fmt=png

所以,我們找到了與第一個使用者最相似的第二個使用者,刪除使用者已經評價過的書籍,給最相似使用者正在閱讀的書籍加權,然後計算出總和。

在這種情況下,我們計算出n=2,表示為了產生推薦,需要找出與目標使用者最相似的兩個使用者,這兩個使用者分別是第二個和第三個使用者,然後第一個使用者已經評價了第一和第五本書,故產生的推薦書是第三本(4.5分),和第四本(3分)。

640?wx_fmt=png


此外,什麼時候用item-base,什麼時候用user-base呢:http://weibo.com/1580904460/zhZ9AiIkZ?mod=weibotime?

一般說來,如果item數目不多,比如不超過十萬,而且不顯著增長的話,就用item-based 好了。為何?如@wuzh670所說,如果item數目不多+不顯著增長,說明item之間的關係在一段時間內相對穩定(對比user之間關係),對於實時更新item-similarity需求就降低很多,推薦系統效率提高很多,故用item-based會明智些。

反之,當item數目很多,建議用user-base。當然,實踐中具體情況具體分析。如下圖所示(摘自項亮的《推薦系統實踐》一書):

640?wx_fmt=jpeg


640?wx_fmt=jpeg

5

聚類演算法

 聚類聚類,通俗的講,即所謂“物以類聚,人以群分”。聚類 (Clustering) 是一個資料探勘的經典問題,它的目的是將資料分為多個簇 (Cluster),在同一個簇中的物件之間有較高的相似度,而不同簇的物件差別較大。


5.1、K 均值聚類演算法

    K-均值(K-Means)聚類演算法與處理混合正態分佈的最大期望演算法很相似,因為他們都試圖找到資料中自然聚類的中心。此演算法假設物件屬性來自於空間向量,目標是使各個群組內部的均方誤差總和最小。

  K均值聚類演算法首先會隨機確定K箇中心位置(位於空間中代表聚類中心的點),然後將各個資料項分配給最臨近的中心點。待分配完成之後,聚類中心就會移到分配給該聚類的所有節點的平均位置處,然後整個分配過程重新開始。這一過程會一直重複下去,直到分配過程不再產生變化為止。下圖是包含兩個聚類的K-均值聚類過程:

640?wx_fmt=jpeg

 以下程式碼所示即是此K-均值聚類演算法的python實現:

640?wx_fmt=png640?wx_fmt=png

   k-Means是一種機器學習領域中的一種非監督學習。下面,簡要介紹下監督學習與無監督學習:


•  監管學習的任務是學習帶標籤的訓練資料的功能,以便預測任何有效輸入的值。監管學習的常見例子包括將電子郵件訊息分類為垃圾郵件,根據類別標記網頁,以及識別手寫輸入。建立監管學習程式需要使用許多演算法,最常見的包括神經網路、Support Vector Machines (SVMs) 和 Naive Bayes 分類程式。


•  無監管學習的任務是發揮資料的意義,而不管資料的正確與否。它最常應用於將類似的輸入整合到邏輯分組中。它還可以用於減少資料集中的維度資料,以便只專注於最有用的屬性,或者用於探明趨勢。無監管學習的常見方法包括K-Means,分層叢集和自組織地圖。


5.2、Canopy 聚類演算法 

    Canopy 聚類演算法的基本原則是:首先應用成本低的近似的距離計算方法高效的將資料分為多個組,這裡稱為一個 Canopy,我們姑且將它翻譯為“華蓋”,Canopy 之間可以有重疊的部分;然後採用嚴格的距離計算方式準確的計算在同一 Canopy 中的點,將他們分配與最合適的簇中。Canopy 聚類演算法經常用於 K 均值聚類演算法的預處理,用來找合適的 k 值和簇中心。

5.3、模糊 K 均值聚類演算法 

        模糊 K 均值聚類演算法是 K 均值聚類的擴充套件,它的基本原理和 K 均值一樣,只是它的聚類結果允許存在物件屬於多個簇,也就是說:它屬於我們前面介紹過的可重疊聚類演算法。為了深入理解模糊 K 均值和 K 均值的區別,這裡我們得花些時間瞭解一個概念:模糊引數(Fuzziness Factor)。

    與 K 均值聚類原理類似,模糊 K 均值也是在待聚類物件向量集合上迴圈,但是它並不是將向量分配給距離最近的簇,而是計算向量與各個簇的相關性(Association)。假設有一個向量 v,有 k 個簇,v 到 k 個簇中心的距離分別是 d1,d2⋯ dk,那麼 V 到第一個簇的相關性 u1可以通過下面的算式計算:

640?wx_fmt=jpeg

計算 v 到其他簇的相關性只需將 d1替換為對應的距離。從上面的算式,我們看出,當 m 近似 2 時,相關性近似 1;當 m 近似 1 時,相關性近似於到該簇的距離,所以 m 的取值在(1,2)區間內,當 m 越大,模糊程度越大,m 就是我們剛剛提到的模糊引數。

    其餘聚類演算法本文不再介紹。關於冷啟動、資料稀疏、可擴充套件性、可移植性、可解釋性、多樣性、推薦資訊的價值等問題則待後續闡述。


640?wx_fmt=jpeg

6

分類演算法

  接下來,分類演算法有很多,本文介紹決策樹學習,與貝葉斯定理。


6.1、決策樹學習

    我們們直接切入正題。所謂決策樹,顧名思義,是一種樹,一種依託於策略抉擇而建立起來的樹。

    機器學習中,決策樹是一個預測模型;他代表的是物件屬性與物件值之間的一種對映關係。樹中每個節點表示某個物件,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的物件的值。決策樹僅有單一輸出,若欲有複數輸出,可以建立獨立的決策樹以處理不同輸出。
    從資料產生決策樹的機器學習技術叫做決策樹學習, 通俗說就是決策樹。

    

來理論的太過抽象,下面舉兩個淺顯易懂的例子:

    第一個例子:通俗來說,決策樹分類的思想類似於找物件。現想象一個女孩的母親要給這個女孩介紹男朋友,於是有了下面的對話:

      女兒:多大年紀了?
      母親:26。
      女兒:長的帥不帥?
      母親:挺帥的。
      女兒:收入高不?
      母親:不算很高,中等情況。
      女兒:是公務員不?
      母親:是,在稅務局上班呢。
      女兒:那好,我去見見。


這個女孩的決策過程就是典型的分類樹決策。相當於通過年齡、長相、收入和是否公務員對將男人分為兩個類別:見和不見。假設這個女孩對男人的要求是:30歲以下、長相中等以上並且是高收入者或中等以上收入的公務員,那麼這個可以用下圖表示女孩的決策邏輯:

640?wx_fmt=jpeg

也就是說,決策樹的簡單策略就是,好比公司招聘面試過程中篩選一個人的簡歷,如果你的條件相當好比如說清華博士畢業,那麼二話不說,直接叫過來面試,如果非重點大學畢業,但實際專案經驗豐富,那麼也要考慮叫過來面試一下,即所謂具體情況具體分析、決策。


    第二個例子來自Tom M.Mitchell著的機器學習一書:

    小王的目的是通過下週天氣預報尋找什麼時候人們會打高爾夫,他了解人們決定是否打球的原因最主要取決於天氣情況。而天氣狀況有晴,雲和雨;氣溫用華氏溫度表示;相對溼度用百分比;還有有無風。如此,我們便可以構造一棵決策樹,如下(根據天氣這個分類決策這天是否合適打網球):

640?wx_fmt=jpeg

    

上述決策樹對應於以下表示式:(Outlook=Sunny ^Humidity<=70)V (Outlook = Overcast)V (Outlook=Rain ^ Wind=Weak)。得到的最佳分類屬性如下圖所示:

640?wx_fmt=jpeg

 在上圖中,計算了兩個不同屬性:溼度(humidity)和風力(wind)的資訊增益,最終humidity這種分類的資訊增益0.151>wind增益的0.048。說白了,就是在星期六上午是否適合打網球的問題訣策中,採取humidity較wind作為分類屬性更佳,決策樹由此而來。


ID3演算法決策樹的形成

    OK,下圖為ID3演算法第一步後形成的部分決策樹。這樣綜合起來看,就容易理解多了。

1、overcast樣例必為正,所以為葉子結點,總為yes;

2、ID3無回溯,區域性最優,而非全域性最優,還有另一種樹後修剪決策樹。下圖是ID3演算法第一步後形成的部分決策樹:

640?wx_fmt=jpeg

6.2、貝葉斯分類的基礎:貝葉斯定理

   貝葉斯定理:已知某條件概率,如何得到兩個事件交換後的概率,也就是在已知P(A|B)的情況下如何求得P(B|A)。這裡先解釋什麼是條件概率:

      表示事件B已經發生的前提下,事件A發生的概率,叫做事件B發生下事件A的條件概率。其基本求解公式為:

640?wx_fmt=gif


      貝葉斯定理之所以有用,是因為我們在生活中經常遇到這種情況:我們可以很容易直接得出P(A|B),P(B|A)則很難直接得出,但我們更關心P(B|A),貝葉斯定理就為我們打通從P(A|B)獲得P(B|A)的道路。

      下面不加證明地直接給出貝葉斯定理(公式被網友指出有問題,待後續驗證改正):

640?wx_fmt=png


640?wx_fmt=jpeg

7

推薦例項擴充套件

7.1、閱讀推薦

    先來看一段文字(摘自36kr):

”北京十分科技也非常看好閱讀推薦類的應用,他們花了非常大的精力(一年60人團隊),才在今天推出了iPhone 版“酷雲閱讀”。

為什麼要投入這麼多人去做這個閱讀應用?CEO 李鵬告訴我,這個團隊超過一半的人都在做後臺相關的東西,包括語義分析、機器學習等演算法。他們的目的是將網際網路“語義化”以後,把人的興趣明確,最後把每個人感興趣的內容推薦給相關的人。在iPhone 上,酷雲的大致做法和Zite iPad 版類似,使用者的行為也是有“喜歡”、“不喜歡”,以及點選相應的媒體來源或者相關的標籤來告訴酷雲你希望以後看到更多這些內容。

這個目的是大部分閱讀推薦應用都有的,但是酷雲的做法似乎更加變態。他們除了每天要抓取來自網際網路的超過10萬篇文章之外,還對全國200個的電視臺播出的視訊內容進行了索引,以便使用者也可以通過文字搜尋出視訊、以及對視訊內容進行一樣的推薦。大致做法是先把這些節目都錄製下來,然後把聲音轉文字,最後建立摘要和索引。“


 一般的推薦系統應用的演算法是有上文所述的什麼協同過濾那般複雜呢?以下是援引自本人1月21日所發在微博上的文字:

    1、大多數推薦閱讀應用一般會給文章根據內容打上標籤:演算法,iphone(點選相當於為此標籤加分加權重),並邀請對文章作出評價:喜歡,或不喜歡。每一次點選都被推薦系統記錄了下來,最終漸漸形成使用者的標籤tag雲(與此同時,還可基於相同或相似的標籤tag尋找相似使用者,從而基於使用者推薦),而後系統每檢索一篇新的文章,提取出文章的關鍵字,匹配使用者的標籤取向,進行推送。


    2、目前手機上的新聞閱讀做到了分類,如科技,教育,但一般不會採取如網頁那般評分表態,所以也就無法記錄使用者的行為特徵,也就不會有新的文章出來後後續的推薦閱讀服務,於是造就了一批手機推薦閱讀的問世,如 @酷雲閱讀 ,指閱等。


     3、但一般使用者的習慣是看完一段新聞便完事了,擇日要看則擇日看。例如有幾個使用者願意為了評價一篇文章而特地去註冊一個帳號呢?如何儘量讓使用者付出額外代價去使用這類閱讀器,改變使用者習慣,個人認為,是關鍵。

    然後我還對上面的那句:先把這些視訊節目都錄製下來,然後把聲音轉文字有點疑問。我們已經知道如果是音樂的話像豆瓣FM可能是如下的做法:


1、你喜歡一些歌曲,而我也喜歡一些歌曲,如果你我喜歡的歌曲中有很多是重複類似的,則系統會把你我定義為好友,即相似使用者,基於使用者的協同過濾推薦:朋友喜歡,你也可能喜歡 ;

2、還有一個就是針對歌曲的推薦,你喜歡一首歌曲A,而另一首歌曲B與歌曲A類似(如都是有關愛情、感傷一類的),所以系統猜測你也可能喜歡B,而把B推薦給你。這就是基於專案(物品)的協同過濾推薦。


    根據所聽歌曲的重複類似判定為好友從而基於使用者的協同過濾進行推薦,通過某些歌曲是差不多類似的來基於專案的協同過濾進行推薦,但問題出來了,重複的好說,同一首歌曲同一個歌手嘛,可那些相似音樂歌曲又如何定義判定呢?通過系統去分析歌曲的頻譜?區別各個歌曲節奏的快慢,音訊?此舉雖然看起來有效,但實際實行起來不太現實。

    我覺得應該是為那些音樂打上標籤tag(估計視訊也是這麼做的,便於日後查詢索引。全視訊的實錄目前覺得還是不靠譜),如打上“愛情”“感傷”一類的tag,而後tag相同的則可判定為相似歌曲。但關鍵是怎麼打?語音識別?


7.2、標籤tag怎麼打

    初期可以人肉,爬蟲,買資料庫,等流量上來了,可以考慮ugc。所謂ugc,使用者產生內容。但是使用者一般不太可能自己給音樂打標籤,太繁瑣了(如最近的新浪微博的每條微博內容下多了一個“加標籤”的提示,但有多少使用者願去理它呢?),當然有的系統也會為你自動產生一些標籤tag(當然,你也可以自行加上一些標籤),如新浪部落格:

640?wx_fmt=jpeg


如何做到的呢?我的想法是,

應該是系統在背後掃描你的文章一遍,然後提取一些關鍵詞作為tag,供你選擇。取哪些關鍵詞呢?當然是取高頻詞。掃描整篇文章,統計每個單詞出現的頻率。

然後取其前TOP K,如上面截圖中的“演算法”在那篇文章中出現了4次,“部落格”出現了3次,所以系統為你自動匹配這些標籤。

至於採取何種資料結構或方法來統計這些關鍵詞的頻率呢。一般的應用hash+堆(十一、從頭到尾徹底解析Hash表演算法),或trie樹(從Trie樹談到字尾樹)均可。但當trie樹面對的是漢字中文的時候,就比較麻煩了。所以hash+堆是比較理想的選擇。

    同樣,針對視訊的話,應該也是類似的:

1、通過系統或機器讀取視訊內容,把視訊轉換為文字,然後提取其中頻率出現高的關鍵詞(如何提取關鍵詞呢,這就涉及到一個關鍵問題了:分詞。本blog日後闡述),把提取出來的這些關鍵詞作為此視訊的標籤tag;

2、然後針對這些tag建立索引摘要(什麼樣的索引?倒排索引。至於什麼是倒排索引,參考程式設計藝術第二十四章:第二十三、四章:楊氏矩陣查詢,倒排索引關鍵詞Hash不重複編碼實踐),最終方便於日後使用者或系統的查詢(此節系與程式設計藝術內的朋友討論整理總結而出)。

    具體細節後續闡述。


8、參考文獻

1、本人1月7日,1月21日的發表的微博(掛在本blog左側邊欄);

2、探索推薦引擎內部的祕密,作者:趙晨婷,馬春娥;

3、集體智慧程式設計,TobySeganra著。

4、推薦系統之協同過濾概述。

5、http://www.cnblogs.com/leoo2sk/。

6、Mitchell, Tom M. Machine Learning. McGraw-Hill, 1997(機器學習領域的開山之作).

7 http://zh.wikipedia.org/wiki/%E5%86%B3%E7%AD%96%E6%A0%91。

8、http://www.36kr.com/p/75415.html。

9、智慧web演算法,第三章推薦系統(實現了使用者及專案的相似度的計算,值得一看)

10、協同過濾推薦演算法和基於內容的過濾演算法:https://time.geekbang.org/article/1947


分享一哈機器學習-第九期 正在火熱開課中,和大家分享下我們學員對ml9第十課-聚類演算法的課程筆記導圖,簡直不要太棒噢

640?wx_fmt=png


640?wx_fmt=gif

福利時刻:為了幫助大家更好的學習課程的相關知識,我們特意推出了推薦系統實戰課程。將於本週上線,詳情新增客服諮詢~

640?wx_fmt=png


 更多資訊

 請戳一戳

640?wx_fmt=gif640?wx_fmt=jpeg640?wx_fmt=gif

點選“閱讀原文”,可線上諮詢

相關文章