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

来源:互联网 发布:淘宝网招聘官网 编辑:程序博客网 时间:2024/05/01 07:20

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个用户的相似程度。

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 九阴真经3d先遣服更新失败怎么办 公司核名通过不想用了怎么办 公司核名下来了不想注册了怎么办 家人受到小贷公司催款威胁怎么办 商标抽签资料提交上去有问题怎么办 花椒直播助手苹果版下载不了怎么办 在香港酒店住把床单弄上血了怎么办 综英美我能怎么办我也很绝望百度云 护照的名字中间有个空格怎么办 开车不小心压死黄鼠狼了怎么办 三户联保贷款一方不还怎么办 因为隔断中介违约…我该怎么办 上海居住证没下来换住址了怎么办 工商注册后大股东不注资怎么办 公司不给去办理变更股东信息怎么办 滴滴车主注册没有自己的车型怎么办 代办用虚假地址注册的公司怎么办? 写字楼注册公司租户不租了怎么办 租户没把公司迁出我该怎么办 租户不肯把户口迁出了业主怎么办 同片区个体户营业场所搬迁怎么办 个体领发票的本丢了怎么办 领房产证发票和合同丢了怎么办 税务登记证5年没有办怎么办 二证合一后税务登记证怎么办? 微信漂流瓶打招呼对方收不到怎么办 添加不上徽信好友的微信帐号怎么办 手机号码不用了微信密码忘了怎么办 别人用我的手机号码注册微信怎么办 电脑此网站的安全证书有问题怎么办 起诉离婚开庭时被告不到场怎么办 商标35类被别人注册了怎么办 商标被注销后被别人注册怎么办 电商35类商标被抢注怎么办 血小板太低怎么办可以吃水果吗? 微信好友删除了只记得昵称怎么办 优酷会员1080p很卡怎么办 电脑最下面的任务栏不显示怎么办 ea账号保留的问题忘了怎么办 微博超级话题账号被屏蔽怎么办 梦幻西游手机将军令号码换了怎么办