机器学习有关距离及python实现


Machine Learning 中的距离和相似性计算

 

欧式距离

也称欧几里得距离,指在m维空间中两个点之间的真实距离。

两个n维向量与间的欧式距离表示为:

机器学习有关距离及python实现

 

 

用python实现为
from math import sqrt
def distance(a,b):
    """
   
ab之间的欧式距离
   
:return:距离
    """
   
dis = 0.0
    for i in range(len(a)):
        dis+=(a[i]-b[i])**2
    return sqrt(dis)
 

曼哈顿距离

也称为城市街区距离,用来表示两点之间各垂直线之间的长度。

 机器学习有关距离及python实现

用python实现为

 
def Manhattan(a,b):
    # ab之间的曼哈顿距离
   
dis=0.0
    for i in range(len(a)):
        dis+=abs(a[i]-a[b])
    return dis

 

 

 

切比雪夫距离

定义为:,数据维度要在三维及以上

 机器学习有关距离及python实现

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

闵可夫斯基距离

 机器学习有关距离及python实现

其中p是一个可变参数:

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

当p=2时,就是欧式距离;

当p=3时,就是切比雪夫距离

 

 

马氏距离

马氏距离是基于样本分布的一种距离。它是一种有效的计算两个未知样本集的相似度的方法。

公式为机器学习有关距离及python实现

 

其中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))

汉明距离

两个字符串之间的汉明距离定义为将其中一个变为另一个所需要作的最小替换次数

 
def hanmingDis(a,b):
    # 计算ab字符串之间的汉明距离
   
num = 0
    for i in range(len(a)):
        if a[i]!=b[i]:
            num+=1
    return num

 

 

 

杰卡德距离 & 杰卡德相似系数

用两个集合中不同元素占有元素的比例来衡量两个集合的区分度

 机器学习有关距离及python实现 

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

杰卡德相似系数

 机器学习有关距离及python实现 

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

 

夹角余弦

 机器学习有关距离及python实现 

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))

相关距离和相关系数

相对应计算就行

 

 

信息熵

用来表示数据的混乱程度或分散程度的度量

 机器学习有关距离及python实现

 
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

 

原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/244390.html

(0)
上一篇 2022年4月17日
下一篇 2022年4月17日

相关推荐

发表回复

登录后才能评论