范数与距离度量(python实现)

范数

norm则表示范数,函数参数如下:

x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)   

①x: 表示矩阵(也可以是一维)

②ord:范数类型

向量的范数:

范数.png

​ 矩阵的范数:

ord=1:列和的最大值

ord=2:|λE-A^TA|=0,求特征值,然后求最大特征值得算术平方根

ord=∞:行和的最大值

③axis:处理类型

axis=1表示按行向量处理,求多个行向量的范数

axis=0表示按列向量处理,求多个列向量的范数

axis=None表示矩阵范数。

④keepding:是否保持矩阵的二维特性

True表示保持矩阵的二维特性,False相反

import numpy as np 
from numpy import linalg

x = np.array([3,4])
# 向量范数(默认参数ord=None,axis=None,keepdims=False)
print('L1=\n',linalg.norm(x,ord=1))
print('L2=\n',linalg.norm(x))
print('L∞=\n',linalg.norm(x,ord=np.inf))

y = np.array([
        [0,3,4],
        [1,6,4]])
# 矩阵范数
print('矩阵1范数=\n',linalg.norm(y,ord=1))
print('矩阵2范数=\n',linalg.norm(y))
print('矩阵∞范数=\n',linalg.norm(y,ord=np.inf))

print('矩阵每个行向量求向量的1范数:',linalg.norm(y,ord=1,axis=1,keepdims=True)) 
L1=
 7.0
L2=
 5.0
L∞=
 4.0
矩阵1范数=
 9.0
矩阵2范数=
 8.831760866327848
矩阵∞范数=
 11.0
矩阵每个行向量求向量的1范数: [[ 7.]
 [11.]]
距离度量

闵可夫斯基距离

​ 严格意义上讲,闵可夫斯基距离不是一种距离,而是一组距离的定义。
两个n维变量A(x_{11}x_{12},…X_{1a})B(x_{21}x_{22},…x_{2n})间的闵可夫斯基距离定义为:
d_{12}=\sqrt[p]{\sum_{k=1}^{n}\left(x_{1 k}-x_{2 k}\right)^{p}}
其中p是一个变参数。

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

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

  • 当p=+\infty时,就是切比雪夫距离。
    根据p参数的不同,闵可夫斯基距离可以表示一类的距离。

欧式距离

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

(1)二维平面上两a(x_1,y_1)b(x_2,y_2)间的欧氏距离:
d_{12}=\sqrt{\left(x_{1}-y_{1}\right)^{2}+\left(x_{2}-y_{2}\right)^{2}}
(2)三维空间两点A(x_1,y_1,z_1)B(x_2,y_2,z_2)间的欧氏距离:
d_{12}=\sqrt{\left(x_{1}-x_{2}\right)^{2}+\left(y_{1}-y_{2}\right)^{2}+\left(z_{1}-z_{2}\right)^{2}}
(3)两个n维向量A(x_{11},x_{12}…x_{1n})B(x_{21},x_{22}...x_{2n})间的欧氏距离:
d_{12}=\sqrt{\sum_{k=1}^{n}\left(x_{1 k}-x_{2 k}\right)^{2}}
表示为向量运算的形式:
d_{12}=\sqrt{(A-B)(A-B)^{\mathrm{T}}}
代码实现:

import numpy as np 
vector1 = np.mat([1,2,3])
vector2 = np.mat([4,5,6])
print('欧氏距离:\n',np.sqrt((vector1-vector2)*(vector1-vector2).T))
欧氏距离:
 [[5.19615242]]

曼哈顿距离

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

(1)二维平面两点A(x_1,y_1)B(x_2,y_2)间的曼哈顿距离:
d_{12}=\left|x_{1}-x_{2}\right|+\left|y_{1}-y_{1}\right|
(2)两个n维向量A(x_{11},x_{12},...,x_{1n})B(x_{21},x_{22},...,x_{2n})间的曼哈顿距离:
d_{12}=\sum_{k=1}^{n}\left|x_{1 k}-x_{2 k}\right|
代码实现:

import numpy as np 
vector1 = np.mat([1,2,3])
vector2 = np.mat([4,5,6])
print('曼哈顿距离:\n',np.sum(np.abs(vector1-vector2)))
曼哈顿距离:
 9

切比雪夫距离

切比雪夫距离(L_\infty范数):最少步数总是max(|x_2-x_1|,|y_2-y_1|)

