mahout的对数似然相似源码分析

    mahout中有个对数似然相似的方法,可以计算用户1和用户2之间的相似程度,如2个用户具有共同偏好item数量k11,用户1还偏好item数k12(不含共同k11,也就是用户1总偏好k11+k12),用户2还偏好item k21,用户1和用户2都不偏好的item数有k22,然后通过LogLikelihood.logLikelihoodRatio(k11,k12,k21,k22)得到2个用户的相似程度。

mahout对数似然方法源码:

public static double logLikelihoodRatio(int k11, int k12, int k21, int k22) {
		double rowEntropy = entropy(k11, k12) + entropy(k21, k22);
		double columnEntropy = entropy(k11, k21) + entropy(k12, k22);
		double matrixEntropy = entropy(k11, k12, k21, k22);
		return 2 * (matrixEntropy - rowEntropy - columnEntropy);
	}
	
	public static double entropy(int... elements) {
		double sum = 0;
		for (int element : elements) {
			sum += element;
		}
		double result = 0.0;
		for (int x : elements) {
			if (x < 0) {
				throw new IllegalArgumentException(
					"Should not have negative count for entropy computation: (" + x + ')');
			}
			int zeroFlag = (x == 0 ? 1 : 0);
			result += x * Math.log((x + zeroFlag) / sum);
		}
		return -result;
	}

 如源码所示他的计算过程不是很复杂,但不明白它具体的实现逻辑和原理。初看他分为主方法和entropy方法,entropy方法很像在计算信息熵(entropy也是熵的意思),但如果以信息熵来理解的话,x * Math.log((x + zeroFlag) / sum)这句应该写成x/sum * Math.log((x + zeroFlag) / sum)才是,当然如果将每个entropy方法中的sum提出来,rowEntropy = entropy(k11, k12) + entropy(k21, k22)这个按照决策树的信息增益理解的话应该是(k11+k12)/N*entr(k11, k12) +(k21+k22)/N*entr(k21, k22) ,entr方法内有sum和外面的(k11+k12),(k21+k22)正好约掉,只剩N(总量N=k11+k12+k21+k22)也算对sum有解释了。 

