常见的距离算法和相似度(相关系数)计算方法

2023-11-20

摘要:

1.常见的距离算法

1.1欧几里得距离(Euclidean Distance)以及欧式距离的标准化(Standardized Euclidean distance)

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

1.3曼哈顿距离(Manhattan Distance)

1.4切比雪夫距离(Chebyshev Distance)

1.5明可夫斯基距离(Minkowski Distance)

1.6海明距离(Hamming distance)

2.常见的相似度(系数)算法

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

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

2.3Jaccard相似系数(Jaccard Coefficient)

2.4Tanimoto系数(广义Jaccard相似系数)

2.5对数似然相似度/对数似然相似率

2.6互信息/信息增益,相对熵/KL散度

2.7信息检索--词频-逆文档频率(TF-IDF)

2.8词对相似度--点间互信息

3.距离算法与相似度算法的选择(对比)

内容:

1.常见的距离算法

1.1欧几里得距离(Euclidean Distance)

公式:

标准欧氏距离的思路:现将各个维度的数据进行标准化:标准化后的值 = ( 标准化前的值 - 分量的均值 ) /分量的标准差,然后计算欧式距离

欧式距离的标准化(Standardized Euclidean distance)

公式:

 

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

公式:

  关系:若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离;如果去掉马氏距离中的协方差矩阵,就退化为欧氏距离。欧式距离就好比一个参照值,它表征的是当所有类别等概率出现的情况下,类别之间的距离;当类别先验概率并不相等时,马氏距离中引入的协方差参数(表征的是点的稀密程度)来平衡两个类别的概率。

 特点:量纲无关,排除变量之间的相关性的干扰。 

       扩展

1.3曼哈顿距离(Manhattan Distance)

公式:

  定义:通俗来讲,想象你在曼哈顿要从一个十字路口开车到另外一个十字路口实际驾驶距离就是这个“曼哈顿距离”,此即曼哈顿距离名称的来源,同时,曼哈顿距离也称为城市街区距离(City Block distance)。

1.4切比雪夫距离(Chebyshev Distance)

公式:

 

1.5明可夫斯基距离(Minkowski Distance)

定义:

关系:明氏距离是欧氏距离的推广,是对多个距离度量公式的概括性的表述。p=1退化为曼哈顿距离;p=2退化为欧氏距离;切比雪夫距离是明氏距离取极限的形式。这里明可夫斯基距离就是p-norm范数的一般化定义。

 下图给出了一个Lp球(||X||p=1)的形状随着P的减少的可视化图:

参照:浅谈L0,L1,L2范数及其应用机器学习中的范数与距离浅谈压缩感知(十):范数与稀疏性

   

1.6海明距离(Hamming distance)

定义:在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。

场景:在海量物品的相似度计算中可用simHash对物品压缩成字符串,然后使用海明距离计算物品间的距离 

参考simHash 简介以及 java 实现相似度计算常用方法综述通过simHash判断数组内容相同(或者网页排重)的测试代码

2.常见的相似度(系数)算法

2.1余弦相似度(Cosine Similarity)

公式:

定义:两向量越相似,向量夹角越小,cosine绝对值越大;值为负,两向量负相关。

不足:只能分辨个体在维之间的差异,没法衡量每个维数值的差异(比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为相似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性)

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

公式:,其中Here $\bar{R_{u}}$ is the average of the u-th user's ratings.

 

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

    

定义:两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商

    扩展

2.3Jaccard相似系数(Jaccard Coefficient)

公式:,这里X,Y不再是向量,而变成了集合

定义:Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。Jaccard系数等于样本集交集与样本集合集的比值。

计算:假设样本A和样本B是两个n维向量,而且所有维度的取值都是0或1。例如,A(0,1,1,0)和B(1,0,1,1)。我们将样本看成一个集合,1表示集合包含该元素,0表示集合不包含该元素。

p:样本A与B都是1的维度的个数

