無敵的Log-Likelihood Ratio(1)——LLR的計算方式


  Ted  DunningTed\; DunningAccurate  Methods  for  the  Statistics  of  Surprise  and  Coincidence《Accurate\; Methods\; for\; the\; Statistics\; of\; Surprise\; and\; Coincidence》中介紹了LogLikehood  RatioLog-Likehood\; Ratio在文本計算中的基本使用。LLRLLR因爲實現簡單、有效並且具有大規模數據上的可擴展性,能夠被很好的使用到工業系統中。因此基於LLRLLR的相似度度量廣泛應用在推薦系統等多種應用當中。
  在這篇Blog中,我們忽略Accurate  Methods  for  the  Statistics  of  Surprise  and  Coincidence《Accurate\; Methods\; for\; the\; Statistics\; of\; Surprise\; and\; Coincidence》中對LLRLLR過多的冗餘描述,主要集中的去關注LLRLLR的計算方式和現有的一些簡單有效的代碼實現。
  本篇博客的組織方式如下。在章節1中,以最簡單的方式討論了LogLikelihood  RatioLog-Likelihood\; Ratio相似度的計算方式,在章節2中討論了LogLikelihood  RatioLog-Likelihood\; Ratio的具體的代碼實現,以及一些可以現用的相似度計算工具。

1. LLR的計算方式

  在計算兩個事件(例如推薦系統中的點擊行爲)的LLRLLR值來做相似度衡量的時候,我們通過兩個事件的計數來計算事件之間的相似度。接下來我們以推薦系統中物品相似度的計算爲例來介紹LLRLLR的計算方式。
  有兩個物品分別爲物品ii和物品jj。對應事件計數的簡單形式化描述如下:
k11k_{11}:表示同時瀏覽了物品ii和物品jj的用戶。
k12k_{12}:表示瀏覽了物品ii,但是沒有瀏覽物品jj的用戶。
k21k_{21}:表示瀏覽了物品jj,但是沒有瀏覽物品ii的用戶。
k22k_{22}:表示沒有瀏覽物品ii,並且沒有瀏覽物品jj的用戶。
根據上述,我們可以得到如下的一個表格:

事件 瀏覽Item  iItem\;i 沒有瀏覽Item  iItem\;i
瀏覽Item  jItem\; j k11k_{11} k21k_{21}
沒有瀏覽Item  jItem\;j k12k_{12} k22k_{22}

Item  iItem\; iItem  jItem\;jLLRLLR計算公式如下:
S=2×(HmHcHr)S=2\times (H_m - H_c - H_r)
其中:
HmH_m表示上述矩陣的矩陣熵,總體的計算公式如下:
Hm=(k11N  log(k11N)+k12N  log(k12N)+k21N  log(k21N)+k22N  log(k22N))H_m = - (\frac{k_{11}}{N}\;log(\frac{k_{11}}{N}) + \frac{k_{12}}{N}\;log(\frac{k_{12}}{N}) + \frac{k_{21}}{N}\;log(\frac{k_{21}}{N}) + \frac{k_{22}}{N}\;log(\frac{k_{22}}{N}))
HrH_r表示每行相加計算得到的信息熵,相關的具體計算公式如下:
Hr=(k11+k12N  log(k11+k12N)+k21+k22Nlog(k21+k22N))H_r = -(\frac{k_{11} + k_{12}}{N}\; log(\frac{k_{11}+k_{12}}{N}) +\frac{k_{21} + k_{22}}{N}log(\frac{k_{21} + k_{22}}{N}))
HcH_c表示矩陣的每一列相加計算得到的信息熵,相關的具體計算公式如下:
Hc=(k11+k21N  log(k11+k21N)+k21+k22Nlog(k21+k22N))H_c=-(\frac{k_{11} + k_{21}}{N}\; log(\frac{k_{11}+k_{21}}{N}) +\frac{k_{21} + k_{22}}{N}log(\frac{k_{21} + k_{22}}{N}))

其中N=k11+k12+k21+k22N=k_{11} + k_{12} + k_{21} + k_{22}

2. LLR的代碼實現

  在MahoutMahoutmathmath庫中定義了LogLikelihoodLogLikelihood類,實現了LLRLLR的計算,其中具體的計算代碼在下面給出。

  • rowEntropyrowEntropy的計算方式如下
private static double xLogX(long x) {
    return x == 0 ? 0.0 : x * Math.log(x);
  }
private static double entropy(long a, long b) {
    return xLogX(a + b) - xLogX(a) - xLogX(b);
  }

