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实现对数似然相似,感觉它是否还存在一种信息熵,信息增益的表述,如果有谁知道如何用信息熵,信息增益或者其他表述请留言哈,不胜感激~~
相关推荐
Mahout是一个Apache Software Foundation(ASF)旗下的开源项目,主要用途是提供可扩展的机器学习算法的实现,帮助开发人员更方便快捷地创建智能应用程序。Mahout包含了很多算法的实现,包括聚类(Clustering)、...
**Apache Mahout 源码解析** Apache Mahout 是一个基于Java的开源机器学习库,旨在简化大规模数据集上的机器学习算法实现。它为开发者提供了一系列预构建的、可扩展的机器学习算法,包括分类、聚类、推荐系统以及...
选择不同的用户相似度度量方法,这里选择了基于谷本系数、基于对数似然和基于曼哈顿距离 基于内容的推荐 对新闻文本进行分词 调用Deeplearning4j中构建paragraphvector的方法,通过doc2vec构建VSM 用Gensim会更方便...
在大数据时代,Mahout已经成为数据科学家和工程师们的重要工具,尤其在文本分析、推荐系统和分类任务中扮演着关键角色。本篇将深入探讨Mahout中的朴素贝叶斯分类以及中文分词这两个核心功能。 一、Mahout与朴素...
《Mahout in Action》是一本深入探讨Apache Mahout机器学习框架的专业书籍,其源码提供了丰富的实践示例和深入理解Mahout算法的机会。在GitHub上,你可以找到这些源码的完整版本,链接为。下面,我们将详细探讨...
《Apache Mahout 0.7源码解析与应用探索》 Apache Mahout 是一个开源机器学习库,专注于大规模数据集的算法实现。该库由Java编写,并采用Maven作为构建工具,提供了一系列用于构建智能应用的高效算法。本文将深入...
mahout0.9的源码,支持hadoop2,需要自行使用mvn编译。mvn编译使用命令: mvn clean install -Dhadoop2 -Dhadoop.2.version=2.2.0 -DskipTests
Mahout的目标是帮助开发人员构建智能应用程序,如推荐系统、分类和聚类算法,这些在大数据分析领域中极为重要。 **K-Means聚类算法** K-Means是一种无监督学习的聚类算法,用于将数据集分成不同的群组或类别。在...
以上就是关于Mahout 0.9源码及其在Eclipse中的使用介绍。通过学习和实践,开发者可以利用Mahout构建强大的机器学习应用,处理各种数据挖掘任务。在实际应用中,可以根据项目需求选择合适的算法,结合Hadoop分布式...
Mahout常用于电子商务网站的产品推荐、新闻推荐、用户行为分析、社交网络分析等场景。此外,它还可以应用于市场细分、情感分析等领域。 7. **社区支持**: 作为Apache软件基金会的顶级项目,Mahout有一个活跃的...
mahout-distribution-0.5-src.zip mahout 源码包
打开命令行,进入解压后的Mahout源码目录,执行以下Maven命令来构建Mahout: ``` mvn clean install -DskipTests ``` 这个过程可能会比较耗时,因为Maven会自动下载所有依赖。等待编译完成后,Mahout的可执行jar文件...
首先,从Apache官方网站或SVN代码库下载Mahout的0.5版本源码包,然后使用Maven命令编译并安装相关模块到本地仓库中。需要注意的是,在编译过程中可能会遇到内存溢出的问题,此时可以适当增加JVM堆内存大小。 4. ...
在源码中,您可以探索Mahout实现的各种算法,如协同过滤(Collaborative Filtering)、频繁项集挖掘(Frequent Itemset Mining)、近邻搜索(Nearest Neighbor Search)等。这些算法是通过Java编程语言实现的,因此...
Mahout的主要目标是让大数据分析变得简单易行,尤其在推荐系统、分类和聚类方面。在0.5版本中,它支持Hadoop分布式计算框架,这意味着它能够处理大规模的数据集。以下是这个版本中可能包含的一些关键组件和概念: 1...
### Mahout 数据挖掘 #### 1. 什么是Mahout? Apache Mahout 是一个开源项目,由 Apache Software Foundation (ASF) 开发。该项目的核心目标在于构建一系列可扩展的机器学习算法库,供开发者们免费使用。这些算法...
mahout 0.7 src, mahout 源码包, hadoop 机器学习子项目 mahout 源码包