(1)二维平面两点A(x_1,y_1)B(x_2,y_2)间的切比雪夫距离:
d_{12}=\max \left(\left|x_{1}-x_{2}\right|,\left|y_{1}-y_{2}\right|\right)
(2)两个n维向量A(x_{11},x_{12},...,x_{1n})()B(x_{21},x_{22},…,x_{2n})间的切比雪夫距离:
d_{12}=\max _{i}\left(\left|x_{1 i}-x_{2 i}\right|\right)
这个公式的另一种等价形式是:
d_{12}=\lim _{k \rightarrow \infty}\left(\sum_{i=1}^{n}\left|x_{1 i}-x_{2 i}\right|^{k}\right)^{1 / k}
代码实现:

import numpy as np 
vector1 = np.mat([1,2,3])
vector2 = np.mat([4,7,5])
print('切比雪夫距离:\n',np.abs(vector1-vector2).max())
切比雪夫距离:
 5

夹角余弦

(1)在二维空间中向量A(x_1,y_1)B(x_2,y_2)的夹角余弦公式:
\cos \theta=\frac{x_{1} x_{2}+y_{1} y_{2}}{\sqrt{x_{1}^{2}+y_{1}^{2}} \sqrt{x_{2}^{2}+y_{2}^{2}}}
(2)两个n维样本点A(x_{11},x_{12},...,x_{1n})B(x_{21},x_{22},…,x_{2n})的夹角余弦;类似地,对于两个n维样本点A(x_{11},x_{12},...,x_{1n})B(x_{21},x_{22},…,x_{2n}),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。
\cos \theta=\frac{A B}{|A||B|}
即:
\cos \theta=\frac{\sum_{k=1}^{n} x_{1 k} x_{2 k}}{\sqrt{\sum_{k=1}^{n} x_{1 k}^{2}} \sqrt{\sum_{k=1}^{n} x_{2 k}^{2}}}
代码实现:

import numpy as np 
from numpy import linalg
#方法1
vector1 = np.mat([1,2,3])
vector2 = np.mat([4,7,5])
cosV12 = np.dot(vector1,vector2.T)/(linalg.norm(vector1)*linalg.norm(vector2))
print('夹角余弦:\n',cosV12)
#方法2
vector1 = [1,2,3]
vector2 = [4,7,5]
cosV12 = np.dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))
print('夹角余弦:\n',cosV12)
#区别:方法1向量为matrix格式,方法2为list
夹角余弦:
 [[0.92966968]]

汉明距离

汉明距离的定义:两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。
应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。

代码实现:

import numpy as np 
from numpy import linalg
'''
np.nonzero的用法,返回非零元素的位置(某行某列)
vector = np.mat([[1,1,0,1,0,1,0,0,1],
                 [1,0,1,1,0,1,0,0,1]])
smstr = np.nonzero(vector)
print(np.array(smstr))
print(np.array(smstr).ndim)
print(smstr)
'''
vector1 = np.mat([1,1,0,1,0,1,0,0,1])
vector2 = np.mat([0,1,1,0,0,0,1,1,1])
smstr = np.nonzero(vector1-vector2)
#print(np.array(smstr))
#print(np.array(smstr).ndim)
print('汉明距离:\n',np.shape(smstr[0])[0])
'''
[[0 0 0 0 0 1 1 1 1 1]
 [0 1 3 5 8 0 2 3 5 8]]
2
 (array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=int64), array([0, 1, 3, 5, 8, 0, 2, 3, 5, 8], dtype=int64))
'''
汉明距离:
 6

杰卡德相似系数

(1)杰卡德相似系数:两个集合A和B的交集元素在A、B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。
J(A, B)=\frac{|A \cap B|}{|A \cup B|}
杰卡德相似系数是衡量两个集合的相似度的一种指标。

(2)杰卡德距离:与杰卡德相似系数相反的概念是杰卡德距离(Jaccard Distance)。
杰卡德距离可用如下公式表示:
J_{\delta}(A, B)=1-J(A, B)=\frac{|A \cup B|-|A \cap B|}{|A \cup B|}
杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
(3)杰卡德相似系数与杰卡德距离的应用。可将杰卡德相似系数用在衡量样本的相似度上。
样本A与样本B是两个n维向量,而且所有维度的取值都是0或1。例如,A(0111)B(1011)。我们将样本看成一个集合,1表示集合包含该元素,0表示集合不包含该元素。

P:样本A与B都是1的维度的个数。
g:样本A是1、样本B是0的维度的个数。
r:样本A是0、样本B是1的维度的个数。
s:样本A与B都是0的维度的个数。
那么样本A与B的杰卡德相似系数可以表示为:
J=\frac{p}{p+q+r}
这里p+g+r可理解为A与B的并集的元素个数,而p是A与B的交集的元素个数。

