常用的相似度计算

在数据分析和数据挖掘的过程中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分 类和聚类算法,如K最近邻(KNN)和K均值(K-Means)。当然衡量个体差异的方法有很多,最近查阅了相关的资料,这里整理罗列下。

  为了方便下面的解释和举例,先设定我们要比较X个体和Y个体间的差异,它们都包含了N个维的特征,即X=(x1, x2, x3, … xn),Y=(y1, y2, y3, … yn)。下面来看看主要可以用哪些方法来衡量两者的差异,主要分为距离度量和相似度度量。

 

距离度量

  距离度量(Distance)用于衡量个体在空间上存在的距离,距离越远说明个体间的差异越大。

 

欧几里得距离(Euclidean Distance)

  欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:

Euclidean Distance

  因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别,比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效。

 

明可夫斯基距离(Minkowski Distance)

  明氏距离是欧氏距离的推广,是对多个距离度量公式的概括性的表述。公式如下:

Minkowski Distance

  这里的p值是一个变量,当p=2的时候就得到了上面的欧氏距离。

 

曼哈顿距离(Manhattan Distance)

  曼哈顿距离来源于城市区块距离,是将多个维度上的距离进行求和后的结果,即当上面的明氏距离中p=1时得到的距离度量公式,如下:

Manhattan Distance

 

切比雪夫距离(Chebyshev Distance)

  切比雪夫距离起源于国际象棋中国王的走法,我们知道国际象棋国王每次只能往周围的8格中走一步,那么如果要从棋盘中A格(x1, y1)走到B格(x2, y2)最少需要走几步?扩展到多维空间,其实切比雪夫距离就是当p趋向于无穷大时的明氏距离:

Chebyshev Distance

  其实上面的曼哈顿距离、欧氏距离和切比雪夫距离都是明可夫斯基距离在特殊条件下的应用。

 

马哈拉诺比斯距离(Mahalanobis Distance)

  既然欧几里得距离无法忽略指标度量的差异,所以在使用欧氏距离之前需要对底层指标进行数据的标准化,而基于各指标维度进行标准化后再使用欧氏距离就衍生出来另外一个距离度量——马哈拉诺比斯距离(Mahalanobis Distance),简称马氏距离。

 

相似度度量

  相似度度量(Similarity),即计算个体间的相似程度,与距离度量相反,相似度度量的值越小,说明个体间相似度越小,差异越大。

 

向量空间余弦相似度(Cosine Similarity)

  余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。公式如下:

Cosine Similarity

 

皮尔森相关系数(Pearson Correlation Coefficient)

  即相关分析中的相关系数r,分别对X和Y基于自身总体标准化后计算空间向量的余弦夹角。公式如下:

Pearson Correlation Coefficient

 

Jaccard相似系数(Jaccard Coefficient)

  Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具 体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。如果比较X与Y的Jaccard相似系 数,只比较xn和yn中相同的个数,公式如下:

Jaccard Coefficient

 

调整余弦相似度(Adjusted Cosine Similarity)

  虽然余弦相似度对个体间存在的偏见可以进行一定的修正,但是因为只能分辨个体在维之间的差异,没法衡量每个维数值的差异,会导致这样一个情况: 比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为相似,但从评 分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上 的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负值并且差异 不小,但显然更加符合现实。

 

欧氏距离与余弦相似度

  欧氏距离是最常见的距离度量,而余弦相似度则是最常见的相似度度量,很多的距离度量和相似度度量都是基于这两者的变形和衍生,所以下面重点比较下两者在衡量个体差异时实现方式和应用环境上的区别。

  借助三维坐标系来看下欧氏距离和余弦相似度的区别:

distance and similarity

  从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向 量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似度cosθ是保持不变 的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。

 

  根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于 需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感, 更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。

 

  上面都是对距离度量和相似度度量的一些整理和汇总,在现实的使用中选择合适的距离度量或相似度度量可以完成很多的数据分析和数据挖掘的建模,后续会有相关的介绍。

附件为python部分相似度算法:

#!/usr/bin/python
#coding=utf-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/(1+sqrt(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)/(sq1+sq2-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,n=5,similarity=sim_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, similarity=sim_distance):
    totals = {}
    simSums = {}
 
    for other in prefs:
        if other == person: continue
        sim = similarity(prefs,person,other)
        #忽略评价值为0或小于0的情况.
        if sim<=0: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转C#窗体-属性、方法和事件详细说明

文章目录简介Windows窗体的基本属性一、布局属性1、StartPosition属性2、Location属性3、尺寸属性4、WindowsState属性5、Autoscroll属性6、AutoSize属性二、样式属性1、ControlBox属性2、MaximizeBox属性3、MinimizeBox属性4、HelpButton属性5、ShowIcon属性6、Icon属性7、Sho…

for循环和数组练习

//公鸡2文&#xff0c;母鸡1文&#xff0c;小鸡半文&#xff0c;每种至少一只&#xff0c;100文买100只鸡有多少种可能var ci 0; for(var g1;g<50;g){for(var m1;m<100;m){for(var x1;x<100;x){if(g*2m*1x*(0.5)100&&gmx100){ci1;console.log("买公鸡&qu…

c# automapper 使用

一、最简单的用法 有两个类User和UserDto 1 public class User2 {3 public int Id { get; set; }4 public string Name { get; set; }5 public int Age { get; set; }6 }7 8 public class UserDto9 { 10 public string Na…

API设计原则 - Qt官网的设计实践总结

原文链接&#xff1a;API Design Principles - Qt Wiki 基于Gary的影响力上 Gary Gao 的译文稿&#xff1a;C的API设计指导 译文发在酷壳 - CoolShell&#xff1a;API设计原则&#xff0c; 2017-07-25 API设计原则 - Qt官网的设计实践总结 &#x1f34e; 译序 Qt的设计水准在业…

QtCreator5.12.6安装图文教程

前言接触过Qt的同学肯定用过QtCreator,本id最近常用&#xff0c;也就写个教程记录一下安装的过程。可能比较少人学过Qt&#xff0c;感觉Qt还是挺不错的&#xff0c;做出来的界面还算好看&#xff0c;关键是跨平台。说明&#xff1a;安装的系统&#xff1a;win10专业版QtCreator…

H.264学习(一)——帧和场的概念

一、何谓场&#xff1f; 每个电视帧都是通过扫描屏幕两次而产生的&#xff0c;第二个扫描的线条刚好填满第一次扫描所留下的缝隙。每个扫描即称为一个场。因此 25 帧/秒的电视画面实际上为 50 场/秒 (若为 NTSC 则分别为 30 & 60 - 因为我是中国人&#xff0c;因此我采用 P…

RabbitMQ for windows

一、搭建环境 Rabbit MQ 是建立在强大的Erlang OTP平台上&#xff0c;因此安装RabbitMQ之前要先安装Erlang。 erlang&#xff1a;http://www.erlang.org/download.html rabbitmq&#xff1a;http://www.rabbitmq.com/download.html 我目前使用的&#xff1a;http://pan.baidu.c…

圆环内外圆毛刺(凸起)缺口(凹陷)检测halcon

文章目录处理要求处理方法1方法一思路方法一halcon源码处理效果处理方法2方法二思路方法二halcon源码处理效果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 椭圆/圆环&#xff08;产品易变形&#xff0c;为椭圆&#xff09;内外圆…

什么是单播、多播和广播br

什么是单播、多播和广播   “单播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“广播”&#xff08;Broadcast&#xff09;这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究竟是什么意思&#xff1f;区别何在&#…

圆环同心度测量halcon

文章目录处理要求处理源码处理结果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 测量圆环同心度 处理源码 read_image (Image, C:/Users/22967/Desktop/图像Barrel 20201024/201024 手机行业 摄像头检测/Barrel 背光/Pic_2020_…

IP组播与组播协议

IP组播与组播协议 2008-4-27来源:不详 作者:佚名 点击&#xff1a;次在Internet上&#xff0c;多媒体业务诸如&#xff1a;流媒体&#xff0c;视频会议和视频点播等&#xff0c;正在成为信息传送的重要组成部分。点对点传输的单播方式不能适应这一类业务传输特性--单点发送多点…

Spring Cloud的应用程序—上下文服务

2019独角兽企业重金招聘Python工程师标准>>> Spring Boot对于如何使用Spring构建应用程序有一个看法&#xff1a;例如它具有常规配置文件的常规位置&#xff0c;以及用于常见管理和监视任务的端点。Spring Cloud建立在此之上&#xff0c;并添加了一些可能系统中所有…

halcon圆环完整度检测

文章目录处理要求程序源码处理结果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 查找好的圆环&#xff0c;检测圆环不良 程序源码 read_image (Image, F:/HALCON/圆环完整性检测/6.bmp) rgb1_to_gray (Image, GrayImage) v…

圆环划痕检测halcon

文章目录处理要求处理源码处理效果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 查找圆环缺陷 处理源码 read_image (Image, F:/HALCON/圆环划痕处理/10_33221_ba4582f0e88ec79.bmp) rgb3_to_gray (Image, Image, Image, Image…

日志OLAP:在SQL中使用UDF, lambda函数使用案例

场景 日志服务内置了20类SQL函数。面对用户复杂的业务场景&#xff0c;例如使用json来沉淀业务数据&#xff0c;普通的SQL函数可能就无法满足需求&#xff0c;需要一些用户自定义处理逻辑。为了处理json类的业务数据&#xff0c;我们可以采用把json展开成多行的形式进行统计分析…

瓶子个数计数halcon

文章目录处理要求处理方法一源码效果方法二源码效果博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 处理要求 查找纸箱内瓶子个数 处理方法一 源码 dev_clear_window () dev_open_window (0, 0, 640*1.5, 512*1.5, black, WindowHandle…

halcon自动对焦算法

1、介绍 图像清晰度是衡量图像质量的一个重要指标&#xff0c;对于相机来说&#xff0c;其一般工作在无参考图像的模式下&#xff0c;所以在拍照时需要进行对焦的控制。对焦不准确&#xff0c;图像就会变得比较模糊不清晰。相机对焦时通过一些清晰度评判指标&#xff0c;控制镜…

HTML学习笔记06-连接

HTML超链接 HTML使用标签<a>来设置文本超链接。 超链接可以是文字&#xff0c;也可以是图片&#xff0c;点击这些内容跳转到新的文档或当前文档的某个部分 代码类似这样&#xff1a; <a href"url">连接文本</a> 实例&#xff1a; <!DOCTYPE HTM…

在Xcode中使用Git进行源码版本控制

在Xcode中使用Git进行源码版本控制 在应用程序开发过程中&#xff0c;很重要的一部分工作就是如何进行源码的版本控制。当代码出现问题时&#xff0c;我们就需要将代码恢复到原先正常的版本。如果是多个人共同开发一个项目&#xff0c;那么代码的控制就会非常复杂。幸运的是&am…

ASP.NET Web API之消息[拦截]处理(转)

出处&#xff1a;http://www.cnblogs.com/Leo_wl/p/3238719.html 标题相当难取&#xff0c;内容也许和您想的不一样&#xff0c;而且网上已经有很多这方面的资料了&#xff0c;我不过是在实践过程中作下记录。废话少说&#xff0c;直接开始。 Exception 当服务端抛出未处理异常…