数据挖掘中的距离度量和相似度度量及Python实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013-06-01 Saturday
7
3.
切比雪夫距离:CFra Baidu bibliotekebyshev Distance
相当于从A(x1, y1)到B(x2, y2)最少要走的步数
2013-06-01 Saturday
8
#切比雪夫距离计算用户相似度 0.25 #切比雪夫距离=max|xi-yi| #相似度=1.0/(1+切比雪夫距离) def sim_chebyshev(prefs,person1,person2): si = {} for it in prefs[person1]: if it in prefs[person2]: si[it] = 1 if len(si) == 0: return 0 pSum = max(math.fabs(prefs[person1][it]-prefs[person2][it])for it in si) return 1.0/(1+pSum)
2013-06-01 Saturday
15
#皮尔逊相关系数计算用户相似度 1.0 #并不是通用的,只有在特定条件下才能用 def sim_pearson(prefs,person1,person2): si = {} for it in prefs[person1]: if it in prefs[person2]: si[it] = 1 if len(si) == 0: return 0 sum1 = sum(prefs[person1][it] for it in prefs[person1]) sum2 = sum(prefs[person2][it] for it in prefs[person2]) sum1Sq = sum([pow(prefs[person1][it],2) for it in si]) sum2Sq = sum([pow(prefs[person2][it],2) for it in si]) pSum = sum([prefs[person1][it]*prefs[person2][it] for it in si]) num = pSum - (sum1 * sum2)/len(si) den = math.sqrt((sum1Sq-pow(sum1,2)/len(si))*(sum2Sq-pow(sum2,2)/len(si))) if den == 0: return 0 r = num/den return r
2013-06-01 Saturday
4
#欧氏距离计算用户相似度 #欧氏距离=sqrt(sum(pow(xs-ys,2))) #相似度=1/(1+欧氏距离) def sim_distance(prefs,person1,person2): si = {} for it in prefs[person1]: if it in prefs[person2]: si[it] = 1 if len(si) == 0: return 0 pSum = math.sqrt(sum(pow(prefs[person1][it]-prefs[person2][it],2)for it in si)) return 1.0/(1+pSum)
2013-06-01 Saturday
16
4.
Jaccard相似系数:Jaccard Coefficient
主要用于计算符号度量或布尔值度量的个体间的相似度;因为个体的特性主要由 符号度量或布尔值度量标识,因此无法衡量差异的具体值有多大,只能获得个体 间共同具有的特征是否一致的结论,故只比较相同特征的数目。
0.1907435698305462
2013-06-01 Saturday
5
2.
曼哈顿距离:Manhattan Distance
将多个维度上的距离求和后的结果
如左图所示,绿线代表欧氏距离, 红线代表曼哈顿距离,蓝、黄线 代表等价的曼哈顿距离
2013-06-01 Saturday 6
#曼哈顿距离计算用户相似度 0.14285714285714285 #曼哈顿距离=sum|xi-yi| #相似度=1/1+曼哈顿距离 def sim_manhattan(prefs,person1,person2): si = {} for it in prefs[person1]: if it in prefs[person2]: si[it] = 1 if len(si) == 0: return 0 pSum = sum(math.fabs(prefs[person1][it]-prefs[person2][it])for it in si) return 1.0/(1+pSum)
说明:
相似度是样本间相似程度的度量,亦称相似测度、近似系数,如 余弦相似度,夹角越小,相似度越大; 相异度,亦称相异测度、相异系数,如距离,距离越大,相异度 越大。
3
2013-06-01 Saturday
1.
欧氏距离:Euclidean Distance
用于衡量各点间的绝对距离
X、Y必须是同一特征的不同值,如同是身高或同时体重 n=1,直线上两点的距离 n=2,二维坐标系中两点的距离 n=3,三维坐标系中两点的距离……
2013-06-01 Saturday
17
#Jaccard计算用户相似度 0.3333333333333333 #Jaccard=|AnB|/|AuB| def sim_jaccard(prefs,person1,person2): si_union = {}#并集 si_inter = {}#交集 si_union = dict(prefs[person1],**prefs[person2]) for it in prefs[person1]: if it in prefs[person2]: si_inter[it] = min(prefs[person1][it],prefs[person2][it]) sum1 = sum(si_inter[it] for it in si_inter) sum2 = sum(si_union[it] for it in si_union) if sum2 == 0: return 0 1.0 r = float(sum1)/sum2 return r sum1 = len(si_inter) sum2 = len(si_union)
2013-06-01 Saturday
12
#调整余弦系数计算用户相似度 #其中s属于AnB,i属于A,j属于B;和皮尔逊的差异在分母 1.0 def sim_ajcos(prefs,person1,person2): si = {} for it in prefs[person1]: if it in prefs[person2]: si[it] = 1 if len(si) == 0: return 0 avg1 = float(sum(prefs[person1][it] for it in prefs[person1]))/len(prefs[person1]) avg2 = float(sum(prefs[person2][it] for it in prefs[person2]))/len(prefs[person2]) pSum = sum([(prefs[person1][it]-avg1)*(prefs[person2][it]-avg2) for it in si]) sum1Sq = sum([pow(prefs[person1][it]-avg1,2) for it in prefs[person1]]) sum2Sq = sum([pow(prefs[person2][it]-avg2,2) for it in prefs[person2]]) den = math.sqrt(sum1Sq * sum2Sq) if den == 0: return 0 r = float(pSum)/den return r
2013-06-01 Saturday
9
1.
余弦相似度:Cosine Similarity
相当于计算向量夹角的余弦值,以此作为两个个体间相似度大小的衡量
2013-06-01 Saturday
10
#余弦系数计算用户相似度 #余弦相似度=sum(rxs * rys)/sqrt(rxs2 * rys2),其中s为AnB def sim_cos(prefs,person1,person2): si = {} for it in prefs[person1]: if it in prefs[person2]: si[it] = 1 if len(si) == 0: return 0 pSum = sum([prefs[person1][it]*prefs[person2][it] for it in si]) sum1Sq = sum([pow(prefs[person1][it],2) for it in si]) sum2Sq = sum([pow(prefs[person2][it],2) for it in si]) den = math.sqrt(sum1Sq * sum2Sq) if den == 0: return 0 r = float(pSum)/den return r
2013-06-01 Saturday
0.9778024140774094
11
2.
调整余弦相似度:Adjusted Cosine Similarity
相当于计算向量夹角的余弦值,以此作为两个个体间相似度大小的衡量,由于余弦 相似度对数值不敏感,如个体X、Y对两个条目的评分分别为(1,2)、(4,5),其余弦相 似度为0.98,调整后需要减去各自的均值,计算相似度为-0.8.通过求出每位用户的 平均打分,调整评分向量为评分偏差向量,再求解余弦相似度。
个体间差异的计算方法汇总
参考资料: 《集体智慧编程》P35 个性化推荐系统的研究进展,刘建国等 基于协同过滤的个性化推荐算法研究,周张兰 距离和相似度度量,网站数据分析 蜗牛向前冲 2013年6月1日星期六
一.背景:目的,应用场景 二.距离度量:欧氏(P)、曼哈顿(P)、切比雪夫(P) 三.相似度度量:余弦(P) 、调整余弦(P) 、皮尔逊(P) 、
14
#皮尔逊相关系数计算用户相似度 1.0 #通用的方法,下面一种只是本方法在某些情况下的特例 def sim_stdpearson(prefs,person1,person2): si = {} for it in prefs[person1]: if it in prefs[person2]: si[it] = 1 lensi = len(si) if lensi == 0: return 0 sum1 = sum(prefs[person1][it] for it in prefs[person1]) sum2 = sum(prefs[person2][it] for it in prefs[person2]) avg1 = float(sum1)/len(prefs[person1]) avg2 = float(sum2)/len(prefs[person2]) sum1Sq = sum([pow(prefs[person1][it]-avg1,2) for it in si]) sum2Sq = sum([pow(prefs[person2][it]-avg2,2) for it in si]) pSum = sum([(prefs[person1][it]-avg1)*(prefs[person2][it]-avg2) for it in si]) den = math.sqrt(sum1Sq*sum2Sq) if den == 0: return 0 r = pSum/den return r
Jaccard (P),说明
四.比较:结果,适用场景
注:P代表Python源码实现,测试字典为prefs = {'a':{1:1,2:2},'b':{1:4,2:5}}
2013-06-01 Saturday 2
目的:
计算个体间的差异,进而评价个体的相似性、类别。
应用场景:
数据分析:相关分析; 数据挖掘:分类算法和聚类算法,eg.K最近邻(KNN),K均值(KMeans);
2013-06-01 Saturday 13
3.
皮尔逊相关系数:Pearson Correlation Coefficient
即为相关分析中的相关系数r,分别对X和Y基于自身总体标准化后计算两个向量夹 角的余弦值。相当于对数据进行中心化处理,即数据移动了一个样本平均值以使 其均值为零。
2013-06-01 Saturday