q:样本A是1而B是0的维度的个数

r:样本A是0而B是1的维度的个数

s:样本A与B都是0的维度的个数

那么样本A与B的杰卡德相似系数可以表示为:

      clip_image017

附:与Jaccard Coefficient相对应的是Jaccard 距离:d(X,Y) = 1 - Jaccard(X,Y);杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。(参考自余弦距离、欧氏距离和杰卡德相似性度量的对比分析)

 

2.4Tanimoto系数(广义Jaccard相似系数)

公式:

 

定义:广义Jaccard相似度,元素的取值可以是实数。又叫作谷本系数

关系:如果我们的x,y都是二值向量,那么Tanimoto系数就等同Jaccard距离。

 

2.5对数似然相似率

对于事件A和事件B,我们考虑两个事件发生的次数:

k11:事件A与事件B同时发生的次数
k12:B事件发生,A事件未发生
k21:A事件发生,B事件未发生
k22:事件A和事件B都未发生

    
rowEntropy = entropy(k11, k12) + entropy(k21, k22)
columnEntropy = entropy(k11, k21) + entropy(k12, k22)
matrixEntropy = entropy(k11, k12, k21, k22)
2 * (matrixEntropy - rowEntropy - columnEntropy)

  详情 扩展

2.6互信息/信息增益,相对熵/KL散度

互信息/信息增益:信息论中两个随机变量的相关性程度

公式:

    

    

相对熵/KL散度:又叫交叉熵,用来衡量两个取值为正数的函数(概率分布)的相似性

公式:

    

扩展:知乎问答

  2.7信息检索--词频-逆文档频率(TF-IDF)

《数学之美》中看到的TF-IDF算法,在网页查询(Query)中相关性以词频(TF)与逆文档频率(IDF)来度量查询词(key)和网页(page)的相关性;

网页中出现key越多,该page与查询结果越相关,可以使用TF值来量化

每个词的权重越高,也即一个词的信息量越大;比如“原子能”就比“应用”的预测能力强,可以使用IDF值来量化,这里的IDF《数学之美》中说就是一个特定条件下关键词的概率分布的交叉熵。

      

      2.8词对相似度--点间相似度

    

 

3.距离算法与相似度算法的选择(对比)

3.1 欧式距离和余弦相似度

欧几里得距离度量会受指标不同单位刻度的影响,所以一般需要先进行标准化,同时距离越大,个体间差异越大

空间向量余弦夹角的相似度度量不会受指标刻度的影响,余弦值落于区间[-1,1],值越大,差异越小

当两用户评分趋势一致时,但是评分值差距很大,余弦相似度倾向给出更优解。例如向量(3,3)和(5,5),这两位用户的认知其实是一样的,但是欧式距离给出的解显然没有余弦值合理。