但最终2 * (matrixEntropy - rowEntropy - columnEntropy)无法理解他的逻辑,为什么会乘以2,为什么要怎么相加减? 
    下面我们从另一个方面再来看他的实现,参考论文Accurate methods for the statistics of surprise and coincidence(http://wenku.baidu.com/view/277a0b8b84868762caaed503.html)和多策略融合的搭配抽取方法(http://sogo.com/labs/paper/Wangdaliang_JoTHU_08.pdf),当然他们都是讲自然文本语言库中2个词的搭配关系的,和我们这用户的相似有类似模型。 
我的理解是他们把上述的4块内容(k11,k12,k21,k22)分为k11,k12(A空间:用户1偏好)和k21,k22(B空间:用户1非偏好)两块,每块中的概率分布满足二项分布,通过假设A块和B块之间是独立不相关H1,假设A块和B块之间是相关H2,logλ=log(L(H1)/L(H2))得到对数似然比。 
如果A和B不相关则,条件概率P(w2|w1)=P(w2|~w1)=(k11+k21)/N,可以理解为已知A空间(用户1偏好空间w1)用户2的偏好(在用户1偏好k11+k12总量中用户2的偏好数量k11),P(w2|~w1)那就是B空间(用户1非偏好空间w2)用户2的偏好(在用户1非偏好k21+k22总量中用户2的偏好数量k21),假设用户2偏好和用户1不相关那么他们在AB2个空间分布的概率都有用户2的边缘概率(k11+k21)/N,然后通过已知概率和假设的二项分布获得AB2个空间分布概率L(H1)=b(k11;k11+k12,p)*b(k21;k21+k22,p)  其中b(k;n,x)=n!/(n-k)!k!*x^k(1-x)^(n-k)
    同理假设A和B相关,A和B空间具有不同的偏好概率(通俗讲用户1喜欢的用户2一般也都喜欢,用户1不喜欢的用户2往往也不喜欢),而且A空间有似然概率p1=k11/(k11+k12),B空间有似然概率p2=k21/(k21+k22),一般p1!=p2,L(H2)=b(k11;k11+k12,p1)*b(k21;k21+k22,p2)  

将logλ=log(L(H1)/L(H2))带入k11,k12,k21,k22,然后进行-2logλ(貌似是为了和卡方检验渐进),-2logλ具体方法看代码2。

public static double myLogLikelihood(int k11, int k12, int k21, int k22) {
		double p1 = k11 * 1.0 / (k11 + k12);
		double p2 = k21 * 1.0 / (k21 + k22);
		double p = (k11 + k21) * 1.0 / (k11 + k12 + k21 + k22);
		double r1 = k11 * Math.log(p) + k12 * Math.log(1 - p) + k21 * Math.log(p) + k22
					* Math.log(1 - p);
		double r2 = k11 * Math.log(p1) + k12 * Math.log(1 - p1) + k21 * Math.log(p2) + k22
					* Math.log(1 - p2);
		
		return 2 * (r2 - r1);
	}

 经过测试LogLikelihood.logLikelihoodRatio(29, 13, 123, 31612)和myLogLikelihood(29, 13, 123, 31612)具有相同结果263.8966 

    下面再尝试从-2logλ推导到logLikelihoodRatio: 
n1=k11+k12; 
n2=k21+k22; 
N=k11+k12+k21+k22; 
L(H1)=n1!/(n1-k11)!*k11!*((k11+k21)/N)^k11*((k12+k22)/N)^k12*n2!/(n2-k21)!*k21!*((k11+k21)/N)^k21*((k12+k22)/N)^k22; 
L(H2)=n1!/(n1-k11)!*k11!*(k11/n1)^k11*(k12/n1)^k12*n2!/(n2-k21)!*k21!*(k21/n2)^k21*(k22/n2)^k22; 
λ=L(H1)/L(H2)=(k11+k21)^(k11+k21)*(k12+k22)^(k12+k22)*(k11+k12)^(k11+k12)*(k21+k22)^(k21+k22)/(N^N*k11^k11*k12^k12*k21^k21*k22^k22) 
而mahout的logLikelihoodRatio方法: 
2 * (matrixEntropy - rowEntropy - columnEntropy) = -2logλ' 
λ'=matrix/row*column;(*Entropy中带负号的) 
row=k11^k11*k12^k12*k21^k21*k22^k22/((k11+k12)^(k11+k12)*(k21+k22)^(k21+k22)); 
column=k11^k11*k12^k12*k21^k21*k22^k22/((k11+k21)^(k11+k21)*(k12+k22)^(k12+k22)); 
matrix=k11^k11*k12^k12*k21^k21*k22^k22/(k11+k12+k21+k22)^(k11+k12+k21+k22);
λ'=(k11+k12)^(k11+k12)*(k21+k22)^(k21+k22)*(k11+k21)^(k11+k21)*(k12+k22)^(k12+k22)/N^N*k11^k11*k12^k12*k21^k21*k22^k22=λ 

    上述假设AB空间是按照用户1区分的,同样使用用户2区分AB空间也将得到相同的结论。 
举例:用户1和用户2都浏览的商品k11=2个,用户1还浏览其他k12=5,用户2还浏览其他k21=8,都没有被这2个用户浏览的商品985,那-2logλ=10.55 
如果存在用户1和用户3,它们k11,k12,k21,k22分别是2,5,18,975,那么-2logλ=7.65 
如果存在用户1和用户4,它们k11,k12,k21,k22分别是1,6,1,993,那么-2logλ=10.07 

用户1和用户2,3,4的相似度排序:用户2>用户4>用户3

就以k11,k12,k21,k22分别是2,5,18,975为例子,A空间(用户1喜欢的商品)中用户2有2个喜好,5个不喜欢,B空间(用户1不喜欢的商品)中用户2有18个喜好,975个不喜欢;
      在第一个假设用户2喜好商品和用户1独立无关(不过用户1喜不喜欢,用户2以相同挑选概率进行(k11+k21)/N),那么按二项分布公式,在A空间以p=(k11+k21)/N=20/1000=0.02概率,形成2个喜欢,5个不喜欢的概率是7!/(5!*2!)*0.02^2*0.98^5,B空间以p=(k11+k21)/N=20/1000=0.02概率,形成18喜欢975不喜欢的概率是993!/(975!*18!)*0.02^18*0.98^975;
      而第二个假设用户2喜好商品和用户1有关,A空间有似然概率p1=k11/(k11+k12)=2/7=0.286,B空间有似然概率p2=k21/(k21+k22)=18/993=0.018,那么A空间概率是7!/(5!*2!)*0.286^2*0.714^5,B空间形成概率是993!/(975!*18!)*0.018^18*0.982^975;
     那么最终λ=0.02^2*0.98^5*0.02^18*0.98^975/(0.286^2*0.714^5*0.018^18*0.982^975)=0.0217
-2logλ=7.65

    经过几个礼拜找资料研究,终于通过二项分布算合理描述了mahout实现对数似然相似,感觉它是否还存在一种信息熵,信息增益的表述,如果有谁知道如何用信息熵,信息增益或者其他表述请留言哈,不胜感激~~ 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值