技术篇

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

本文涉及以下几种距离计算公式的分析,参考资料为《面向程序员的数据挖掘指南》 曼哈顿距离 欧几里得距离 闵可夫斯基距离 皮尔逊相关系数 余弦相似度 之前整理过一篇关于距离相关的文章:[机器学习算法中的距离和相似性计算公式,分析以及python实现]() 闵可夫斯基距离 两个n维变量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的闵可夫斯基距离定义为: $$ \sqrt[p]{ \sum{k=1}^{n} \left | x{1k}-x_{2k} \right |^p} $$ 其中p是一个变参数。 当p=1时,就是曼哈顿距离 当p=2时,就是欧氏距离 当p→∞时,就是切比雪夫距离 根据变参数的不同,闵氏距离可以表示一类的距离。 p值越大,单个维度的差值大小会对整体距离有更大的影响 曼哈顿距离/欧几里得距离的瑕疵 在《面向程序员的数据挖掘指南》中给出了这样一组样例数据, 下图为一个在线音乐网站的的用户评分情况,用户可以用1-5星来评价一个乐队,下边是8位用户对8个乐队的评价: 表中的横线表示用户没有对乐队进行评价,我们在计算两个用户的距离时,只采用他们都评价过的乐队。 现在来求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分,这样一来,就影响推荐系统的准确性了!

继续阅读

数据归一化和其在sklearn中的处理

一:数据归一化 数据归一化(标准化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。 归一化方法有两种形式,一种是把数变为(0,1)之间的小数,一种是把有量纲表达式变为无量纲表达式。在机器学习中我们更关注的把数据变到0~1之间,接下来我们讨论的也是第一种形式。 1)min-max标准化 min-max标准化也叫做离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间,其对应的数学公式如下: $$ X_{scale} = \frac{x-min}{max-min} $$ 对应的python实现为 # x为数据 比如说 [1,2,1,3,2,4,1] def Normalization(x): return [(float(i)-min(x))/float(max(x)-min(x)) for i in x] 如果要将数据转换到[-1,1]之间,可以修改其数学公式为: $$ X{scale} = \frac{x-x{mean}}{max-min} $$ x_mean 表示平均值。 对应的python实现为 import numpy as np # x为数据 比如说 [1,2,1,3,2,4,1] def Normalization(x): return [(float(i)-np.mean(x))/float(max(x)-min(x)) for i in x] 其中max为样本数据的最大值,min为样本数据的最小值。这种方法有个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。 该标准化方法有一个缺点就是,如果数据中有一些偏离正常数据的异常点,就会导致标准化结果的不准确性。比如说一个公司员工(A,B,C,D)的薪水为6k,8k,7k,10w,这种情况下进行归一化对每个员工来讲都是不合理的。 当然还有一些其他的办法也能实现数据的标准化。 2)z-score标准化 z-score标准化也叫标准差标准化,代表的是分值偏离均值的程度,经过处理的数据符合标准正态分布,即均值为0,标准差为1。其转化函数为 $$ X_{scale} = \frac{x-\mu }{\sigma } $$ 其中μ为所有样本数据的均值,σ为所有样本数据的标准差。 其对应的python实现为: import numpy as np #x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] def z_score(x): return (x - np.

继续阅读

MachingLearning中的距离和相似性计算以及python实现

前言 写这篇文章的目的不是说摘抄网上其他人的总结,刚才最近在看这方面的东西,为了让自己能够实际的去感受下每种求距离公式的差别,然后用python进行具体实现。 在机器学习中,经常要用到距离和相似性的计算公式,我么要常计算个体之间的差异大小,继而评价个人之间的差异性和相似性,最常见的就是数据分析中的相关分析,数据挖掘中的分类和聚类算法。如利用k-means进行聚类时,判断个体所属的类别,要利用距离计算公式计算个体到簇心的距离,如利用KNN进行分类时,计算个体与已知类别之间的相似性,从而判断个体所属的类别等。 文章编辑的过程中或许存在一个错误或者不合理的地方,欢迎指正。 参考:http://www.cnblogs.com/heaad/archive/2011/03/08/1977733.html 推荐:https://my.oschina.net/hunglish/blog/787596 欧氏距离 也称欧几里得距离,是指在m维空间中两个点之间的真实距离。欧式距离在ML中使用的范围比较广,也比较通用,就比如说利用k-Means对二维平面内的数据点进行聚类,对魔都房价的聚类分析(price/m^2 与平均房价)等。 二维空间的欧氏距离 二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离 $$ d12 =\sqrt{(x{1}-x{2})^2+(y{1}-y{2})^2} $$ python 实现为: # coding: utf-8 from numpy import * def twoPointDistance(a,b): d = sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 ) return d print 'a,b 二维距离为:',twoPointDistance((1,1),(2,2)) 三维空间的欧氏距离 三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离 $$d12 =\sqrt{(x{1}-x{2})^2+(y{1}-y{2})^2+(z{1}-z{2})^2}$$ python 实现为: def threePointDistance(a,b): d = sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 + (a[2]-b[2])**2 ) return d print 'a,b 三维距离为:',threePointDistance((1,1,1),(2,2,2)) 多维空间的欧氏距离 两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离 $$ \sqrt{\sum{n}^{k=1}(x{1k}-x_{2k})^2 } $$ python 实现为:

继续阅读