当前位置: 首页 > news >正文

matlab中cvx例子_机器学习中的相似性度量总结

核函数的含义是两个输入变量的相似度,描述相似度的方法有很多种,就本人的项目经验来说用的最多的是相关系数和欧氏距离。本文对机器学习中常用的相似性度量进行了总结。

作者:苍梧

链接:

https://www.cnblogs.com/heaad/archive/2011/03/08/1977733.html

在做分类时常常需要估算不同样本之间的相似性度量(Similarity Measurement),这时通常采用的方法就是计算样本间的“距离”(Distance)。采用什么样的方法计算距离是很讲究,甚至关系到分类的正确与否。

本文的目的就是对常用的相似性度量作一个总结。

目录


1. 欧氏距离

2. 曼哈顿距离

3. 切比雪夫距离

4. 闵可夫斯基距离

5. 标准化欧氏距离

6. 马氏距离

7. 夹角余弦

8. 汉明距离

9. 杰卡德距离 & 杰卡德相似系数

10. 相关系数 & 相关距离

11. 信息熵

1. 欧氏距离(Euclidean Distance)


欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式。

(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:

7128277e5e48e84164d75748de494fc9.png

(2)三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:

ec0b5239201677be8ecd9e960732b120.png

(3)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:

3189f12eb4dda8205f0c9de9c206e78e.png

  也可以用表示成向量运算的形式: 

724da3c48949524baf062de59bec4c67.png

(4)Matlab计算欧氏距离

Matlab计算距离主要使用pdist函数。若X是一个M×N的矩阵,则pdist(X)将X矩阵M行的每一行作为一个N维向量,然后计算这M个向量两两间的距离。

例子:计算向量(0,0)、(1,0)、(0,2)两两间的欧式距离

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X,'euclidean')

结果:

D =

    1.0000    2.0000    2.2361

2. 曼哈顿距离(Manhattan Distance)


从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(City Block distance)

(1)二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离

1fc691a792131f9f0de114efe214fc07.png

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的曼哈顿距离

bf83c0a776fa2a7daffa28eb7dbcd604.png

(3) Matlab计算曼哈顿距离

例子:计算向量(0,0)、(1,0)、(0,2)两两间的曼哈顿距离

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X, 'cityblock')

结果:

D =

     1     2     3

3. 切比雪夫距离 ( Chebyshev Distance )


国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max( | x2-x1 | , | y2-y1 | ) 步 。有一种类似的一种距离度量方法叫切比雪夫距离。

(1)二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离

9cc6398b8051ab77ad6257fc141e57be.png 

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的切比雪夫距离

7a15af48c1a30473f87d2c22ab9d14cb.png

这个公式的另一种等价形式是

看不出两个公式是等价的?提示一下:试试用放缩法和夹逼法则来证明。cfc3a8430b2d92500a9af2f826974352.png

(3)Matlab计算切比雪夫距离

例子:计算向量(0,0)、(1,0)、(0,2)两两间的切比雪夫距离

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X, 'chebychev')

结果:

D =

     1     2     2

4. 闵可夫斯基距离(Minkowski Distance)


闵氏距离不是一种距离,而是一组距离的定义。

(1) 闵氏距离的定义

       两个n维变量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

fda171a2e7b87d119cfe938e01f8c135.png

其中p是一个变参数。

当p=1时,就是曼哈顿距离

当p=2时,就是欧氏距离

当p→∞时,就是切比雪夫距离

根据变参数的不同,闵氏距离可以表示一类的距离。

(2)闵氏距离的缺点

  闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。

  举个例子:二维样本(身高,体重),其中身高范围是150~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。

       简单说来,闵氏距离的缺点主要有两个:(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

(3)Matlab计算闵氏距离

例子:计算向量(0,0)、(1,0)、(0,2)两两间的闵氏距离(以变参数为2的欧氏距离为例)

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X,'minkowski',2)

结果:

D =

    1.0000    2.0000    2.2361

5. 标准化欧氏距离 (Standardized Euclidean distance )


(1)标准欧氏距离的定义

标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集X的均值(mean)为m,标准差(standard deviation)为s,那么X的“标准化变量”表示为:

而且标准化变量的数学期望为0,方差为1。因此样本集的标准化过程(standardization)用公式描述就是:

a889a718502b7f9b650211ced58799f1.png

  标准化后的值 =  ( 标准化前的值  - 分量的均值 ) /分量的标准差

  经过简单的推导就可以得到两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的标准化欧氏距离的公式:

12014998cb9dea560c8e58891dbb4155.png

如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)

(2)Matlab计算标准化欧氏距离

例子:计算向量(0,0)、(1,0)、(0,2)两两间的标准化欧氏距离 (假设两个分量的标准差分别为0.5和1)

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X, 'seuclidean',[0.5,1])

结果:

D =

    2.0000    2.0000    2.8284

6. 马氏距离(Mahalanobis Distance)


(1)马氏距离定义

有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为:

f288676b6de668b2d935d231bfe5c11a.png

       而其中向量Xi与Xj之间的马氏距离定义为:

9cf66a2efac500b7f49c3314685020d6.png

       若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:

9d875896978b12a489952647ebf7043e.png

       也就是欧氏距离了。

  若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。

(2)马氏距离的优缺点:量纲无关,排除变量之间的相关性的干扰。

(3) Matlab计算(1 2),( 1 3),( 2 2),( 3 1)两两之间的马氏距离

X = [1 2; 1 3; 2 2; 3 1]

Y = pdist(X,'mahalanobis')

结果:

Y =

    2.3452    2.0000    2.3452    1.2247    2.4495    1.2247

7. 夹角余弦(Cosine)


有没有搞错,又不是学几何,怎么扯到夹角余弦了?各位看官稍安勿躁。几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。

