这里主要是学习使用python计算各个距离,分别如下所示
import numpy as np
# 测试数据
vec1 = [1,2,3,4]
vec2 = [5,6,7,8]
# 方案一
# 根据公式求解
dist1 = np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2)) # 根据公式写出计算方程
print('余弦测试距离结果:' + str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = 1-pdist(Vec,'cosine')
print('余弦测试距离结果:' + str(dist2))
d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d_{12}=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2} d12=(x1−x2)2+(y1−y2)2
2:三维空间两点 a ( x 1 , y 1 , z 1 ) a(x_1,y_1,z_1) a(x1,y1,z1) 与 b ( x 2 , y 2 , z 2 ) b(x_2,y_2,z_2) b(x2,y2,z2) 间的欧式距离
d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 + ( z 1 − z 2 ) 2 d_{12}=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2} d12=(x1−x2)2+(y1−y2)2+(z1−z2)2
3:两点 n 维向量 a 和 b 之间的欧式距离
d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 + . . . + ( x n − y n ) 2 = ∑ i = 1 n ( x i − y i ) 2 d_{12}=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2+...+(x_n-y_n)^2}=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} d12=(x1−x2)2+(y1−y2)2+...+(xn−yn)2=∑i=1n(xi−yi)2
表示成向量形式就是
d 12 = ( a − b ) ( a − b ) T d_{12}=\sqrt{(a-b)(a-b)^T} d12=(a−b)(a−b)T
import numpy as np
# 测试数据
vec1 = np.mat([1,2,3,4])
vec2 = np.mat([5,6,7,8])
# 方案一
# 根据公式求解
dist1 = np.sqrt(np.square(vec1-vec2))
print('欧氏距离测试结果是:' + str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec)
print('欧氏距离测试结果是:' + str(dist1))
1:二维平面两点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1,y1) 与 b ( x 1 , y 1 ) b(x_1,y_1) b(x1,y1) 之间的哈曼顿距离
d 12 = ∣ ( x 1 − x 2 ) + ∣ ( y 1 − y 2 ) ∣ d_{12}=|(x_1-x_2)+|(y_1-y_2)| d12=∣(x1−x2)+∣(y1−y2)∣
2:两个 n 维向量 a ( x 1 , x 2 ) , x 3 , x 4 , . . . x n a(x_1,x_2),x_3,x_4,...x_n a(x1,x2),x3,x4,...xn 与 b ( y 1 , y 2 , y 3 , . . . y n ) b(y_1,y_2,y_3,...y_n) b(y1,y2,y3,...yn) 之间的哈曼顿距离
d 12 = ∑ i = 1 n ∣ ( x i − y i ) ∣ d_{12}=\sum_{i=1}^{n}|(x_i-y_i)| d12=∑i=1n∣(xi−yi)∣
import numpy as np
# 测试数据
vec1 = np.mat([1,2,3,4])
vec2 = np.mat([5,6,7,8])
# 方案一
# 根据公式求解
dist1 = np.sum(np.abs(vec1-vec2))
print('曼哈顿距离测试结果是:' + str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'cityblock')
print('曼哈顿距离测试结果是:' + str(dist2))
# 方案三
from numpy import *
dist3 = sum(abs(vec1-vec2))# abs()绝对值
print('曼哈顿距离测试结果是:' + str(dist3))
1:两个 n 维向量 a ( x 1 , x 2 ) , x 3 , x 4 , . . . x n a(x_1,x_2),x_3,x_4,...x_n a(x1,x2),x3,x4,...xn 与 b ( y 1 , y 2 , y 3 , . . . y n ) b(y_1,y_2,y_3,...y_n) b(y1,y2,y3,...yn) 之间的哈曼顿距离
d 12 = p ∑ i = 1 n ∣ x i − y i ∣ p d_{12}=p\sqrt{\sum_{i=1}^{n}|x_i-y_i|^p} d12=p∑i=1n∣xi−yi∣p 或者可以写成 d 12 = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 p d_{12}=(\sum_{i=1}^{n}|x_i-y_i|^p)^{\frac{1}{p}} d12=(∑i=1n∣xi−yi∣p)p1
其中 p 是一个参数
A: 当 p = 1 时,就是曼哈顿距离
B: 当 p = 2 时,就是欧式距离
C: 当 p = n → ∞ n \to \infty n→∞ 时,就是切比雪夫距离
import numpy as np
# 测试数据
# sqrt() 函数时开方
# sum() 函数时求和
# square() 函数时绝对值
vec1 = np.mat([1,2,3,4])
vec2 = np.mat([5,6,7,8])
# 方案一
# 根据公式求解 p=2
dist1 = np.sqrt(np.sum(np.square(vec1-vec2)))
print('当P=2时就是欧氏距离,测试结果是:' + str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'cityblock',p=1)
print('当P=1时就是曼哈顿距离,测试结果是:' + str(dist2))
# 方案三
# 根据公式求解,p=1
from numpy import *
dist3 = sum(abs(vec1-vec2))# abs()绝对值
print('当p=1时就是曼哈顿距离,测试结果是:' + str(dist3))
1:二维平面两点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1,y1) 与 b ( x 2 , y 2 ) b(x_2,y_2) b(x2,y2) 之间的切比雪夫距离
d 12 = m a x ( ∣ x 1 − x 2 ∣ , ∣ y 2 − y 1 ∣ ) d_{12=max(|x_1-x_2|,|y_2-y_1|)} d12=max(∣x1−x2∣,∣y2−y1∣)
2:两个 n 维向量 a ( x 1 , x 2 ) , x 3 , x 4 , . . . x n a(x_1,x_2),x_3,x_4,...x_n a(x1,x2),x3,x4,...xn 与 b ( y 1 , y 2 , y 3 , . . . y n ) b(y_1,y_2,y_3,...y_n) b(y1,y2,y3,...yn) 之间的切比雪夫距离
d 12 = m a x i ( ∣ x i − y i ∣ ) d_{12=max_i(|x_i-y_i|)} d12=maxi(∣xi−yi∣) 还可以表示为 d 12 = lim n → ∞ ( ∑ i = 1 n ∣ x i − y i ∣ k ) 1 k d_{12}=\lim_{n \to \infty}(\sum_{i=1}^{n}|x_i-y_i|^k)^{}\frac{1}{k} d12=limn→∞(∑i=1n∣xi−yi∣k)k1
import numpy as np
# 测试数据
# sqrt() 函数时开方
# sum() 函数时求和
# square() 函数时绝对值
vec1 = np.mat([1,2,3,4])
vec2 = np.mat([5,6,7,8])
# 方案一
# 根据公式求解
dist1 = np.max(np.abs(vec1-vec2))
print('切比雪夫距离测试结果是:' + str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'chebyshev')
print('切比雪夫距离测试结果是:' + str(dist2))
杰卡德距离:用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
杰卡德相似系数:两个集合 A A A 和 B B B 的交集元素在 A , B A,B A,B 的并集中所占的比例,称为两个集合的n杰卡德相似系数,用符号 J ( A , B ) J(A,B) J(A,B) 表示。
杰卡德距离,系数的应用: 在衡量样本的相似度时可以使用杰卡德相似系列来实现。样本 A A A 和样本 B B B是两个n维向量,而且所有维度的取值都是0或1.例如: A ( 0111 ) A(0111) A(0111) 和 B ( 1011 ) B(1011) B(1011) .将样本看做是一个集合,1表示集合包含该元素,0表示集合不包含该元素。
公式化描述
杰卡德相似系数公式
J ( A , B ) = A ⋂ B A ⋃ B J(A,B)=\frac{A\bigcap B}{A\bigcup B} J(A,B)=A⋃BA⋂B
杰卡德距离
J ψ ( A , B ) = 1 − J ( A , B ) = A ⋃ B − A ⋂ B A ⋃ B J_\psi(A,B)=1-J(A,B)=\frac{A\bigcup B-A\bigcap B}{A\bigcup B} Jψ(A,B)=1−J(A,B)=A⋃BA⋃B−A⋂B
代码
import numpy as np
# 测试数据
# sqrt() 函数时开方
# sum() 函数时求和
# square() 函数时绝对值
# 生成10个大于0.5的随机数
v1 = np.random.random(10)>0.5
v2 = np.random.random(10)>0.5
# 将输入数值转化为矩阵形式
vec1 = np.asarray(v1,np.int32)
vec2 = np.asarray(v2,np.int32)
# 方案一
# 根据公式求解
up = np.double(np.bitwise_and((vec1!=vec2),np.bitwise_or(vec1!=0,vec2!=0)).sum())
down = np.double(np.bitwise_or(vec1!=0,vec2!=0).sum())
dist1=(up/down)
print("杰卡德距离测试结果是:"+str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'jaccard')
print("杰卡德距离测试结果是:"+str(dist2))
在信息论中,两个等长的字符串之间的汉明距离就是这两个字符串对应位置的不同字符的个数。换言之,它就是将一个字符串转换为另外一个字符串所需要替换的字符个数。
import numpy as np
# 测试数据
# sqrt() 函数时开方
# sum() 函数时求和
# square() 函数时绝对值
# 生成10个大于0.5的随机数
v1 = np.random.random(10)>0.5
v2 = np.random.random(10)>0.5
# 将输入数值转化为矩阵形式
vec1 = np.asarray(v1,np.int32)
vec2 = np.asarray(v2,np.int32)
# 方案一
# 根据公式求解
dist1 = np.mean(vec1!=vec2)
print("汉明距离测试结果是:\t"+str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = pdist(Vec,'hamming')
print("汉明距离测试结果是:"+str(dist2))
标准化欧式距离是针对于简单欧氏距离的缺点而做的一种改进方案。
标准化欧式距离思路:既然数据各维度分量的分布不一样,那先将各个分量都“标准化”到均值,方差相等。 假设样本集合X的均值为m,标准差为s,那么 X 的 “标准化变量” 表示为
X ∗ = X − m s X^*=\frac{X-m}{s} X∗=sX−m
标准化后的值 = (标准化前的值-分量的均值)/ 分量的标准差 。
d 12 = ∑ k = 1 n ( x i − y i S k ) 2 d_{12}=\sqrt{\sum_{k=1}^{n}(\frac{x_i-y_i}{S_k})^2} d12=∑k=1n(Skxi−yi)2
import numpy as np
# 测试数据
# sqrt() 函数时开方
# sum() 函数时求和
# square() 函数时绝对值
# 生成10个大于0.5的随机数
v1 = np.random.random(10)>0.5
v2 = np.random.random(10)>0.5
# 将输入数值转化为矩阵形式
vec1 = np.array(v1,np.int32)
vec2 = np.array(v2,np.int32)
Vec = np.vstack([vec1,vec2])
# 方案一
# 根据公式求解
sk = np.var(Vec,axis=0,ddof=1)
dist1 = np.sqrt(((vec1-vec2) ** 2/sk).sum())
print('标准化欧式距离测试结果:'+str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
dist2 = pdist(Vec,'seuclidean')
print('标准化欧式距离测试结果:'+str(dist2))
在统计学中,皮尔逊积矩相关系数用于度量两个变量 X X X 和 Y Y Y 之间的相关程度(线性相关),其值介于-1和1之间。在自然科学领域,该系数广泛用于度量两个变量之间的相关程度。
计算相关系数:
C o r r ( x , y ) = ∑ i ( x i − y i ) ( y i − y → ) ∑ ( x i − x → ) 2 ∑ ( y i − y → ) 2 = < x − x , → y − y → > ∣ ∣ x − x → ∣ ∣ ∣ ∣ y − y > → ∣ ∣ Corr(x,y)=\frac{\sum_i(x_i-y_i)(y_i-\overrightarrow{y})}{\sqrt{\sum(x_i-\overrightarrow x)^2\sqrt{\sum{(y_i-\overrightarrow{y})^2}}}}=\frac{<x-\overrightarrow{x,}y-\overrightarrow{y}>}{||x-\overrightarrow{x}||||y-\overrightarrow{y>}||} Corr(x,y)=∑(xi−x)2∑(yi−y)2∑i(xi−yi)(yi−y)=∣∣x−x∣∣∣∣y−y>∣∣<x−x,y−y>
import numpy as np
# 测试数据
# sqrt() 函数时开方
# sum() 函数时求和
# square() 函数时绝对值
# 生成10个大于0.5的随机数
v1 = np.random.random(10)>0.5
v2 = np.random.random(10)>0.5
# 将输入数值转化为矩阵形式
vec1 = np.array(v1,np.int32)
vec2 = np.array(v2,np.int32)
# Vec = np.vstack([vec1,vec2])
# 方案一
# 根据公式求解
vec1_ = vec1-np.mean(vec1)
vec2_ = vec2-np.mean(vec2)
dist1 = np.dot(vec1_,vec2_)/(np.linalg.norm(vec1_)*np.linalg.norm(vec2_))
print("皮尔逊相关系数测试结果:" + str(dist1))
# 方案二
# 根据scipy库求解
from scipy.spatial.distance import pdist
Vec = np.vstack([vec1,vec2])
dist2 = np.corrcoef(Vec)[0][1]
print("皮尔逊相关系数测试结果:" + str(dist2))