首页 > 编程语言 >【Python】距离

【Python】距离

时间:2024-08-17 17:49:51浏览次数:8  
标签:return Python sum 距离 print len np def

写了一个计算距离的脚本,常见距离基本都有。

其中测地距离需要依赖曲面,Hausdorff距离之前有实现,而Wasserstei距离可以用sinkhorn方法求解。

代码如下:

import numpy as np

def Euclidean(a,b):
    return np.sqrt(np.sum((a-b)*(a-b)))

def Manhattan(a,b):
    return np.sum(np.abs(a-b))

def Minkowski(a,b,p):
  return(np.float_power(np.sum(np.power(np.abs(a-b),p)),1.0/p))

def Chebyshev(a,b):
  return np.max(np.abs(a-b))

def StdEuclidean(a,b):
   c = np.vstack((a,b))
   s = np.var(c,0)
   return np.sqrt(np.sum((a-b)*(a-b)/s))

def Mahalanobis(a,b):
    return  np.sqrt((a - np.mean(b)).T@(a - np.mean(b))/np.cov(b))

def Lance(a,b):
    return np.sum(np.abs(a-b)/np.abs(a+b))/len(a)

def Cosine(a,b):
    return np.sum(a*b)/np.sqrt(np.sum(a*a))*np.sqrt(np.sum(b*b))

def BrayCurtis(a,b):
    return np.sum(np.abs(a-b))/np.sum(a+b)

def Hamming(a,b):
    return sum(1 for x, y in zip(a, b) if x != y)

def Edit(a,b):
    matrix = [[ i + j for j in range(len(a) + 1)] for i in range(len(b) + 1)]
    for i in range(1, len(a)+1):
        for j in range(1, len(b)+1):
            if(a[i-1] == b[j-1]):
                d = 0
            else:
                d = 1  
            matrix[i][j] = min(matrix[i-1][j]+1, matrix[i][j-1]+1, matrix[i-1][j-1]+d)
    return matrix[len(a)][len(b)]

def Jaccard(a,b):
    return 1 - len(a.intersection(b))/len(a.union(b))

def Ochiia(a,b):
    return 1 - len(a.intersection(b))/np.sqrt(len(a)*len(b))

def Dice(a,b):
    return 1 - 2*len(a.intersection(b))/(len(a)+len(b))

def Pearson(a,b):
    a = a-np.mean(a)
    b = b-np.mean(b)
    return np.dot(a,b) / np.linalg.norm(a)*np.linalg.norm(b) 

def ChiSquare(a,b):
    return np.sum(np.square(a-b)/b)

def CrossEntropy(a,b):
    return -np.sum(a*np.log(b))

def KL_Divergence(a,b):
    return np.sum(a*np.log(a/b))

def JS_Divergence(a,b):
    m = (a+b)/2
    return 0.5*KL_Divergence(a,m) + 0.5*KL_Divergence(b,m)

def Hellinger(a,b):
    return 1 - np.sum(np.sqrt(a*b))

def alpha_Divergence(a,b,alpha):
    return (1.0/(alpha*(1-alpha)))*(1 - np.sum((a**alpha)*(b**(1-alpha))))

#F散度计算KL
def F_Divergence(a,b):
    def F(x):
        return x*np.log(x)
    return np.sum(b*F(a/b))

#Bregman计算Euclidean
def Bregman(a,b):
    def f(x):
        return np.sum(x**2)   
    def df(x):
        return 2*x
    return np.sqrt(f(a) - f(b) - np.dot(df(b), a - b))

def Bhattacharyya(a,b):
    return np.sum(np.sqrt(a * b))

def MMD(a,b):
    from sklearn.metrics.pairwise import rbf_kernel
    Kaa = rbf_kernel(a, a, 1.0)
    Kbb = rbf_kernel(b, b, 1.0)
    Kab = rbf_kernel(a, b, 1.0)
    return np.mean(Kaa) + np.mean(Kbb) - 2 * np.mean(Kab)

def PMI():
    x = 1
    y = 2
    dataset = [[1, 2, 3],[2, 4, 5],[6, 7, 8],[2, 3, 4]]
    count_x = sum([1 for seq in dataset if x in seq])
    count_y = sum([1 for seq in dataset if y in seq])
    count_xy = sum([1 for seq in dataset if x in seq and y in seq])
    px = count_x / len(dataset)
    py = count_y / len(dataset)
    pxy = count_xy / len(dataset)
    return np.log(pxy/(px*py))

# 测地距离,依赖曲面
# def Geodesic(a,b):

# https://www.cnblogs.com/tiandsp/p/12623603.html
# def Hausdorff(a,b):

# https://www.cnblogs.com/tiandsp/p/18276246
# def Wasserstei(a,b):

