一个用于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}}