余弦相似度衡量的是维度间相对层面的差异,欧氏度量衡量数值上差异的绝对值;一种长度与方向的度量所造成的不同;余弦相似度只在[0,1]之间,而马氏距离在[0,无穷)之间(注:以上参考自知乎问题

应用上如果要比较不同人的消费能力,可以使用欧式距离进行度量(价值度量);如果想要比较不同用户是否喜欢周杰伦,可以使用余弦相似度(定性度量)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见的距离算法和相似度(相关系数)计算方法 的相关文章

  • 层次聚类在MATLAB中实现

    层次聚类在MATLAB中实现 By Yang Liu 1 第一种方法 1 输入要聚类的数据 2 计算各个样本之间的欧氏距离 3 把距离化成矩阵 矩阵中的元素 X i j X ij Xij 表示第i个样本和第j个样
  • python深度学习之用lightgbm算法实现鸢尾花种类的分类任务实战源码

    本代码以sklearn包中自带的鸢尾花数据集为例 用lightgbm算法实现鸢尾花种类的分类任务 参考来源 https lightgbm readthedocs io en latest Python Intro html usr bin
  • 用户偏好分析

    1 量化用户偏好 首先将用户分类 设定用户对于产品 喜爱 的标准 比如一天浏览产品5次 计算不同分类用户 喜爱 不同产品的人数 例如 分类 A类用户 B类用户 产品1 10 40 产品2 40 10 用户偏好指某类用户更偏好某产品 例如表中
  • 机器学习实战笔记-01概览

    机器学习的主要挑战 1 数据问题 数据量不足 训练数据不具有代表性 需要可泛化的案例 注意采样偏差 数据质量差 错误 异常 缺失 形成了噪音 无关特征 特征工程 选取 提取 创建特征 2 算法问题 过拟合 噪音 模型过于复杂参数过多 欠拟合
  • 2023华为笔试机考题库【等和子数组的最小和/动态规划】

    题目描述 给定一个数组nums 将元素分为若干个组 使得每组和相等 求出满足条件的所有分组中 组内元素和的最小值 输入描述 第一行输入 m 接着输入m个数 表示此数组 数据范围 1 lt M lt 50 1 lt nums i lt 50
  • 2023-02-21 好用的一款十六进制编辑器软件Hex Editor Neo ,以十六进制字节形式查看文件有字节

    一 Hex Editor Neo是一款十六进制编辑器软件 可以在几秒钟内处理大文件的操作 能够帮助用户编辑ASCII 十六进制 十进制 float double和二进制数据的应用程序 感觉比notepad的hex查看功能更强大 用notep
  • 音视频开发开发核心知识+新手入门必看基础知识

    音视频开发是一个广泛的领域 它涉及到多个技术领域 包括音频编解码 视频编解码 媒体容器格式 流媒体传输 音视频处理等 以下是音视频开发的一些基础知识 音频编解码器 音频编解码器是将数字音频信号编码成一种压缩格式 并且能够解码压缩的音频数据以
  • android华为手机开启蓝牙耳机,华为手机如何连接蓝牙耳机? 华为手机连接蓝牙耳机方法教程介绍!...

    我们现在在用手机的时候经常会用到耳机 听歌接电话看视频都离不开耳机 但是有的时候如果觉得耳机插来插去很麻烦就可以尝试用蓝牙耳机 那么知道华为手机怎么连接蓝牙耳机吗 具体的连接方法是怎么样的呢 下面小编就给大家简单介绍一下具体的连接方法吧 连
  • 大数据面试之SQL面试题

    一 提要 作为一名数据工作人员 SQL是日常工作中最常用的数据提取 简单预处理语言 因为其使用的广泛性和易学程度也被其他岗位比如产品经理 研发广泛学习使用 本篇文章主要结合经典面试题 给出通过数据开发面试的SQL方法与实战 二 解题思路 简
  • vue3 通过自定义指令在table中滚动加载数据

    1 在utils文件中新建一个loadMore ts文件 import type Directive App from vue const debounce function func any delay any let timer any
  • Source insight 4.0 暗色主题,模仿Atom one-darkv配色方案

    我是在MAC OS 10 12下使用crossover安装的 在wine环境下装4 0有个无法解决的bug是toolbar非常的宽 所以我取消了 反正用快捷键可以代替 关于wine安装之后界面模糊的问题请参考我这个帖子http blog c
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • json字符串,本地存储讲解localstorage 和 sessionstorage及cookie,模板字符串初识

    这里写目录标题 json字符串 json格式的使用方法 对象的深拷贝狭义实现 localstorage 和 sessionstorage的区别 cookie 封装cookie函数 模板字符串初识 json字符串 abc123truelkgs
  • ElasticSearch基础(7.0+版本)

    一 ElasticSearch的用法 ES是基于Lucene开发的分布式高性能全文检索系统 支持分布式存储 水平扩展 主要能力是 存储 搜索 分析 我目前接触过的主要有两种用法 作为二级索引提高查询效率和基于关键词的全文检索 Lucene
  • 深入ftrace kprobe原理解析

    Linux krpobe调试技术是内核开发者专门为了编译跟踪内核函数执行状态所涉及的一种轻量级内核调试技术 利用kprobe技术 内核开发人员可以在内核的绝大多数指定函数中动态插入探测点来收集所需的调试状态信息而基本不影响内核原有的执行流程
  • 埋点的作用,如何埋点

    通过ThreadLocal和HandlerInterceptor实现java后台业务埋点日志功能 后端开发 埋点日志怎么做 流沙飞雪的博客 CSDN博客 埋点是什么 有什么作用 前端如何埋点 网页埋点 一只小可乐吖的博客 CSDN博客 用户
  • C#系列-继承

    00解释 1 命名空间 可以认为类是属于命名空间的 如果在当前项目中没有这个类的命名空间 需要我们手动的导入这个类所在的 命名空间 1 用鼠标去点 2 alt shift F10 3 记住命名空间 手动的去引用 2 在一个项目中引用另一个项
  • Qt快捷键(常用+非常详细)

    常用高频快捷键 Ctrl 多行注释 取消多行注释 Ctrl B 编译工程 Ctrl R 运行工程 Ctrl Alt up 向上箭头 当前行向上复制 Ctrl Alt down 向下箭头 当前行向下复制 Ctrl Shift up 向上箭头
  • ElasticSearch-快速入门(一)

    ES简介 全文搜索属于最常见的需求 开源的Elasticsearch 是目前全文搜索引擎的首选 它可以快速地储存 搜索和分析海量数据 维基百科 Stack Overflow Github 都采用它 Elastic 的底层是开源库Lucene
  • 每日作业20200525 - 图片相似度 ( 比较两个数组相似程度 )

    题目 图片相似度 输入两个由0和1构成的 3 3的矩形 如果两个矩形同坐标的值相同 则为像素点相同 相似度为两个矩形 相同像素点 总像素点 100 求图片相似度 样例输入 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 0 0

随机推荐

  • 行走的代码生成器:chatGPT要让谷歌和程序员“下岗”了

    就在本周 OpenAI 又发布了一个全新的聊天机器人模型 ChatGPT 作为 GPT 3 5 系列的主力模型之一 图片来源 OpenAI 更重要的是它是完全免费公开的 所以一经发布大家立刻就玩开了 很快 网友们就被 ChatGPT 的能力
  • vue 资料合集

    div class show content p UI组件 br a href https github com ElemeFE element target blank element a 11612 饿了么出品的Vue2的web UI工
  • virtualbox 网络地址转换(NAT)

    因为个人在工作的时候条件比较充足 基本上不需要用到 virtualbox 或者 vmware 等这些虚拟软件 一个是因为他们占用本机的资源挺大的 电脑配置稍微低点就很难受了 所以说的条件充足是因为我多了一台电脑 这台就被我当作练习使用 用的
  • SpringBoot中实现文件的上传和下载

    文件上传 实现策略 将文件上传到指定路径 并将文件的路径信息存储到数据库中 文件上传前台
  • IDEA如何进行debug调试

    IDEA如何进行debug调试 第一步 设断点 打开debug 第二步 使用Debug调试的功能键 程序调试 相信是所有程序员必经之路 因为程序写出来是不可能没有错误的 当然除了非常简单的一些程序之外 相信大家肯定使用过不同的编译软件 都有
  • Vs2019 社区版 内网登录

    问题概述 1 Vistual Studio Community 是免费版 但需要登陆授权 2 由于办公使用的是内网 也是使用离线下载方法安装的 因此无法联网登陆 解决方法 1 外网打开Vistual Studio Community 201
  • 第二十一章 webpack5原理loader概述

    简介 loader其实是一个函数 用来帮助 webpack 将不同类型的文件转换为 webpack 可识别的模块 loader的分类以及执行顺序 1 分类 pre 前置loader normal 普通loader inline 内联load
  • 编译型语言和解释型语言各自的特点和区别,Python的解释器

    编译型语言和解释型语言各自的特点和区别 Python的解释器 编译型语言 将源代码通过编译器编译生成可执行文件 机器指令 再由机器运行机器码 解释型语言 通过解释器逐行解释每一句源代码 打个比方 编译型相当于用中英文词典 翻译器 将一本英文
  • Vue如何封装组件

    要封装一个 Vue 组件 可以按照以下步骤进行操作 创建一个新的 Vue 单文件组件 vue 文件 并命名为你的组件名 例如 MyComponent vue 在组件文件中 使用
  • 关于python传参引发的一些思考

    人总有不会的 遇到一些问题深究下去必定有所收获 这个问题是在我写python爬虫项目的时候的疑问 可能是我太菜了 以前没学透彻 也可能是上学期学Java的时候按值传递的特点给搞混了 因为当时在用多线程的生产者消费者问题处理资源队列 参考别人
  • task_5 - 副本

    Task01 Task06树模型与集成学习笔记整理 1 Task01 信息论基础 决策树分类思想 用树的节点代表样本集合 通过某些判定条件来对节点内的样本进行分配 将它们划分到当前节点下的子节点 这样决策树希望各个子节点中类别的纯度之和应高
  • 内存文件系统提升磁盘性能瓶颈

    author skate time 2011 08 22 提升磁盘性能瓶颈 linux的内存文件系统 ramdisk ramfs tmpfs ramdisk 是块设备 在使用它们之前必须用选择文件系统将其格式化 并且调整文件系统大小比较麻烦
  • 【廖雪峰python进阶笔记】模块

    1 导入模块 要使用一个模块 我们必须首先导入该模块 Python使用import语句导入一个模块 例如 导入系统自带的模块 math import math 你可以认为math就是一个指向已导入模块的变量 通过该变量 我们可以访问math
  • Python Pandas导出Hbase数据到dataframe

    Python导出Hbase数据的思路 使用happybase连接Hbase 使用table scan 扫数据 将得到的数据整理为dataframe格式 将从Hbase中得到的byte类型的数据转为str类型的数据 示例代码 import h
  • 数据结构之哈希(C++实现)

    数据结构之哈希 C 1 哈希概念 顺序结构以及平衡树中 元素关键码与存储位置之间没有对应关系 因此在查找一个元素的时候 要经过关键码多次比较 顺序表查找的时间复杂度为O N 而平衡树中树的高度为O log 2 N 搜索的效率取决于搜索过程中
  • Mybatis

    文章目录 前言 业务逻辑 使用Mybatis实现 使用Mybatis plus实现 前言 工作的时候 遇到了需要将一个数据库的一些数据插入或更新到另一个数据库 一开始使用insert into TABLE col1 col2 VALUES
  • 全国大学生计算机技能应用大赛Java模拟题

    全国大学生计算机技能应用大赛Java模拟题 竞赛官网 http www cnccac com 单选题 1 以下哪个不是java的垃圾回收算法 A 标记清除算法 B 空间分配算法 C 标记整理算法 D 分代回收算法 2 下列名称在java语言
  • cocos 基础动作加上简单特效

    使用文理缓存创建精灵 cc Director getInstance getTextureCache addImage WechatIMG3 png localsp cc Sprite createWithTexture cc Direct
  • Error inflating class androidx.constraintlayout.widget.ConstraintLayout

    今天下载了android studio 3 3 1体验体验新版本来着 没想到新建项目直接来了个这个 android view InflateException Binary XML file line 2 Error inflating c
  • 常见的距离算法和相似度(相关系数)计算方法

    摘要 1 常见的距离算法 1 1欧几里得距离 Euclidean Distance 以及欧式距离的标准化 Standardized Euclidean distance 1 2马哈拉诺比斯距离 Mahalanobis Distance 1