几种距离计算公式在数据挖掘中的应用场景分析

标签: 数据挖掘/曼哈顿距离/欧几里得距离/皮尔逊相关系数/余弦相似度



几种距离计算公式在数据挖掘中的应用场景分析_第1张图片
打开微信扫一扫,关注微信公众号【数据与算法联盟】

转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer


本文涉及以下几种距离计算公式的分析,参考资料为《面向程序员的数据挖掘指南》

  • 曼哈顿距离
  • 欧几里得距离
  • 闵可夫斯基距离
  • 皮尔逊相关系数
  • 余弦相似度

之前整理过一篇关于距离相关的文章:机器学习算法中的距离和相似性计算公式,分析以及python实现

闵可夫斯基距离

两个n维变量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

k=1nx1kx2kpp

其中p是一个变参数。

当p=1时,就是曼哈顿距离

当p=2时,就是欧氏距离

当p→∞时,就是切比雪夫距离

根据变参数的不同,闵氏距离可以表示一类的距离。

p值越大,单个维度的差值大小会对整体距离有更大的影响

曼哈顿距离/欧几里得距离的瑕疵

在《面向程序员的数据挖掘指南》中给出了这样一组样例数据, 下图为一个在线音乐网站的的用户评分情况,用户可以用1-5星来评价一个乐队,下边是8位用户对8个乐队的评价:


几种距离计算公式在数据挖掘中的应用场景分析_第2张图片

表中的横线表示用户没有对乐队进行评价,我们在计算两个用户的距离时,只采用他们都评价过的乐队。

现在来求Angelica和Bill的距离,因为他们共同评分过的乐队有5个,所以使用其对该5个乐队的评分进行曼哈顿距离的计算为:

Dis_1 = |3.5-2| + |2-3.5| + |5-2| + |1.5-3.5| + |2-3| = 9

同样使用欧式距离计算为:

Dis_2 = sqrt( (3.5-2)^2 + (2-3.5)^2 + (5-2)^2 + (1.5-3.5)^2 + (2-3)^2 ) = 4.3

当对Angelica和Bill,Bill和Chan进行距离对比时,由于两者的共同评分过的乐队均为5,数据都在一个5维空间里,是公平的,如果现在要计算Angelica和Hailey与Bill的距离时,会发现,Angelica与Bill共同评分的有5个乐队,Hailey与Bill共同评分的有3个乐队,也就是说两者数据一个在5维空间里,一个在三维空间里,这样明显是不公平的。这将会对我们进行计算时产生不好的影响,所以曼哈顿距离和欧几里得距离在数据完整的情况下效果最好。


用户问题/皮尔逊相关系数/分数膨胀

现象——用户问题

仔细观察用户对乐队的评分数据,可以发现每个用户的评分标准不同:

  • Bill没有打出极端的分数,都在2-4分之间
  • Jordyn似乎喜欢所有的乐队,打分都在4-5之间
  • Hailey是一个有趣的人,他的评分不是1就是4

那么如何比较这些用户呢?比如说Hailey的4分是相当于Jordyn的4分还是5分呢?我觉得更接近5分,这样一来,就影响推荐系统的准确性了!

解决该现象

解决该现象的办法之一就是 使用皮尔逊相关系数,例如下边这样的数据样例(Clara和Robert对五个乐队的评分):


几种距离计算公式在数据挖掘中的应用场景分析_第3张图片

这种现象在数据挖掘领域被称为“分数膨胀“。我们将其评分画成图,如下:


几种距离计算公式在数据挖掘中的应用场景分析_第4张图片

一条直线-完全吻合,代表着Clara和Robert的喜好完全一致。

皮尔逊相关系数用于衡量两个变量之间的相关性,他的值在-1~1,1代表完全一致,-1代表完全相悖。所以我们可以利用皮尔逊相关系数来找到相似的用户。

皮尔逊相关系数的计算公式为:


几种距离计算公式在数据挖掘中的应用场景分析_第5张图片

该公式除了看起来比较复杂,另外需要对数据进行两次遍历,第一次遍历求出 x平均值和y平均值,第二次遍历才能出现结果,这里提供另外一个计算公式,能够计算皮尔逊相关系数的近似值:

几种距离计算公式在数据挖掘中的应用场景分析_第6张图片


余弦相似度/稀疏数据

假设这样一个数据集,一个在线音乐网站,有10000w首音乐(这里不考虑音乐类型,年代等因素),每个用户常听的也就其中的几十首,这种情况下使用曼哈顿或者欧几里得或者皮尔逊相关系数进行计算用户之间相似性,计算相似值会非常小,因为用户之间的交集本来就很少,这样对于计算结果来讲是很不准确的,这个时候就需要余弦相似度了,余弦相似度进行计算时会自动略过这些非零值。

总结

这里只是简答的介绍了这几种相似性距离度量的方法和场景,但是在实际环境中远比这个复杂许多。这里总结下:

  • 如果数据存在“分数膨胀“问题,就使用皮尔逊相关系数
  • 如果数据比较密集,变量之间基本都存在共有值,且这些距离数据都是非常重要的,那就使用欧几里得或者曼哈顿距离
  • 如果数据是稀疏的,就使用余弦相似度

你可能感兴趣的:(几种距离计算公式在数据挖掘中的应用场景分析)