———–题目不是用来刷的,是用来思考的!—————
目录
题目
1.1 欧式距离
1.2 曼哈顿距离
——————————-思考——高手的分割线———————————–
- 距离的美学
- 样本相似性度量
2.1 闵氏距离
2.1.1 曼哈顿距离/绝对值距离
2.1.2 欧几里得距离
2.1.3 切比雪夫距离
2.1.4 闵氏距离的共同点
2.2 马氏距离
2.3 从概率角度看马氏/欧式距离
2.4 杰卡德相似系数 - 变量间的相似度度量
3.1 相关系数
3.2 余弦相似度 - 两个概率分布间的相似度度量
4.1 从极大似然估计谈到KL散度
4.2 巴氏距离 - 对信息的相似度度量
- 类,群或社区间的相似性度量
- 我眼中的距离到底有多美
前言
对于学生而言,除了参加竞赛,另一个能增强自己实力的方法就是刷题。为什么刷题能起那么大的用处,我也是听到了coursera上learning how to learn的老师讲了之后才宛然大悟的,虽是数学系的学生,但自己平时做的题确实是很少。所以从今天开始,争取每天整几道关于机器学习,深度学习的面试题,从面试题中整理知识,同时看一下每个考点都是怎么在实际工程中应用的,以及它和其他相关联的知识点之间的关系是什么?
今天是第一篇,看一下距离的考点。
1. 题目
在k近邻或knn中,我们常用欧式距离来计算最近的邻居之间的距离,有时也用曼哈顿距离,请说说他们之间的差别?
答:
1.1 欧式距离
(1)欧式距离是由闵氏距离的参数q取2的时候推导出来的,比如计算点 x=(x1,x2,⋯,xn),y=(y1,y2,⋯,yn) 的欧式距离可以表示为:
缺点1:要求计算距离的指标必须处于同一量纲下。但我们可以对各个指标进行标准化,使其转换为同一分布
缺点2:欧式距离要求各个坐标对距离的贡献应该是相同的,且变差相同。(一个坐标轴就表示一个变量,变差表示一个变量两个不同取值的偏差)
解决方法就是 对欧式距离公式进行一定的改写:d2(xik,xjk)=[∑k=1p(xik−xjkskk)2]12其中 skk 表示变量k的标准差,就是把分布都标准化到均值为0,方差为1的标准正态分布。
1.2 曼哈顿距离
曼哈顿距离又称为城市区块距离,是在欧几里得空间中的固定直角坐标系上的两点所形成的线段对坐标轴的投影之和。如图所示:
如图所示,红线,蓝线,黄线均为曼哈顿距离 =12,绿色为欧几里得距离= 6X2‾‾√=8.48
之所以又称为城市区块距离,是因为从一个十字路口转到下一个十字路口,走的就是曼哈顿距离,如果你能穿越大楼,沿着直线走就是欧几里得距离。
——————————-思考——高手的分割线———————————–
1.距离的美学
最常见的应该就是欧式距离了,查看维基百科,可以发现欧式距离定义为在欧几里得空间中两点间的普通距离。注意最关键的是两点间的距离,也就是说只要计算欧几里得距离,就一定存在两点,你可能会说,这不是废话吗?
请问你怎么定义两点?
我是数学系的,学数学的人应该都知道,数学是对这个世界的高度抽象。如果从你问一个数学老师,什么是无穷大,老师展示不出来给你,如果你问他,那我能不能看一下点,数学老师可能也拿不出一个点给你看。因为那是抽象出来的,在大尺度上,人可以是一个点,在纸上用笔点一下,也是一个点,你可以把一栋楼,一个城市,甚至一个国家看成点,关键在于你怎么看待它。
这有个视频,看完你会更理解我想表达的是什么?点我:powers of ten
我在说什么?既然什么东西都能看成是一个点,那我就把距离抽象为两个东西的相互作用的关系,这两个东西你可以认为它是两个点,两个向量,两个分布,那距离就更广泛了,我一起来看一下一般公认的距离都有什么?怎么定义的!
2. 样本相似性度量
2.1 闵氏距离
要用数量化的方法对事物进行分类,就要用数量化的方法来定义每个样本的相似程度,这个相似程度在数学上可以用距离来衡量,最常用的闵氏距离:
2.1.1 曼哈顿距离/绝对值距离
当q=1时,可以得到曼哈顿距离。
前面已经有对于该距离的定义了,这是它的数学表达式。
from scipy.spatial.distance import _validate_vector
def cityBlock(u,v):
u = _validate_vector(u)
v = _validate_vector(v)
return abs(u-v).sum()
2.1.2 欧几里得距离
当q=2时可以得到欧几里得距离:
from scipy.spatial.distance import _validate_vector
from numpy import linalg as LA
def euclidean(u,v):
u = _validate_vector(u)
v = _validate_vector(v)
return LA.norm(u-v)
这样也可以:
def euclidean(u,v):
u = _validate_vector(u)
v = _validate_vector(v)
s = abs(u-v)**2
s = s.sum()
return np.sqrt(s)
欧几里得距离前面也仔细说了,这就不细说了。
2.1.3 切比雪夫距离
当 q=∞ 时,可以得到切比雪夫距离: