本篇内容主要讲解“Python如何实现距离和相似性计算”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python如何实现距离和相似性计算”吧!
欧氏距离
也称欧几里得距离,是指在m维空间中两个点之间的真实距离。欧式距离在ML中使用的范围比较广,也比较通用,就比如说利用k-Means对二维平面内的数据点进行聚类,对魔都房价的聚类分析(price/m^2 与平均房价)等。
两个n维向量a
(x11,x12.....x1n)
与 b
(x21,x22.....x2n)
间的欧氏距离
python 实现为:
def EuclideanDistance(x, y):
import numpy as np
x = np.array(x)
y = np.array(y)
return np.sqrt(np.sum(np.square(x-y)))
这里传入的参数可以是任意维的,该公式也适应上边的二维和三维
曼哈顿距离
python 实现为:
def ManhattanDistance(x, y):
import numpy as np
x = np.array(x)
y = np.array(y)
return np.sum(np.abs(x-y))
切比雪夫距离
切比雪夫距离(Chebyshev Distance)的定义为:max( | x2-x1 | , |y2-y1 | , … ), 切比雪夫距离用的时候数据的维度必须是三个以上
python 实现为:
def ChebyshevDistance(x, y):
import numpy as np
x = np.array(x)
y = np.array(y)
return np.max(np.abs(x-y))
马氏距离
有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为
python实现:
def MahalanobisDistance(x, y):
'''
马氏居立中的(x,y)与欧几里得距离的(x,y)不同,欧几里得距离中的(x,y)指2个样本,每个样本的维数为x或y的维数;这里的(x,y)指向量是2维的,样本个数为x或y的维数,若要计算n维变量间的马氏距离则需要改变输入的参数如(x,y,z)为3维变量。
'''
import numpy as np
x = np.array(x)
y = np.array(y)
X = np.vstack([x,y])
X_T = X.T
sigma = np.cov(X)
sigma_inverse = np.linalg.inv(sigma)
d1=[]
for i in range(0, X_T.shape[0]):
for j in range(i+1, X_T.shape[0]):
delta = X_T[i] - X_T[j]
d = np.sqrt(np.dot(np.dot(delta,sigma_inverse),delta.T))
d1.append(d)
return d1
夹角余弦
def moreCos(a,b):
sum_fenzi = 0.0
sum_fenmu_1,sum_fenmu_2 = 0,0
for i in range(len(a)):
sum_fenzi += a[i]*b[i]
sum_fenmu_1 += a[i]**2
sum_fenmu_2 += b[i]**2
return sum_fenzi/( sqrt(sum_fenmu_1) * sqrt(sum_fenmu_2) )
闵可夫斯基距离
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比雪夫距离
python实现:
def MinkowskiDistance(x, y, p):
import math
import numpy as np
zipped_coordinate = zip(x, y)
return math.pow(np.sum([math.pow(np.abs(i[0]-i[1]), p) for i in zipped_coordinate]), 1/p)
汉明距离
两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数
def hanmingDis(a,b):
sumnum = 0
for i in range(len(a)):
if a[i]!=b[i]:
sumnum += 1
return sumnum
杰卡德距离 & 杰卡德相似系数
杰卡德距离,杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
def jiekadeDis(a,b):
set_a = set(a)
set_b = set(b)
dis = float(len( (set_a | set_b) - (set_a & set_b) ) )/ len(set_a | set_b)
return dis
杰卡德相似系数
两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。
def jiekadeXSDis(a,b):
set_a = set(a)
set_b = set(b)
dis = float(len(set_a & set_b) )/ len(set_a | set_b)
return dis
相关系数 & 相关距离
相关系数
import math
def c_Pearson(x, y):
x_mean, y_mean = sum(x)/len(x), sum(y)/len(y)
cov =0.0
x_pow = 0.0
y_pow = 0.0
for i in range(len(x)):
cov += (x[i]-x_mean) *(y[i] - y_mean)
for i in range(len(x)):
x_pow += math.pow(x[i] - x_mean, 2)
for i in range(len(x)):
y_pow += math.pow(y[i] - y_mean, 2)
sumBm = math.sqrt(x_pow * y_pow)
p = cov / sumBm
return p
信息熵
衡量分布的混乱程度或分散程度的一种度量.
import numpy as np
data=['a','b','c','a','a','b']
data1=np.array(data)
#计算信息熵的方法
def calc_ent(x):
"""
calculate shanno ent of x
"""
x_value_list = set([x[i] for i in range(x.shape[0])])
ent = 0.0
for x_value in x_value_list:
p = float(x[x == x_value].shape[0]) / x.shape[0]
logp = np.log2(p)
ent -= p * logp
return ent