用于Python的EMD
PyEMD是Ofir Pele和Michael Werman实现的Python包装器,它允许与NumPy一起使用。
Installation
pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com pyemd
Usage
>>> from pyemd import emd
>>> import numpy as np
>>> 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
您还可以得到相关的最小成本流:
>>> from pyemd import emd_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)
参数:
first_histogram (np.ndarray):一个np类型的一维数组。长度为N的浮点64。
second_histogram (np.ndarray): np的一维数组。长度为N的浮点64。
distance_matrix (np.ndarray): np的一个二维数组。float64,大小至少为N×N。通过给出直方图各箱子之间的两两距离,它定义了底层度量,或者地面距离。它必须代表一个度量;如果没有,就没有警告。
关键字参数:
extra_mass_penalty (float):对额外质量的惩罚。如果你想要得到的距离度量,它应该至少一半空间的直径(最大可能任意两点之间的距离)。如果想要部分匹配,可以将其设置为零(但不能保证结果距离是一个度量)。默认值为-1.0,表示使用距离矩阵中的最大值。
返回(float)变量
emd_with_flow()
emd_with_flow(first_histogram,
second_histogram,
distance_matrix,
extra_mass_penalty=-1.0)
参数与emd()相同。
返回: (tuple(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)
参数:
first_array (Iterable):一个用于生成直方图的一维样本数组。
second_array (Iterable):一个用于生成直方图的一维样本数组。
关键字参数:
extra_mass_penalty (float):与emd()相同。
distance (string or function):在一维np.ndarray上实现一个度量的字符串或函数。默认欧式距离。目前仅限于“欧几里得”或你自己的函数,它必须采取一个1D数组和返回一个正方形的二维数组的两两距离。
normalized (boolean):如果为真(默认),则将直方图视为数据集的分数。如果为假,则将直方图视为计数。在后一种情况下EMD将数组长度差异很大。
bin (int或string):生成的直方图中包含的bin的数量。如果是字符串,则必须是np.histogram()所接受的bin选择算法之一。默认为“auto”,这将给出“sturges”和“fd”估计量的最大值。
range (tuple(int, int)):箱子的上下范围,传递给numpy.histogram()。默认值为first_array和second_array的并集范围。注意:如果给定范围不是默认范围的超集,则不会给出警告。
Returns: (float)在first_array和second_array直方图之间的EMD值。
限制和警告
emd()和emd_with_flow ():
假设distance_matrix表示一个度量;没有检查,以确保这是真的。请参阅pyemd/lib/emd_hat中的文档。查看更多信息。
直方图和距离矩阵必须是类型为np.float64的numpy数组。原来的c++模板函数可以接受任何数值c++类型,但是这个包装器只实例化带有double的模板(Cython转换np)。float64翻倍)。如果有需求,我可以添加对其他类型的支持。
emd_with_flow ():
流动矩阵不包含流入/流出额外质量仓的流动。
emd_samples ():
使用默认的bin ='auto'会导致额外调用np.histogram()来确定bin长度,因为NumPy bin选择器不会在公共API中公开。为了提高性能,您可能需要自己设置箱子。