代码实现:

import numpy as np 
import scipy.spatial.distance as dist
matV = np.mat([[1,1,0,1,0,1,0,0,1],
              [0,1,1,0,0,0,1,1,1]])
print('杰卡德距离:\n',dist.pdist(matV,'jaccard'))
杰卡德距离:
 [0.75]

相关系数和协方差

期望:衡量样本某个特征列取值范围的平均值。

方差:衡量样本某个特征列取值范围的离散程度。
协方差矩阵和相关系数:衡量样本特征列之间线性相关性。

相关系数:
\rho_{X Y}=\frac{\operatorname{Cov}(X, Y)}{\sqrt{D(X)} \sqrt{D(Y)}}=\frac{E((X-E X)(Y-E Y))}{\sqrt{D(X)} \sqrt{D(Y)}}
相关系数是衡量两个特征列之间相关程度的一种方法,其取值范围是[-1,1]。相关系数的绝对值越大,表明特征列X与Y的相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

相关距离:
D_{X Y}=1-\rho_{X Y}
代码实现:

import numpy as np 
from numpy import linalg

featuremat = np.mat([np.random.randint(0,9,3),
                     np.random.randint(0,9,3),
                     np.random.randint(0,9,3)])
print(featuremat)
# 计算均值
mv1 = np.mean(featuremat[0])
mv2 = np.mean(featuremat[1])
# 计算两列标准差
dv1 = np.std(featuremat[0])
dv2 = np.std(featuremat[1])
# 相关系数和相关距离
corrf = np.mean(np.multiply(featuremat[0]-mv1,featuremat[1]-mv2)/(dv1*dv2))
print('二维相关系数',corrf)
print('相关距离=',1-corrf)
print('***'*15)
# 使用numpy进行相关系数计算
print('多维相关系数=\n',np.corrcoef(featuremat))
# 使用numpy进行协方差矩阵计算
print('多维协方差=\n',np.cov(featuremat))
[[4 2 3]
 [6 6 7]
 [4 5 0]]
二维相关系数 0.0
相关距离= 1.0
*********************************************
多维相关系数=
 [[ 1.          0.         -0.18898224]
 [ 0.          1.         -0.98198051]
 [-0.18898224 -0.98198051  1.        ]]
多维协方差=
 [[ 1.          0.         -0.5       ]
 [ 0.          0.33333333 -1.5       ]
 [-0.5        -1.5         7.        ]]

马氏距离

(1)马氏距离的定义:有M个样本向量X_i,...,X_m,协方差矩阵记为S,均值记为向量u,则其中样本向量X到u的马氏距离表示为:
D(X)=\sqrt{(X-\mu)^{\mathrm{T}} S^{-1}(X-\mu)}
而其中向量X_iX_j之间的马氏距离定义为:
D\left(\boldsymbol{X}_{i}, \boldsymbol{X}_{j}\right)=\sqrt{\left(\boldsymbol{X}_{i}-\boldsymbol{X}_{j}\right)^{\mathrm{T}} \boldsymbol{S}^{-1}\left(\boldsymbol{X}_{i}-\boldsymbol{X}_{j}\right)}
若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式变成了欧氏距离公式:
D\left(X_{i}, X_{j}\right)=\sqrt{\left(X_{i}-X_{j}\right)^{\mathrm{T}}\left(X_{i}-X_{j}\right)}
若协方差矩阵是对角矩阵,则公式变成了标准化欧氏距离公式。
(2)马氏距离的优点:量纲无关,排除变量之间的相关性的干扰。

代码实现:

import numpy as np 
from numpy import linalg

featuremat = np.mat([np.random.randint(0,9,3),
                     np.random.randint(0,9,3)])

print(featuremat)

covinv = linalg.inv(np.cov(featuremat))
tp = featuremat.T[0]-featuremat.T[1]
distma = np.sqrt(np.dot(np.dot(tp,covinv),tp.T))
print(distma)
[[4 2 8]
 [4 2 7]]
[[2.]]

参考资料:

参考网站:

https://www.jianshu.com/p/45417c05574c

https://www.cnblogs.com/wj-1314/p/10244807.html

https://www.cnblogs.com/endlesscoding/p/10033527.html

https://www.cnblogs.com/zongfa/p/8745853.html

参考书籍:《python科学计算》《机器学习算法原理与编程实践》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351