1. 程式人生 > >推薦系統基礎演算法--餘弦相似度演算法詳解及應用

推薦系統基礎演算法--餘弦相似度演算法詳解及應用

一、簡述

       這幾天在看《推薦系統實戰》這本書。其中,基於領域的演算法是推薦系統中最基本的演算法,什麼是基於領域的演算法呢?簡單來說就是基於使用者(或物品)的協同過濾演算法,所謂的協同的意思就是需要使用者(或物品)共同參與。從而通過使用者的行為,推薦和他興趣相似的其他使用者喜歡的物品或他自己之前喜歡的物品的相似的物品。這裡有一個查詢物品或使用者興趣的相似性,就是我們今天討論的主題相似性的度量。

 

二、協同過濾演算法

        我們有時會遇到你的朋友向你詢問:“我現在在學習XXX,能推薦什麼專業的書籍嗎?”,這個時候你一般都會給他一些推薦或建議,這其實就是一個個性化的推薦的例子。在這個例子中,你的朋友之所以會向你詢問,最終做出決定。主要的原因還是你與他可能有共同的愛好或研究領域,並且信任你。那麼,在一個線上的個性化推薦系統中,當一個使用者A需要個性化推薦時,可以先找到和他有相似興趣的其他使用者,然後把那些使用者喜歡的、且使用者A沒有看過的物品推薦給他。這種方法就是基於使用者的協同過濾演算法。總結一下主要包括兩個步驟:

  1. 找到和目標使用者興趣相似的使用者集合
  2. 找到這個集合中的使用者喜歡的,且目標使用者沒有看到過的物品推薦給他

這裡協同過濾演算法主要是利用行為的相似度計算興趣的相似度。

給定使用者u和使用者v,令N(u)表示使用者u曾經有過行為(瀏覽或購買)的物品集合,令N(v)表示使用者v曾經有過行為的物品集合。那麼,我們可以給出簡單的計算u與v興趣相似度的公式:

關於第一個公式,我們可以理解為:使用者u和v感興趣的物品集合的交集,即兩個使用者都感興趣的物品除以物品集合的並集,得到一個簡單的相似度,例如:使用者u感興趣的物品集合是Nu={a,b,c,d},使用者v感興趣的物品集合Nv={a,c,g},那麼:

Wuv={a,c}/{a,b,c,d,g}=2/5=0.4

第二個公式,稍複雜了點。我們先來看看這個公式是如何推匯出來的,又有什麼樣的含義?

餘弦相似度

       餘弦相似度可以用向量空間中兩個向量的夾角的餘弦值為衡量這兩個個體之間的差異大小,值越接近於1就表示夾角越接近於0,表示這兩個個體的越相似,反之越接近於0則差異越大。這就是餘弦相似性。

但是這個公式只適用於直角三角型,而對於一般的三角型,我們有公式:

推導過程:

對於一般的三角型ABC,d為高

所以,有:

再來看看,上面的例子,

Nu=X={a,b,c,d},Nv=Y={a,c,g},令物品出現一次就加1,就得到兩個向量

X={1,1,1,1,0},Nv=Y={1,0,1,0,1},代入上式得:

從上面的計算得出,使用者u與v的興趣相似度是0.577,屬於一般偏上一點,擴充套件一下,假設使用者v也購買了商品d,那麼,計算結果就是0.75了。

計算優化

上式是計算兩兩使用者之間的相似度,它的時間複雜度是O(|U|*|U|),當用戶量特別大的時候非常的耗時。事實上,在現實中很多使用者相互之間並沒有對相同的物品產生過行為,即交集為0,這種情況計算的結果都是沒有關係。所以我們可以首先計算出交集不為0的使用者對(u,v),然後再計算這些使用者。

我們可以建立一個倒排表,對於每個物品都儲存對該物品產生過行為的使用者列表,令稀疏矩陣C(u,v)=|N(u)⋂N(v)|,那麼,假設使用者u和v同時屬於倒排表中K個物品對應的使用者列表,就有C(u,v)=K。從而要以掃描倒排表中每個物品對應的使用者列表,將使用者列表中的兩兩使用者對應的C(u,v)加1,最終可以得到所有使用者之間不為0的C(u,v)

上圖上,建立的一個4x4的矩陣W,對於物品a,將W[A][B]和W[B][A]加1,對於物品b,將W[A][C]和W[C][A]加1,依次類推。完成後我們就得到了一個矩陣,這裡W就是餘弦的分子部分,然後除以分母就可以得到使用者之間的相似度。

得到相似度後,UserCF(基於使用者的協同推薦演算法)就可以給使用者推薦和他興趣最相似的K個使用者喜歡的物品。如下公式度量了UserCF演算法中使用者u對物品i的感興趣程度:

其中,S(u,K)包含和使用者u興趣最接近的K個使用者,N(i)是對物品i有過行為的使用者集合,wuv是使用者u和v的興趣相似度,rvi代表使用者v對物品i的興趣,因為使用的是單一行為的隱反饋資料,所以所有的rvi=1。

我們選取K=3,使用者A對物品c、e都沒有過行為,可以推薦給A,此時,使用UserCF計算A對c、e兩個物品的興趣度是:

p(A,c)=w(AB)+w(AD),p(A,e)=w(AC)+w(AD),可以以此類推其它物品,選取興趣度p最高的topN推薦給使用者A。

關於,演算法的效能和準確率測試,自行閱讀這本書(內容有點多,不好輸入。哈哈)

演算法的改進

       上面計算使用者之間的興趣相似度還是有點粗糙的,比如:兩個使用者都對<新華字典>有過行為,但這並不能說明他們的興趣是一樣的,因為大多數人都買過這件商品。但如果使用者都買過《java語言程式設計思想》,那麼就可以認為他們的興趣有很大的相似之處。換句話說,兩個使用者對冷門的物品採取過同樣的行為更能說明他們興趣的相似度。所以可以改進上述的公式(稱為User-IIF):

此公式,通過

懲罰了使用者u和使用者v共同興趣列表中熱門物品對他們相似度的影響。

總結

       面對現在資訊過載的狀況,要想讓使用者從海量的資訊中較準確的找到自己的想到的東西,再或者使用者自己不知道自己想要什麼,那麼,推薦系統就可以幫助使用者瞭解他自己喜歡的東西,從而也為商家帶來一定的商業價值,互利共贏!餘弦相似度演算法是推薦系統中協同過濾的基礎演算法,主要的思想是以兩個向量的夾角的餘弦值來衡量相似度,夾角越小說明兩者方向越接近,也就表示越相似,反之則越不相似,更甚者,夾角為180度時,說明兩者截然相反!協同過濾還有一種比較常用的是基於物品的協同過濾,這個下章再講。