类似度计算是数据挖掘,推荐引擎中的最基本问题,例如在推荐系统(Recommender Systems,简称RSs)中计算带推荐物品(Item)类似度,或是用户(User)之间的类似度以期得到兴趣口味(Taste)类似的用户时,均须要使用到类似度计算技术。常用的类似度计算方式较多,且各有特色, 如下就列出经常使用的类似度计算方式,原理,以及其优缺点。java
类似度计算和距离计算是相似问题,以前粗略看了下Mahout(apache分布式数据挖掘项目)中的实现对各计算方式进行分析。结合在实际项目中的应用,介绍几类经常使用的距离计算公式。apache
最常使用的类似度计算方法,并且整体效果较好,能够说是简单实用。数学描述以下:分布式
其中 是X的模。ide
例如,在推荐引擎中,使用 r_ui表示User u对Item i的打分,则可使用u对各Item打的分数的向量做为User u的兴趣爱好,则User u和User v之间的cosine类似度计算方式为:ui
其中 I_ui 表示User u,v均投票了的item。idea
Cosine的几何意义为向量空间中,将待计算类似度的向量均归一化为长度为1的向量, 全部被归一化后的向量 ov的v点坐标均落在以向量0为球心,半径为1的球面上,使用二向量的夹角度量两者类似度,夹角越小,类似程度越高。排序
在文本处理过程当中,cosine度量方式表现效果都会比较好。ci
Mahout中参见CosineDistanceMeasure.java字符串
用于度量线性关系最经常使用的方法, 定义 为协方差,σ为标准差, 则Pearson相关系数为:get
例如,使用 表示User u对Item的打分,则User u,v之间的类似度计算方式为:
其中 表示User u,v均投票了的item,与COS的区别是考虑了投票的均值, 且分母考虑的是User u,v共同投票的Item。
不少时候,针对User的PC要比针对Item的PC效果较好,由于针对User的PC至关于对各个用户的投票Scales作了一个中心化,避免各用户对相同Item投票时,由于投票习惯不同而致使的差别。例如:投票分值分[1,5]档,有些人投4表示很是喜欢, 而有些人会投5表述相同的喜爱程度。
PC的缺点以下:
另外PC也常常用做序列趋势的相近程度度量。在检索,推荐系统中常常须要考虑检索结果及推荐商品的季节因素,例如根据往年某一商品的季节特征,预测相似产品的接下来的流行程度。 下图分别为检索词‘吴莫愁’,‘梁博’,‘滑雪’在过去3个月的搜索PV,使用PC度量,很容易获得检索词‘吴莫愁’与‘梁博’的类似度远远大于‘梁博’与‘滑雪’的类似度。
Mahout中参见PearsonCorrleationSimilarity.java
Spearman Rank Correlation和Pearson Correlation很是相似, 只是SRC没有考虑对User对某具体Item的投票,而是考虑Item 在User全部投票中的相对Ranking。其数学表示为:
其中 k_ui表示User u对Item的投票值在User u全部投票中的Ranking。
SRC的优势是可以避免每一个用户因投票习惯不一致带来的偏差, 缺点是计算开销较大(每次计算都须要进行排序)
Mahout中参见SpearmanCorreleationSimilarity.java。计算复杂度较高。
仅考虑数据为二值的状况(0,1)。 若是数据非二值, 则将数据转化为为二值。定义M01为u中属性为0,但v中属性为1的数量,M00表示u,v中属性均为0的数量,M10,M11同理。则SMC定义以下:
例如u=[1,1,0,0],v=[0,1,1,0],则SMC=2/4=0.5
与SMC计算方式相似,但具体运算公式以下:
即仅考虑两个向量中,同一维度上值均为1的数量。该类似度度量公式在文本匹配中也较为经常使用, 好比在计算两个短字串的类似度时,首先将字符串切词,找到更细粒度的切词结果term,以后以不一样的term做为不一样维度的属性,使用JC计算类似度。
该度量方式是最直观的度量方式,通常使用曼哈顿,欧几里得距离度量,而更为广义的是闵科夫斯基度量方式。以Euclidean Distance为例:
可简单转化为类似度则表示为: