Python机器学习中实现距离和相似性计算详解

 更新时间:2023年03月08日 08:43:25   作者:吃肉的小馒头  
这篇文章主要为大家详细介绍了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

到此这篇关于Python机器学习中实现距离和相似性计算详解的文章就介绍到这了,更多相关Python距离 相似性计算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python .py生成.pyd文件并打包.exe 的注意事项说明

    Python .py生成.pyd文件并打包.exe 的注意事项说明

    这篇文章主要介绍了Python .py生成.pyd文件并打包.exe 的注意事项说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • python如何写try语句

    python如何写try语句

    在本篇文章里小编给大家整理的是一篇关于python写try语句的方法相关内容,有兴趣的朋友们可以跟着学习参考下。
    2020-07-07
  • Django使用jinja2模板的实现

    Django使用jinja2模板的实现

    本文主要介绍了Django使用jinja2模板的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python 使用递归的方式实现语义图片分割功能

    python 使用递归的方式实现语义图片分割功能

    这篇文章主要介绍了python 使用递归的方式实现语义图片分割,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 用Python制作灯光秀短视频的思路详解

    用Python制作灯光秀短视频的思路详解

    这篇文章主要介绍了用Python制作灯光秀短视频的思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-04-04
  • Python中raise用法简单实例(超级详细,看了无师自通)

    Python中raise用法简单实例(超级详细,看了无师自通)

    python中raise语句用于手动触发异常,通过raise语句可以在代码中显式地引发异常,从而使程序进入异常处理流程,下面这篇文章主要给大家介绍了关于Python中raise用法的相关资料,需要的朋友可以参考下
    2024-03-03
  • python列表删除和多重循环退出原理详解

    python列表删除和多重循环退出原理详解

    这篇文章主要介绍了python列表删除和多重循环退出原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 浅谈Python里面None True False之间的区别

    浅谈Python里面None True False之间的区别

    这篇文章主要介绍了浅谈Python里面None True False之间的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 详解Python连接oracle的问题记录与解决

    详解Python连接oracle的问题记录与解决

    这篇文章主要为大家详细介绍了Python连接oracle时会出现的一些问题记录与解决方法,文中的示例代码讲解详细,需要的小伙伴可以参考一下
    2023-04-04
  • django rest framework 实现用户登录认证详解

    django rest framework 实现用户登录认证详解

    这篇文章主要介绍了django rest framework 实现用户登录认证详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论