1. 程式人生 > >【學習筆記】Jaccard相似度和廣義Jaccard相似度

【學習筆記】Jaccard相似度和廣義Jaccard相似度

1. 狹義Jaccard相似度,計算兩個集合之間的相似程度,元素的“取值”為0或1
對集合A和B,Jaccard相似度計算如下: Jaccard(A, B)= |A intersect B| / |A union B| 相似度數值在[0, 1]之間,當A==B的時候,為1. 優缺點,就是元素的取值只能是0或者1,無法利用更豐富的資訊。 由相似度,可以轉換成Jaccard距離: Jaccard distance (A, B) = 1 - Jaccard(A, B) 2. 廣義Jaccard相似度,元素的取值可以是實數。又稱為Tanimoto係數,用EJ來表示,計算方式如下:

EJ(A,B)=(A*B)/(||A||^2+||B||^2-A*B)

其中A、B分別表示為兩個向量,集合中每個元素表示為向量中的一個維度,在每個維度上,取值通常是[0, 1]之間的值,A*B表示向量乘積,||A||^2表示向量的模,即 ||A||^2 = sqrt (a1^2 + a2^2 + a3^2 + ......)。 廣義Jaccard相似度計算公式中,如果把分母的A*B去掉,並將||A||^2+||B||^2替換為(||A||^2)*(||B||^2),就轉成了餘弦相似度(cosine similarity)。 EJ中每個分量的取值可以是實數,通常在[0, 1]之間。對於兩篇文件,分詞之後,形成兩個“詞語--詞頻向量”,詞語可以做為EJ的維度,如何將詞頻轉換為實數值。借鑑tf/idf的思路。對於每個詞語,有兩個頻度:1.在當前文件中的頻度;2. 在所有文件中的頻度。其中1相當於tf,與權重正相關;2相當於df,與權重反相關。 對於2,計算權重為 idf (w) = log (TotalWC/C(w)) C(w)是詞語w在所有文件中出現的次數,TotalWC是所有文件中所有詞的總詞頻。 對於1,權重就可以取詞頻本身 tf(w) = D(w),D(w)表示在當前文件中w出現的次數。 具體計算的程式碼可以參考 “
http://www.cnblogs.com/TtTiCk/archive/2007/08/04/842819.html
”的Documents.cs中的“SimilitudeValueToDocumentUsingGeneralizedJaccardCoefficient”函式。 3. 其他擴充套件方法 EJ(A,B) = sum ( min(a1, b1) + min (a2, b2)... ) / sum ( max(a1, b1) + max (a2, b2).. ) 即用向量中每個分量的的最小值和最大值來參與計算。 個人理解,這個可以做如下解釋。當集合A中的元素a1出現C(a1)次的時候,我們可以認為集合中的元素是允許重複存在的,即集合A中有C(a1)個元素;集合B也是這樣,有C(b1)個相同的元素,則A和B在這個元素上的交集就是min(a1, b1) ,並集就是max(a1, b1) ,這樣上述公式就是利用狹義Jaccard相似度計算的結果。 參考文獻: wiki:http://en.wikipedia.org/wiki/Jaccard_similarity