python曲线的距离矩阵

时间:2012-12-03 22:20:17

标签: python numpy scipy distance curves

我有一组定义为2D数组的曲线(点数,坐标数)。我正在使用Hausdorff距离计算它们的距离矩阵。我目前的代码如下。不幸的是,它太慢,有500-600条曲线,每条曲线有50-100个3D点。有没有更快的方法呢?

def distanceBetweenCurves(C1, C2):
    D = scipy.spatial.distance.cdist(C1, C2, 'euclidean')

    #none symmetric Hausdorff distances
    H1 = np.max(np.min(D, axis=1))
    H2 = np.max(np.min(D, axis=0))

    return (H1 + H2) / 2.

def distanceMatrixOfCurves(Curves):
    numC = len(Curves)

    D = np.zeros((numC, numC))
    for i in range(0, numC-1):
        for j in range(i+1, numC):
            D[i, j] = D[j, i] = distanceBetweenCurves(Curves[i], Curves[j])

    return D

3 个答案:

答案 0 :(得分:5)

您的问题也可能与this one

有关

这是一个很难的问题。一种可能的方法是自己实现欧几里德距离,完全放弃scipy并使用pypy的JIT编译器。但最有可能的是,这不会让你感到害怕。

就个人而言,我建议你用C语言编写例程。

问题不在于实施,而在于您解决此问题的方式。您通过计算每个可能的度量空间子集对中每个不同点对的欧几里德距离来选择强力方法。这在计算上要求很高:

  • 假设您有500条曲线,每条曲线有75个点。使用蛮力方法,您最终计算欧氏距离500 * 499 * 75 * 75 = 1 403 437 500次。这种方法需要永远运行,这并不令人惊讶。

我不是这方面的专家,但我知道Hausdorff距离广泛用于图像处理。我建议你浏览文献中的速度优化算法。起点可能是thisthis论文。此外,经常与豪斯多夫距离一起提到的是Voroni diagram

我希望这些链接可以帮助您解决此问题。

答案 1 :(得分:2)

我最近回复了类似的问题: Hausdorff distance between 3D grids

我希望这有帮助,我在成对比较中面对25 x 25.000点(总共25 x 25 x 25.000点),我的代码从1分钟到3-4小时(取决于点数) )。为了获得速度,我没有多少选择。

替代方案可以是使用不同的编程语言(C / C ++)或将此计算引入GPU(CUDA)。我现在正在玩CUDA方法。

2015年12月3日编辑:

通过并行基于CPU的计算,我能够加快这种比较。这是最快捷的方式。我使用了 pp 包( parallel python )的漂亮示例,我在三种不同的计算机和phython组合上运行。 不幸的是,我一直有使用python 2.7 32位的内存错误,所以我安装了WinPython 2.7 64位和一些实验性的numpy 64位软件包。

enter image description here

所以对我来说这个effor非常有帮助,它对我来说并不像CUDA那么复杂....祝你好运

答案 2 :(得分:0)

您可以尝试以下几种方法:

  1. 使用numpy-MKL,它利用英特尔的高性能数学核心库而不是numpy;
  2. 使用Bootleneck进行数组功能;
  3. 使用Cpython进行计算。