首先是一段计算4个相似度的Python代码。

需要注意的是,进行归一化操作后,4个函数取值范围都是0-1,而且都是数值越大表示相似性越高,数值为1代表完全相似。

import numpy as npdef CalSimEuD(dataA,dataB):'''【目的】计算欧氏距离(对应值的差平方之和再开方),注重数据之间的绝对位置而不是方向【输入】np.array【输出】已进行归一化,取值(0,1],数值越大表示相似性越高,数值为1代表完全相似'''#np.linalg.norm用于范数计算,默认二范数,相当于平方和开根号#原始取值为(0,正无穷),归一化到(0,1]区间:1/(1+原始值)return 1/(1+np.linalg.norm(dataA-dataB))def CalSimCosine(dataA,dataB):'''【目的】计算余弦相似度,注重数据的方向而非绝对位置【输入】np.array【输出】已进行归一化,取值[0,1],数值越大表示相似性越高,数值为1代表完全相似'''sumData=np.dot(dataA,dataB)#公式中的分子,向量的内积#np.linalg.norm用于范数计算,默认二范数,相当于平方和开根号denom=np.linalg.norm(dataA)*np.linalg.norm(dataB)#公式中的分母#原始取值为[-1,1],归一化到[0,1]区间:0.5 + 0.5 * 原始值return 0.5+0.5*(sumData/denom)def CalSimPearson(dataA,dataB):'''【目的】计算皮尔逊相关系数,是对余弦相似度的修正,分子和分母都需要减去输入数据集各自本身向量的均值,以达到中心化【输入】np.array,不可以输入常量数组如[1,1]【输出】已进行归一化,取值[0,1],数值越大表示相似性越高,数值为1代表完全相似'''# np直接计算出的皮尔逊相关系数取值范围[-1,1],归一化到[0,1]区间:0.5 + 0.5 * 原始值return 0.5 + 0.5 * np.corrcoef(dataA,dataB,rowvar = 0)[0][1]def CalSimJaccard(dataA,dataB):'''【目的】计算Jaccard相似度,度量集合之间的差异,共有的元素越多则越相似【输入】np.array【输出】取值[0,1],数值越大表示相似性越高,数值为1代表完全相似'''A_len,B_len=len(dataA),len(dataB)C=[i for i in dataA if i in dataB]#取交集C_len=len(C)#交集含有元素的个数return C_len/(A_len+B_len-C_len)

然后举三个例子。

例1:

x1 = np.array([1,2,3])
x2 = np.array([1,2,3])
print('完全相同的情况下,三个相似度结果都是1代表完全相似')
print('\n欧氏距离:',CalSimEuD(x1,x2))
print('\n余弦相似度:',CalSimCosine(x1,x2))
print('\n皮尔逊(归一化版):',CalSimPearson(x1,x2))
print('\nJaccard相似度:',CalSimJaccard(x1,x2))
完全相同的情况下,三个相似度结果都是1代表完全相似欧氏距离: 1.0余弦相似度: 1.0皮尔逊(归一化版): 1.0Jaccard相似度: 1.0

例2:

#注意,直接用列表list不能实现一一对应相加,需要用np的数组array
x1 = np.array([1,2])
x2 = np.array([300,600])
print('''绝对位置远,欧式相似度低;方向一样,则余弦1代表完全相似;方向一样,则皮尔逊1代表完全相似;无相同元素,Jaccard相似度为0''')
print('\n欧氏距离:',CalSimEuD(x1,x2))
print('\n余弦相似度:',CalSimCosine(x1,x2))
print('\n皮尔逊(归一化版):',CalSimPearson(x1,x2))
print('\nJaccard相似度:',CalSimJaccard(x1,x2))
绝对位置远,欧式相似度低;方向一样,则余弦1代表完全相似;方向一样,则皮尔逊1代表完全相似;无相同元素,Jaccard相似度为0欧氏距离: 0.0014934638734159808余弦相似度: 1.0皮尔逊: 1.0Jaccard相似度: 0.0

例3:

x1 = np.array([0.01,0.02])
x2 = np.array([-0.01,-0.02])
print('''绝对位置很接近,欧氏相似性很高接近1;方向完全相反,余弦相似度为0代表完全不相似;方向完全相反,皮尔逊为0代表完全不相似;无相同元素,Jaccard相似度为0''')
print('\n欧氏距离:',CalSimEuD(x1,x2))
print('\n余弦相似度:',CalSimCosine(x1,x2))
print('\n皮尔逊(归一化版):',CalSimPearson(x1,x2))
print('\nJaccard相似度:',CalSimJaccard(x1,x2))
绝对位置很接近,欧氏相似性很高接近1;方向完全相反,余弦相似度为0代表完全不相似;方向完全相反,皮尔逊为0代表完全不相似;无相同元素,Jaccard相似度为0欧氏距离: 0.9571930265030102余弦相似度: 0.0皮尔逊: 0.0Jaccard相似度: 0.0

通过上面的例子可以看到,皮尔逊和余弦相似性的结果比较接近,注重的是向量的方向。

欧氏距离注重的是两个向量绝对位置的差异。

Jaccard注重的是两个向量内部完全相同元素的比例。

除此之外,还有调整余弦相似性,和皮尔逊比较相似,但是去中心化方式有所差异。

