推薦系統中的相似度度量

推薦系統中的相似度度量

相似度計算是數據挖掘,推薦引擎中的最基本問題,例如在推薦系統(Recommender Systems,簡稱RSs)中計算帶推薦物品(Item)相似度,或是用戶(User)之間的相似度以期獲得興趣口味(Taste)相似的用戶時,均需要使用到相似度計算技術。經常使用的相似度計算方式較多,且各有特點, 以下就列出常用的相似度計算方式,原理,以及其優缺點。

相似度計算和距離計算是類似問題,之前粗略看了下Mahout(apache分佈式數據挖掘項目)中的實現對各計算方式進行分析。結合在實際項目中的應用,介紹幾類常用的距離計算公式。

Cosine

最常使用的相似度計算方法,而且總體效果較好,可以說是簡單實用。數學描述如下:

cosine_define

其中 是X的模。

例如,在推薦引擎中,使用 r_ui表示User u對Item i的打分,則可以使用u對各Item打的分數的向量作爲User u的興趣愛好,則User u和User v之間的cosine相似度計算方式爲:

cosine_define1

其中 I_ui 表示User u,v均投票了的item。

Cosine的幾何意義爲向量空間中,將待計算相似度的向量均歸一化爲長度爲1的向量, 所有被歸一化後的向量  ov的v點座標均落在以向量0爲球心,半徑爲1的球面上,使用二向量的夾角度量二者相似度,夾角越小,相似程度越高。

在文本處理過程中,cosine度量方式表現效果都會比較好。

Mahout中參見CosineDistanceMeasure.java

Pearson Correlation

用於度量線性關係最常用的方法, 定義 爲協方差,σ爲標準差, 則Pearson相關係數爲:

Pearson_num

例如,使用 表示User u對Item的打分,則User u,v之間的相似度計算方式爲:

Pearson_num_2

其中 表示User u,v均投票了的item,與COS的區別是考慮了投票的均值, 且分母考慮的是User u,v共同投票的Item。

很多時候,針對User的PC要比針對Item的PC效果較好,因爲針對User的PC相當於對各個用戶的投票Scales做了一箇中心化,避免各用戶對相同Item投票時,因爲投票習慣不一樣而導致的差異。例如:投票分值分[1,5]檔,有些人投4表示非常喜歡, 而有些人會投5表述相同的喜好程度。

PC的缺點如下:

  1. 如任意User僅投票了一個元素, 則無法使用該公式計算。
  2. 如任意User的每個投票分值均一樣, 則無法使用該公式計算。
  3. 計算時沒有考慮投票的總數量, 例如User u投票了200 Items,而v僅投票了2Items,則最後有可能還是v與待比較User近似。

另外PC也經常用作序列趨勢的相近程度度量。在檢索,推薦系統中經常需要考慮檢索結果及推薦商品的季節因素,例如根據往年某一商品的季節特徵,預測類似產品的接下來的流行程度。 下圖分別爲檢索詞‘吳莫愁’,‘樑博’,‘滑雪’在過去3個月的搜索PV,使用PC度量,很容易得到檢索詞‘吳莫愁’與‘樑博’的相似度遠遠大於‘樑博’與‘滑雪’的相似度。

tread_liangbo_wumochou

Mahout中參見PearsonCorrleationSimilarity.java

Spearman Rank Correlation(SRC)

Spearman Rank Correlation和Pearson Correlation非常類似, 只是SRC沒有考慮對User對某具體Item的投票,而是考慮Item 在User所有投票中的相對Ranking。其數學表示爲:

SRC

其中 k_ui表示User u對Item的投票值在User u所有投票中的Ranking。

SRC的優點是能夠避免每個用戶因投票習慣不一致帶來的誤差, 缺點是計算開銷較大(每次計算都需要進行排序)

Mahout中參見SpearmanCorreleationSimilarity.java。計算複雜度較高。

Simple Matching Coefficient

imple Matching Coefficient

僅考慮數據爲二值的情況(0,1)。 如果數據非二值, 則將數據轉化爲爲二值。定義M01爲u中屬性爲0,但v中屬性爲1的數量,M00表示u,v中屬性均爲0的數量,M10,M11同理。則SMC定義如下:

SMC

例如u=[1,1,0,0],v=[0,1,1,0],則SMC=2/4=0.5

Jaccard Coefficient

與SMC計算方式類似,但具體運算公式如下:

JC

即僅考慮兩個向量中,同一維度上值均爲1的數量。該相似度度量公式在文本匹配中也較爲常用, 比如在計算兩個短字串的相似度時,首先將字符串切詞,找到更細粒度的切詞結果term,之後以不同的term作爲不同維度的屬性,使用JC計算相似度。

Extented Jaccard(Tanimoto)

extend_JC

 

距離度量方式

該度量方式是最直觀的度量方式,一般使用曼哈頓,歐幾里得距離度量,而更爲廣義的是閔科夫斯基度量方式。以Euclidean Distance爲例:

歐幾里得距離計算公式

可簡單轉化爲相似度則表示爲:

歐氏距離轉相似度

在Mahout中參見以下實現:

EuclideanDistanceMeasure.java

ManhattanDistanceMeasure.java

ManhalanobisDistanceMeasure.java

其他內容

爲了提高運算速度, Mahout中實現了CachingUserSimilarity.java來緩存兩User/Item的相似度計算結果。

也可關注我的微博:  weibo.com/dustinsea

或直接訪問 semocean.com




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