Machine Learning 中的距离和相似性计算
l 欧式距离
也称欧几里得距离,指在m维空间中两个点之间的真实距离。
两个n维向量与间的欧式距离表示为:
用python实现为
from math import sqrt def distance(a,b): """ 求a,b之间的欧式距离 :return:距离 """ dis = 0.0 for i in range(len(a)): dis+=(a[i]-b[i])**2 return sqrt(dis)
l 曼哈顿距离
也称为城市街区距离,用来表示两点之间各垂直线之间的长度。
用python实现为
def Manhattan(a,b): # 求a,b之间的曼哈顿距离 dis=0.0 for i in range(len(a)): dis+=abs(a[i]-a[b]) return dis
l 切比雪夫距离
定义为:,数据维度要在三维及以上
Python代码如下
def maxDistance(a,b): # 求两个向量之间的切比雪夫距离 maxDis = 0.0 for i in range(len(a)): if abs(a[i]-b[i])>maxDis: maxDis=abs(a[i]-b[i]) return maxDis
l 闵可夫斯基距离
其中p是一个可变参数:
当p=1时,就是曼哈顿距离;
当p=2时,就是欧式距离;
当p=3时,就是切比雪夫距离
l 马氏距离
马氏距离是基于样本分布的一种距离。它是一种有效的计算两个未知样本集的相似度的方法。
公式为
其中X为样本向量,为均值,为协方差矩阵
def Mahalanobis(x,i,j): """ 求样本i到样本j的马氏距离 当j取-1时表示第i个点到样本中心的马氏距离 :param x: m个样本向量,为矩阵 :param i:第i个点 :param j: 第j个点 :return: 马氏距离 """ import numpy as np xT = x.T # 矩阵的转置 D = np.cov(xT) # 矩阵a的协方差 invD = np.linalg.inv(D) # 协方差矩阵的逆 x_a = x[i] x_b = x.mean(axis=0) if j==-1 else x[j] temp = x_a-x_b return np.sqrt(np.dot(np.dot(invD,temp),temp.T))
l 汉明距离
两个字符串之间的汉明距离定义为将其中一个变为另一个所需要作的最小替换次数
def hanmingDis(a,b): # 计算ab字符串之间的汉明距离 num = 0 for i in range(len(a)): if a[i]!=b[i]: num+=1 return num
l 杰卡德距离 & 杰卡德相似系数
用两个集合中不同元素占有元素的比例来衡量两个集合的区分度
def jiekadeDis(a,b): # 计算ab两个集合的杰卡德距离 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
杰卡德相似系数
def jiekadeDis(a,b): # 计算ab两个集合的杰卡德相似系数 set_a = set(a) set_b = set(b) dis = float(len((set_a & set_b)))/len(set_a|set_b) return dis
l 夹角余弦
def cosDis(a,b): # 计算ab之间的夹角余弦值 sum1 = 0.0 sum21,sum22=0.0,0.0 for i in range(len(a)): sum1+=a[i]*b[i] sum21+=a[i]**2 sum22+=b[i]**2 return sum1/(np.sqrt(sum21)*np.sqrt(sum22))
l 相关距离和相关系数
相对应计算就行
l 信息熵
用来表示数据的混乱程度或分散程度的度量
def calc_shang(dataset): # 计算信息熵
# dataset为数据集 labelcount = {} # 列表数量 for data in dataset: if data[-1] not in labelcount.keys(): labelcount[data[-1]] = 1 # 每行最后一列为标签值 labelcount[data[-1]] += 1 # 发现一次就加一 n = len(dataset) shang = 0.0 # 初始为0.0 for key in labelcount: p = float(labelcount[key] / n) # 计算概率,等于标签的数据除总比例 shang -= p * log(p, 2) return shang