附:本文计算相似度的核心代码部分参考《机器学习算法竞赛实战》。

欧氏距离、余弦相似度、Jaccard相似度、皮尔逊的Python代码与实例相关推荐

  1. ML:图像数据、字符串数据等计算相似度常用的十种方法(余弦相似性、皮尔逊、闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离、马氏距离、汉明距离、编辑距离、杰卡德相似系数、相对熵/KL散度、Helli

    ML:图像数据.字符串数据等计算相似度常用的十种方法(余弦相似性.皮尔逊.闵可夫斯基距离/曼哈顿距离/欧氏距离/切比雪夫距离.马氏距离.汉明距离.编辑距离.杰卡德相似系数.相对熵/KL散度.Helli ...

  2. 利用协同过滤算法的皮尔逊系数:计算歌曲相似度

    想要什么 数据已经足够多了,我现在想法就是单独维护一张歌曲相似度的表,每首歌曲有10首相似度歌曲,并且有相似度的程度,介于0到1之间. 首先来明确我有什么,我有3张表. user表:用户1.4万左右 ...

  3. 纽曼皮尔逊准则Matlab实现,基于聂曼-皮尔逊准则的skip模式快速选择方法

    基于聂曼-皮尔逊准则的skip模式快速选择方法 [技术领域] [0001] 本发明属于视频编码技术领域,基于新一代视频编码标准化曲Efficiency VideoCoding(肥VC),具体对肥VC的 ...

  4. 拉普拉斯, 高斯, 高尔顿, 皮尔逊, 戈塞特, 费歇尔对统计学的发展贡献

    由于人类的统计实践是随着计数活动而产生的,因此,统计发展史可以追溯到远古的原始社会,也就是说距今足有五千多年的漫长岁月.但是,能使人类的统计实践 上升到理论上予以概括总结的程度,即开始成为一门系统的学 ...

  5. Pearson(皮尔逊)相关系数[ Pearson product-moment correlation coefficient; PPMCC或PCCs]

    欧几里德距离 欧几里得度量定义欧几里得空间中点 x = (x1,...,xn) 和 y = (y1,...,yn) 之间的距离为 但是当评价结果中,评价者的评价相对于平均水平偏离很大的时候欧几里德距离 ...

  6. 皮尔逊相关性_皮尔逊的相关性及其在机器学习中的意义

    皮尔逊相关性 Today we would be using a statistical concept i.e. Pearson's correlation to help us understan ...

  7. 皮尔逊、斯皮尔曼、肯德尔等级应用场景及代码实现(附Python代码)

    本文结合Python的scipy.stats,简单梳理皮尔逊Pearson.斯皮尔曼Spearman.肯德尔等级Kendallta三个相关系数的运用场景:及Python中如何计算三个相关系数. 1.统 ...

  8. Pearson皮尔逊,Kendall肯德尔和Spearman斯皮尔曼三种相关分析方法的异同

    在SPSS软件相关分析中,pearson(皮尔逊),kendall(肯德尔)和spearman(斯伯曼/斯皮尔曼)三种相关分析方法有什么异同      两个连续变量间呈线性相关时,使用Pearson积 ...

  9. 皮尔逊(Pearson)相关系数与spearman相关系数(Python实现)

    概念介绍 相关系数:考察两个事物(在数据里我们称之为变量)之间的相关程度. 相关系数大小解释 相关性 绝对值 无相关 0 - 0.09 弱相关 0.1 - 0.3 中相关 0.3 - 0.5 强相关 ...

最新文章

  1. 寫博客過程中遇到的問題
  2. IntelliJ IDEA添加过滤文件或目录
  3. c+和python哪个快-C/C++比python快是什么意思?
  4. SLAM的前世今生 终于有人说清楚了
  5. Asp.net生成工作流、审批流的解决方案(asp.net workflow svg)
  6. 【多线程高并发】深入浅出volatile关键字
  7. iOS开发(10)UISegmentedControl
  8. jsp session
  9. 大地win11 32位旗舰版镜像v2021.08
  10. Windows Server 2008 活动目录备份的几种方法
  11. 不错的Feature设计:提建议并投票
  12. DeepStream不支持多 RTSP源(多个摄像头)
  13. FTPSFTP的基本命令
  14. java识别手写文字_Java 实现OCR 识别图像文字(手写中文)----tess4j
  15. 线性表的链式存储结构基本操作代码实现
  16. JavaScript使用url字符串拼接传递参数,截取参数
  17. 微信小程序标签页组件
  18. 李天平:技术以外的功夫
  19. 手把手教你如何通过大厂面试
  20. 插件GsonFormat快速实现JavaBean

热门文章

  1. 知识图谱学习笔记三(知识存储)
  2. 预产期计算器在线计算生男生女计算机,预产期计算器生男生女准吗
  3. Mac OS X 雪豹 snow leopard 免费升级 到 Lion 方法
  4. skr!《爱情公寓》电影版来了
  5. 新媒体运营教程:运营活动推广的几个技巧!
  6. 火爆 GitHub!这个图像分割神器开源了
  7. IPv6公共DNS现在提供加密DNS查询
  8. 第二章, 微格式:语义标注和常义冲突
  9. 分布式文件存储—fastDFS
  10. 聚焦Android之proguard混淆工具的使用