一个用于ofir-pele和michael-werman实现地球移动器距离的python包装器。

pyemd的Python项目详细描述


pyemd:python的快速emd

pyemd是一个python包装器,用于 ofir pele和michael werman的 earth mover的实现 距离 允许 它要和纽比一起用。 如果您使用此代码,请引用列出的论文 在本文档末尾。

安装

pip install pyemd

用法

>>>frompyemdimportemd>>>importnumpyasnp>>>first_histogram=np.array([0.0,1.0])>>>second_histogram=np.array([5.0,3.0])>>>distance_matrix=np.array([[0.0,0.5],...[0.5,0.0]])>>>emd(first_histogram,second_histogram,distance_matrix)3.5

您还可以获得相关的最低成本流:

>>>frompyemdimportemd_with_flow>>>emd_with_flow(first_histogram,second_histogram,distance_matrix)(3.5,[[0.0,0.0],[0.0,1.0]])

您还可以直接从两个观测阵列计算EMD:

>>>frompyemdimportemd_samples>>>first_array=[1,2,3,4]>>>second_array=[2,3,4,5]>>>emd_samples(first_array,second_array,bins=2)0.5

文档

emd()

emd(first_histogram,second_histogram,distance_matrix,extra_mass_penalty=-1.0)

参数:

  • 第一直方图 (np.ndarray) :类型为 np.float64 的一维数组 长度 n
  • 二次直方图 (np.ndarray) :长度为 np.float64 的一维数组 n
  • 距离矩阵 (np.ndarray) :大小为 最小值 n × n 。这定义了基本的度量,或地面距离,通过 给出直方图箱之间的成对距离。它必须代表 公制;如果没有,则没有警告。

关键字参数:

  • 额外质量惩罚 (float) :额外质量的惩罚。如果你想 结果距离为公制,应至少为 空间(任何两点之间的最大可能距离)。如果你想要 部分匹配您可以将其设置为零(但是结果距离是 不能保证是公制的)。默认值为 -1.0 ,这意味着 使用距离矩阵中的最大值。

返回: (浮点) EMD值。


EMD_带_flow()

emd_with_flow(first_histogram,second_histogram,distance_matrix,extra_mass_penalty=-1.0)

参数与 emd() 的参数相同

返回: (元组(float,list(list(float))) EMD值和相关联的 最低成本流。


emd_samples()

emd_samples(first_array,second_array,extra_mass_penalty=-1.0,distance='euclidean',normalized=True,bins='auto',range=None)

参数:

  • 第一个数组 (iterable) :用于生成 直方图。
  • 第二个数组 (iterable) :用于生成 直方图。

关键字参数:

  • 额外质量惩罚 (浮点) :与 emd() 相同
  • 距离 (字符串或函数) :实现 1d np.ndarray 上的度量。默认为欧几里德距离。目前 仅限于"euclidean"或您自己的函数,它必须采用1d数组和 返回成对距离的二维正方形数组。
  • 标准化 布尔型 ):如果为真(默认值),则将直方图视为分数 数据集的。如果为false,则将直方图视为计数。在后一种情况下 EMD将随阵列长度变化很大H.
  • (int或string) :要包含在生成的 直方图。如果是字符串,则必须是接受的bin选择算法之一 通过 np.histogram() 。默认为 'auto' ,它给出 "sturges"和"fd"估计量。
  • 范围 (元组(int,int)) :传递的容器的上下范围 到 numpy.histogram() 。默认为联合的范围 第一个数组和第二个数组。注:如果给定范围不是 默认范围的超集,不会发出警告。

返回: (float) 第一个数组和 第二个阵列


限制和注意事项

  • emd() emd_with_flow()
    • 假设 距离矩阵 表示一个度量;没有检查 以确保这是真的。请参阅中的文档 pyemd/lib/emd_hat.hpp 了解更多信息。
    • 直方图和距离矩阵必须是 np.float64 。原始C++模板函数可以接受任何数值 c++类型,但是这个包装器只使用 实例化模板 (cython将 np.float64 转换为 double )。如果有需求,我可以补充 支持其他类型。
  • emd_with_flow()
    • 流量矩阵不包含流向/来自额外质量仓的流量。
  • emd_samples()
    • 使用默认的 bin="auto" 会导致对 np.histogram() 确定箱子长度,因为numpy bin选择器在公共api中不公开。为了演出,你可以 想自己设置垃圾箱。

贡献

为了帮助开发pyemd,在github上派生项目并安装需求 使用 pip install -r requirements.txt

生成文件定义了一些有助于开发的任务:

  • 测试 :运行测试套件
  • 构建 生成并编译cython扩展
  • 清除 :删除已编译的cython扩展名
  • 默认值 :运行 生成

不同python环境的测试可以使用 tox

学分

  • 实际算法和实现的所有功劳都归于 ofir pele michael werman 。请参阅相关论文
  • 感谢cython开发人员相对地制作了这种包装器 易于书写。

如果您使用此代码,请引用这些文件:

贝利和迈克尔沃曼。改进sift的线性时间直方图度量 匹配. 计算机视觉-ECCV2008 ,法国马赛,2008年,第495-508页。

@INPROCEEDINGS{pele2008,
  title={A linear time histogram metric for improved sift matching},
  author={Pele, Ofir and Werman, Michael},
  booktitle={Computer Vision--ECCV 2008},
  pages={495--508},
  year={2008},
  month={October},
  publisher={Springer}}

贝利和迈克尔沃曼。快速有力的地球移动距离。

2009年IEEE第12届国际计算机视觉会议,日本京都,2009年,第460-467页。

@INPROCEEDINGS{pele2009,
  title={Fast and robust earth mover's distances},
  author={Pele, Ofir and Werman, Michael},
  booktitle={2009 IEEE 12th International Conference on Computer Vision},
  pages={460--467},
  year={2009},
  month={September},
  organization={IEEE}}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何下载多个。java中的PDF文件   linux Java打开文件,形成实际用户主页~/   java如何在时间线内维护TableView选择?   java Hibernate注释@Where vs@WhereJoinTable   Java读/写访问异常FileNotFoundException(访问被拒绝)   继承在Java中是否可以扩展最后一个类?   Android HttpClient使用java使应用程序崩溃。lang.OutOfMemoryError:pthread_create   java为什么即使我在proguardproject中添加了jar文件,也会出现这种错误。txt?   如果添加JButton,swing Java FocusListener和KeyListener将无法工作   java使用solrj检索json格式的SolrDocument   使用Microsoft Visual Studio代码进行Java编程   java NoClassDefFoundError:org/apache/log4j/Logger   哈希集中包含相等对象的java   java中的参数化构造函数是否需要有一个主体?   java类似于NetBeans不必要的代码检测器   Java实践问题   java Blackberry“[projectname].调试文件丢失”和“I/O错误:找不到程序”jar