if __name__ == '__main__':
    a = np.random.rand(6)
    b = np.random.rand(6)

    print(a)
    print(b)
    print("Euclidean:",Euclidean(a,b))
    print("Manhattan:",Manhattan(a,b))
    print("Minkowski p3:",Minkowski(a,b,3))
    print("Chebyshev:",Chebyshev(a,b),Minkowski(a,b,300))
    print("StdEuclidean:",StdEuclidean(a,b))
    print("Mahalanobis:",Mahalanobis(np.random.rand(1),b))
    print("Lance:",Lance(a,b))
    print("Cosine:",Cosine(a,b))
    print("BrayCurtis:",BrayCurtis(a,b))
    print("Hamming:",Hamming("1000111","1111111"))
    print("Edit:",Edit("1000111","1111111"))
    print("Jaccard:",Jaccard(set([1,2,3]),set([3,4,5,6])))
    print("Ochiia:",Ochiia(set([1,2,3]),set([3,4,5,6])))
    print("Dice:",Dice(set([1,2,3]),set([3,4,5,6])))
    print("Pearson:",Pearson(a,b))
    print("ChiSquare:",ChiSquare(np.array([1,2,3,4,5,6]),np.array([6,5,4,3,2,1])))
    print("CrossEntropy:",CrossEntropy(a,b))
    print("KL_Divergence:",KL_Divergence(a,b))
    print("JS_Divergence:",JS_Divergence(a,b))
    print("Hellinger:",Hellinger(a,b))
    print("alpha_Divergence:",alpha_Divergence(a,b,0.1))
    print("F_Divergence:",F_Divergence(a,b))
    print("Bregman:",Bregman(a,b))
    print("Bhattacharyya:",Bhattacharyya(a,b))
    print("MMD:",MMD(a.reshape(-1,1),b.reshape(-1,1)))
    print("PMI:",PMI())

 参考:https://blog.csdn.net/hy592070616/article/details/121723169?spm=1001.2014.3001.5501

标签:return,Python,sum,距离,print,len,np,def
From: https://www.cnblogs.com/tiandsp/p/18294921

相关文章

  • Python系列(5)- 命令行应用 (Command Line Application)
     使用Windows、iOS、Android、HarmonyOS等操作系统的设备,用户与这些设备主要通过图形用户界面(GUI)来交互,比如:鼠标、触屏等。一般用户很少使用这些系统的命令行界面(CLI),在Windows下是通过命令提示符(Cmd)窗口来实现CLI交互,其它系统通过终端(Terminal)窗口。 命令行界面(CLI......
  • Python导入包时提示“attempted relative import beyond top-level package”的解决办
    一篇很好的文章:python跨目录导包失败python不同路径导入包错误 在涉及到相对导入时,package所对应的文件夹必须正确的被python解释器视作package,而不是普通文件夹。否则由于不被视作package,无法利用package之间的嵌套关系实现python中包的相对导入。文件夹被python解释器视作......
  • Python入门之Lesson1:出发!
    目录前言一、Python简介二、环境搭建1.Python安装2.Pycharm安装三.运行总结前言本章会带领同学们了解和入门python。一、Python简介Python是一种高级编程语言,具有简洁明了的语法和丰富的库,非常适合初学者学习。Python的设计注重代码的可读性和简洁性,其语法类似......
  • 【Python系列】命令 • 合集
    文件传输Python2//将http:///FileName写入Path中python2-c"importurllib2;u=urllib2.urlopen('http:///FileName');f=open('Path','w');f.write(u.read());f.close()"//Python3//将http:///FileName写入Path中,这里要注意decode()中......
  • python安装
    下载安装python到官网下载最新版这里是3.12.5版本https://www.python.org/downloads/在安装Python时,系统环境变量的长度超出了操作系统所允许的限制,如下所示。环境变量通常用于存储系统或应用程序的配置信息,如路径等。如果这些变量的总长度超出了操作系统或文件系统所......
  • 学习Python必备的8个网站,没有就举步维艰!
      学习Python时,选择合适的学习资源对于提升技能至关重要。以下是推荐的8个学习Python的必去网站及其地址:Python官方网站(Python.org)地址:WelcometoPython.org特点:官方文档是学习Python最权威的资料,涵盖了从基础语法到高级特性的全面指南。此外,网站还提供Python的下载和安......
  • Python编程常用英文单词大全!收藏别忘了!
      Python编程中常用的英文单词非常丰富,这些单词涵盖了编程的各个方面,包括基础概念、数据类型、控制结构、函数与模块、类与对象、异常处理等。以下是一些常用的英文单词及其简要说明:1.基础概念Variable(变量):用来存储和表示数据的容器。Function(函数):一段可重复使用的代码......
  • Python的71个内置函数,小白都能学会!
    Python是一种高级编程语言,具有很多强大的特性,其中之一就是内置函数。Python内置函数是指在Python解释器中可以直接使用的函数,无需导入任何模块或库。Python内置函数包含了很多常用的函数,可以快速地完成各种操作。本文将介绍Python内置函数的用法帮助初学者更好地掌握Python编程......
  • OpenCV图像处理——轮廓的面积与弧长计算(C++/Python)
    概述轮廓面积与轮廓周长是图像分析中的两项核心统计特征,它们为理解和量化图像中的形状提供了基础。轮廓面积:这代表了轮廓所界定区域的像素数量,是衡量区域大小的直接指标。面积的计算结果以像素平方为单位,为我们提供了一个量化的尺度来比较不同物体的相对大小。轮廓周长......
  • 【Python爬虫+可视化】利用Python爬取天气数据并实现数据可视化,绘制天气轮播图,一个完
    要使用Python爬取天气数据并实现数据可视化,特别是绘制天气轮播图(指的是随时间变化的天气图表),我们可以使用几个流行的库:requests 用于网络请求,pandas 用于数据处理,matplotlib 或 plotly 用于数据可视化。此外,为了处理时间序列数据,pandas 的日期时间功能非常有用。先来看......