其中a=k11+k12a=k_{11} + k_{12}並且b=k21+k22b=k_{21} + k_{22},綜合得到
rowEntropy=(N×log  (N)(k11+k12)×log  (k11+k12)(k21+k22)×log  (k21+k22))  =((k11+k12)×log  (N)(k11+k12)×log  (k11+k12)+(k21+k22)×log  (N)(k21+k22)×log  (k21+k22))  =((k11+k12)×(log(N)log(k11+k12))+(k21+k22)×(log(N)log(k21+k22)))  =(k11+k12)×(log  k11+k12N)+(k21+k22)×(log  k21+k22N)=Hr×NrowEntropy = (N \times log\;(N) - (k_{11} + k_{12}) \times log\;(k_{11} + k_{12}) -(k_{21} + k_{22} )\times log\;(k_{21} + k_{22})) \\ \;\\ = -((k_{11}+k_{12})\times log\;(N)-(k_{11} + k_{12}) \times log\;(k_{11} + k_{12}) + (k_{21} + k_{22}) \times log\;(N) - (k_{21} + k_{22} )\times log\;(k_{21} + k_{22})) \\ \;\\ =-((k_{11} + k_{12}) \times(log(N)-log(k_{11}+k_{12})) + (k_{21} + k_{22}) \times(log(N)-log(k_{21}+k_{22})))\\ \;\\ =(k_{11} +k_{12}) \times(log\;\frac{k_{11} + k_{12}}{N}) + (k_{21} + k_{22}) \times(log\;\frac{k_{21} + k_{22}}{N}) = - H_r \times N



  • 同樣的colEntropycolEntropy的計算方式如下:
    colEntropy=(k11+k21)×(log  k11+k21N)+(k12+k22)×(log  k12+k22N)=Hc×NcolEntropy = (k_{11} +k_{21}) \times(log\;\frac{k_{11} + k_{21}}{N}) + (k_{12} + k_{22}) \times(log\;\frac{k_{12} + k_{22}}{N}) = -H_c \times N


  • matrixEntropymatrixEntropy的計算方式
private static double entropy(long a, long b, long c, long d) {
    return xLogX(a + b + c + d) - xLogX(a) - xLogX(b) - xLogX(c) - xLogX(d);
  }

matrixEntropy=N×log  (N)k11  log(k11)k12  log(k12)k21  log  (k21)k22  log(k22)  =(k11×log  (k11N)+k12×log  (k12N)+k21×log  (k21N))+k21×log  (k21N))×NmatrixEntropy= N\times log\;(N) - k_{11}\;log(k_{11}) -k_{12}\;log(k_{12}) - k_{21}\;log\;(k_{21}) - k_{22}\;log(k_{22}) \\ \;\\ = - (k_{11}\times log\;(\frac{k_{11}}{N})+k_{12}\times log\;(\frac{k_{12}}{N}) + k_{21}\times log\;(\frac{k_{21}}{N})) + k_{21}\times log\;(\frac{k_{21}}{N})) \times N



  • 最終相似度SS的計算結果
public static double logLikelihoodRatio(long k11, long k12, long k21, long k22) {
    Preconditions.checkArgument(k11 >= 0 && k12 >= 0 && k21 >= 0 && k22 >= 0);
    // note that we have counts here, not probabilities, and that the entropy is not normalized.
    double rowEntropy = entropy(k11 + k12, k21 + k22);
    double columnEntropy = entropy(k11 + k21, k12 + k22);
    double matrixEntropy = entropy(k11, k12, k21, k22);
    if (rowEntropy + columnEntropy < matrixEntropy) {
      // round off error
      return 0.0;
    }
    return 2.0 * (rowEntropy + columnEntropy - matrixEntropy);
  }

S=2×(rowEntropy+colEntropymatrixEntropy)=2×(HrNHcN+HmN)=2N(HmHrHc)S= 2 \times(rowEntropy + colEntropy - matrixEntropy) = 2 \times (- \frac{H_r}{N} - \frac{H_c}{N} + \frac{H_m}{N}) = \frac{2}{N}(H_m - H_r - H_c)

在代碼實現裏面相似度的計算過程中把NN約掉了,所以在mahoutmahout計算當中實際計算得到的值爲
S=2N(HmHrHc)S=\frac{2}{N}(H_m - H_r - H_c)

3 相關疑問

問題 1: 在代碼的計算過程中,約掉分母NN對整個結果有影響嘛?
問題 2: 在有些博客資料中稱HrH_r爲行熵,稱HcH_c爲列熵,並且計算公式不如下:
博客相關資料截圖
這種方式和我上面描述的計算方式等價嘛?那種更準確?

歡迎大家留言討論,如果有問題或者建議的地方希望大家能夠提出再覈對問題後我會在第一時間進行修正。

4 參考資料

【1】LLR (Log-Likelihood Ratio) used for recommendations
【2】Accurate Methods for the Statistics of Surprise and Coincidence
【3】Building a Correlated Cross-Occurrence (CCO) Recommenders with the Mahout CLI
【4】github · Mathout LogLikelihood Similarity
【5】Surprise and Coincidence
【6】loglikelihood ratio 相似度

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