(1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

ed078bc2a1a34fcc301cbc81e9f19793.png

(2) 两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦

       类似的,对于两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。

dbba70765d17ebedb081b96c64bd1e05.png

  即:

6104293c9b5602ee041e22443c8961f3.png

夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。

夹角余弦的具体应用可以参阅参考文献[1]。

(3)Matlab计算夹角余弦

例子:计算(1,0)、( 1,1.732)、( -1,0)两两间的夹角余弦

X = [1 0 ; 1 1.732 ; -1 0]

D = 1- pdist(X, 'cosine')  % Matlab中的pdist(X, 'cosine')得到的是1减夹角余弦的值

结果:

D =

    0.5000   -1.0000   -0.5000

8. 汉明距离(Hamming distance)


(1)汉明距离的定义

两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。

应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。

(2)Matlab计算汉明距离

  Matlab中2个向量之间的汉明距离的定义为2个向量不同的分量所占的百分比。

    例子:计算向量(0,0)、(1,0)、(0,2)两两间的汉明距离

X = [0 0 ; 1 0 ; 0 2];

D = PDIST(X, 'hamming')

结果:

D =

    0.5000    0.5000    1.0000

9. 杰卡德相似系数(Jaccard similarity coefficient)


(1) 杰卡德相似系数

       两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。

d0904a9a6cbf4e93f201c5d68a6ef94e.png

  杰卡德相似系数是衡量两个集合的相似度一种指标。

(2) 杰卡德距离

       与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。杰卡德距离可用如下公式表示:

2272428420a3f9f6feb7cdb81de79661.png

  杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。

(3) 杰卡德相似系数与杰卡德距离的应用

       可将杰卡德相似系数用在衡量样本的相似度上。

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

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

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

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

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

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

这里p+q+r可理解为A与B的并集的元素个数,而p是A与B的交集的元素个数。

而样本A与B的杰卡德距离表示为:

ac21810ed988683dbace5f157d0637b8.png

(4)Matlab 计算杰卡德距离

Matlab的pdist函数定义的杰卡德距离跟我这里的定义有一些差别,Matlab中将其定义为不同的维度的个数占“非全零维度”的比例。

例子:计算(1,1,0)、(1,-1,0)、(-1,1,0)两两之间的杰卡德距离

X = [1 1 0; 1 -1 0; -1 1 0]

D = pdist( X , 'jaccard')

结果

D =

0.5000    0.5000    1.0000

10. 相关系数 ( Correlation coefficient )与相关距离(Correlation distance)


(1) 相关系数的定义

db18f8e00aace998750ffd663c18a3da.png

相关系数是衡量随机变量X与Y相关程度的一种方法,相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

(2)相关距离的定义 

20352485e901620d3979a86cb7f2ac29.png

(3)Matlab计算(1, 2 ,3 ,4 )与( 3 ,8 ,7 ,6 )之间的相关系数与相关距离

X = [1 2 3 4 ; 3 8 7 6]

C = corrcoef( X' )   %将返回相关系数矩阵

D = pdist( X , 'correlation')

结果:

C =

    1.0000    0.4781

    0.4781    1.0000

D =

0.5219

      其中0.4781就是相关系数,0.5219是相关距离。

11. 信息熵(Information Entropy)


信息熵并不属于一种相似性度量。那为什么放在这篇文章中啊?这个。。。我也不知道。(╯▽╰)

信息熵是衡量分布的混乱程度或分散程度的一种度量。分布越分散(或者说分布越平均),信息熵就越大。分布越有序(或者说分布越集中),信息熵就越小。

       计算给定的样本集X的信息熵的公式:

12f7ef71cf8b1661febaa229de562a39.png

参数的含义:

n:样本集X的分类数

pi:X中第i类元素出现的概率

信息熵越大表明样本集S分类越分散,信息熵越小则表明样本集X分类越集中。。当S中n个分类出现的概率一样大时(都是1/n),信息熵取最大值log2(n)。当X只有一个分类时,信息熵取最小值0

参考资料: 

[1]http://www.google.com.hk/ggblog/googlechinablog/2006/07/12_4010.html

[2] http://en.wikipedia.org/wiki/Jaccard_index

[3] Wikipedia. Hamming distance

http://en.wikipedia.org/wiki/Hamming_distance

[4] http://junjun0595.blog.163.com/blog/static/969561420100633351210/

[5] http://en.wikipedia.org/wiki/Pearson_productmoment_correlation_coefficient

2d26c7556b6b3c678bbdd273c3df805d.png

相关文章:

  • 8266连接mqtt发送消息_未读消息(小红点),前端 与 RabbitMQ 实时消息推送实践,贼简单~...
  • 容器删除元素后迭代器失效_Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)...
  • 3训练模型代码详解_一行代码不用写,就可以训练模型?
  • 计算各种形钢的重量用什么软件_钢结构防火防腐工程预算工程量计算方法
  • 神经网络训练的时间越来越长_基于对抗训练深度神经网络的时间序列分类
  • idea svn查看提交人_idea+svn看不到以前的版本记录,只能看往后的提交记录。先前的都用svnadmin表示了,为什么?...
  • 源码剖析_Scrapy 源码剖析(一)架构概览
  • linux4.1.15 rt补丁_听说你不知道 RT-Thread 有个 ringbuffer
  • python爬虫语言都能干什么_Python爬虫还能干什么?
  • xxl子任务_XXL-JOB(1) 分布式任务系统选型和XXL-JOB介绍
  • 徐小湛概率论与数理统计课件_考研数学 徐小湛教授线性代数90讲
  • 怎么下载python笔记_python学习笔记(1)python下载及运行
  • vue 给checkbox 赋值_vue中关于checkbox数据绑定v-model指令的个人理解
  • mysql中文乱码解决_java+mysql中文乱码问题
  • mysql查询之间的数据_如何从两个日期之间的MySQL查询获取数据?
  • 【mysql】环境安装、服务启动、密码设置
  • 【RocksDB】TransactionDB源码分析
  • 78. Subsets
  • C++11: atomic 头文件
  • HashMap剖析之内部结构
  • in typeof instanceof ===这些运算符有什么作用
  • java正则表式的使用
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Nodejs和JavaWeb协助开发
  • React-Native - 收藏集 - 掘金
  • 安卓应用性能调试和优化经验分享
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 简单易用的leetcode开发测试工具(npm)
  • 算法-插入排序
  • 跳前端坑前,先看看这个!!
  • 译米田引理
  • Hibernate主键生成策略及选择
  • Java总结 - String - 这篇请使劲喷我
  • ​用户画像从0到100的构建思路
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (剑指Offer)面试题34:丑数
  • (六)c52学习之旅-独立按键
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)用.Net的File控件上传文件的解决方案
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .CSS-hover 的解释
  • .describe() python_Python-Win32com-Excel
  • .net 程序发生了一个不可捕获的异常
  • .NET 事件模型教程(二)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET6 命令行启动及发布单个Exe文件
  • .NET应用架构设计:原则、模式与实践 目录预览
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • ::
  • @staticmethod和@classmethod的作用与区别