网站可以做动态背景吗,贵州安顺建设局网站,wordpress 机械模板,wordpress加js在数据分析和数据挖掘的过程中#xff0c;我们经常需要知道个体间差异的大小#xff0c;进而评价个体的相似性和类别。最常见的是数据分析中的相关分析#xff0c;数据挖掘中的分 类和聚类算法#xff0c;如K最近邻#xff08;KNN#xff09;和K均值#xff08;K-Means我们经常需要知道个体间差异的大小进而评价个体的相似性和类别。最常见的是数据分析中的相关分析数据挖掘中的分 类和聚类算法如K最近邻KNN和K均值K-Means。当然衡量个体差异的方法有很多最近查阅了相关的资料这里整理罗列下。 为了方便下面的解释和举例先设定我们要比较X个体和Y个体间的差异它们都包含了N个维的特征即Xx1, x2, x3, … xnYy1, y2, y3, … yn。下面来看看主要可以用哪些方法来衡量两者的差异主要分为距离度量和相似度度量。 距离度量 距离度量Distance用于衡量个体在空间上存在的距离距离越远说明个体间的差异越大。 欧几里得距离(Euclidean Distance) 欧氏距离是最常见的距离度量衡量的是多维空间中各个点之间的绝对距离。公式如下 因为计算是基于各维度特征的绝对数值所以欧氏度量需要保证各维度指标在相同的刻度级别比如对身高cm和体重kg两个单位不同的指标使用欧式距离可能使结果失效。 明可夫斯基距离(Minkowski Distance) 明氏距离是欧氏距离的推广是对多个距离度量公式的概括性的表述。公式如下 这里的p值是一个变量当p2的时候就得到了上面的欧氏距离。 曼哈顿距离(Manhattan Distance) 曼哈顿距离来源于城市区块距离是将多个维度上的距离进行求和后的结果即当上面的明氏距离中p1时得到的距离度量公式如下 切比雪夫距离(Chebyshev Distance) 切比雪夫距离起源于国际象棋中国王的走法我们知道国际象棋国王每次只能往周围的8格中走一步那么如果要从棋盘中A格(x1, y1)走到B格(x2, y2)最少需要走几步扩展到多维空间其实切比雪夫距离就是当p趋向于无穷大时的明氏距离 其实上面的曼哈顿距离、欧氏距离和切比雪夫距离都是明可夫斯基距离在特殊条件下的应用。 马哈拉诺比斯距离(Mahalanobis Distance) 既然欧几里得距离无法忽略指标度量的差异所以在使用欧氏距离之前需要对底层指标进行数据的标准化而基于各指标维度进行标准化后再使用欧氏距离就衍生出来另外一个距离度量——马哈拉诺比斯距离Mahalanobis Distance简称马氏距离。 相似度度量 相似度度量Similarity即计算个体间的相似程度与距离度量相反相似度度量的值越小说明个体间相似度越小差异越大。 向量空间余弦相似度(Cosine Similarity) 余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量余弦相似度更加注重两个向量在方向上的差异而非距离或长度上。公式如下 皮尔森相关系数(Pearson Correlation Coefficient) 即相关分析中的相关系数r分别对X和Y基于自身总体标准化后计算空间向量的余弦夹角。公式如下 Jaccard相似系数(Jaccard Coefficient) Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度因为个体的特征属性都是由符号度量或者布尔值标识因此无法衡量差异具 体值的大小只能获得“是否相同”这个结果所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。如果比较X与Y的Jaccard相似系 数只比较xn和yn中相同的个数公式如下 调整余弦相似度(Adjusted Cosine Similarity) 虽然余弦相似度对个体间存在的偏见可以进行一定的修正但是因为只能分辨个体在维之间的差异没法衡量每个维数值的差异会导致这样一个情况 比如用户对内容评分5分制X和Y两个用户对两个内容的评分分别为(1,2)和(4,5)使用余弦相似度得出的结果是0.98两者极为相似但从评 分上看X似乎不喜欢这2个内容而Y比较喜欢余弦相似度对数值的不敏感导致了结果的误差需要修正这种不合理性就出现了调整余弦相似度即所有维度上 的数值都减去一个均值比如X和Y的评分均值都是3那么调整后为(-2,-1)和(1,2)再用余弦相似度计算得到-0.8相似度为负值并且差异 不小但显然更加符合现实。 欧氏距离与余弦相似度 欧氏距离是最常见的距离度量而余弦相似度则是最常见的相似度度量很多的距离度量和相似度度量都是基于这两者的变形和衍生所以下面重点比较下两者在衡量个体差异时实现方式和应用环境上的区别。 借助三维坐标系来看下欧氏距离和余弦相似度的区别 从图上可以看出距离度量衡量的是空间各点间的绝对距离跟各个点所在的位置坐标即个体特征维度的数值直接相关而余弦相似度衡量的是空间向 量的夹角更加的是体现在方向上的差异而不是位置。如果保持A点的位置不变B点朝原方向远离坐标轴原点那么这个时候余弦相似度cosθ是保持不变 的因为夹角不变而A、B两点的距离显然在发生改变这就是欧氏距离和余弦相似度的不同之处。 根据欧氏距离和余弦相似度各自的计算方式和衡量特征分别适用于不同的数据分析模型欧氏距离能够体现个体数值特征的绝对差异所以更多的用于 需要从维度的数值大小中体现差异的分析如使用用户行为指标分析用户价值的相似度或差异而余弦相似度更多的是从方向上区分差异而对绝对的数值不敏感 更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异同时修正了用户间可能存在的度量标准不统一的问题因为余弦相似度对绝对数值不敏感。 上面都是对距离度量和相似度度量的一些整理和汇总在现实的使用中选择合适的距离度量或相似度度量可以完成很多的数据分析和数据挖掘的建模后续会有相关的介绍。 附件为python部分相似度算法 #!/usr/bin/python #codingutf-8 critics { Lisa:{ Lady in the water:2.5, Snake on a plane :3.5 }, Tom:{ Lady in the water:3.0, Snake on a plane :4.0 }, Jerry:{ Lady in the water:2.0, Snake on a plane :3.0 }, WXM:{ Lady in the water:3.3, Snake on a plane :4.2 }, jhz:{ Lady in the water:3.9, Snake on a plane :4.5 } } from math import sqrt 欧几里得空间法 计算相似度 def sim_distance(p1, p2): c set(p1.keys())set(p2.keys()) if not c: return 0 sum_of_squares sum([pow(p1.get(sk)-p2.get(sk),2) for sk in c]) p 1/(1sqrt(sum_of_squares)) return p 皮尔逊相关度 def sim_distance_pearson(p1,p2): c set(p1.keys())set(p2.keys()) if not c: return 0 s1 sum([p1.get(sk) for sk in c]) s2 sum([p2.get(sk) for sk in c]) sq1 sum([pow(p1.get(sk),2) for sk in c]) sq2 sum([pow(p2.get(sk),2) for sk in c]) ss sum([p1.get(sk)*p2.get(sk) for sk in c]) n len(c) num ss-s1*s2/n den sqrt((sq1-pow(s1,2)/n)*(sq2-pow(s2-2)/n)) if den 0: return 0 p num/den return p Jaccard系数 def sim_distance_jaccard(p1,p2): c set(p1.keys())set(p2.keys()) if not c: return 0 ss sum([p1.get(sk)*p2.get(sk) for sk in c]) sq1 sum([pow(sk,2) for sk in p1.values()]) sq2 sum([pow(sk,2) for sk in p2.values()]) p float(ss)/(sq1sq2-ss) return p 余弦相似度 def sim_distance_cos(p1,p2): c set(p1.keys())set(p2.keys()) if not c: return 0 ss sum([p1.get(sk)*p2.get(sk) for sk in c]) sq1 sqrt(sum([pow(p1.get(sk),2) for sk in p1.values()])) sq2 sqrt(sum([pow(p2.get(sk),2) for sk in p2.values()])) p float(ss)/(sq1*sq2) return p 得到top相似度高的前几位 def topMatches(prefs,person,n5,similaritysim_distance_pearson): scores [similarity(prefs,person,other) for other in prefs if other ! person] scores.sort() scores.reverse() return scores[0:n] #利用所有他人评价值加权平均,为某人提供建议. def getRecommendations(prefs, person, similaritysim_distance): totals {} simSums {} for other in prefs: if other person: continue sim similarity(prefs,person,other) #忽略评价值为0或小于0的情况. if sim0: continue for item in prefs[other]: #只对自己还未曾看过的影片进行评价. if item not in prefs[person] or prefs[person][item] 0 : totals.setdefault(item, 0) totals[item] sim*prefs[other][item] #相似度之和 simSums.setdefault(item, 0) simSums[item] sim #建立一个归一化的列表. rankings [(total/simSums[item],item) \ for item,total in totals.items()] rankings.sort() rankings.reverse() return rankings 参考文献: [1]http://webdataanalysis.net/reference-and-source/distance-and-similarity/ [2]http://wpxiaomo.sinaapp.com/archives/424 [3]http://wpxiaomo.sinaapp.com/archives/423 [4]集体智慧编程转载于:https://www.cnblogs.com/rxingyue/p/5945124.html