0

我在 matlab 中使用 FLANN 并使用 SIFT 特征描述符作为我的数据。有一个功能:

[result, ndists] = flann_search(index, testset, ...);

这里index是用 kd-tree 构建的。“用户手册”说result返回 中样本的最近邻testset,并ndists包含测试样本与最近邻之间的对应距离。我使用了欧几里得距离,发现其中的距离ndists与原始数据计算的距离不同。更奇怪的是,里面的所有数字ndists都是整数,这对于欧几里得距离来说往往是不可能的。你能帮我解释一下吗?

4

1 回答 1

1

FLANN 默认返回平方欧几里得距离 (x 1 2 + ... + x n 2 )。flann_set_distance_type(type, order)您可以使用(参见手册)更改使用的指标 。

一个例子

from pyflann import *
import numpy as np

dataset = np.array(
    [[1., 1, 1, 2, 3],
     [10, 10, 10, 3, 2],
     [100, 100, 2, 30, 1]
     ])
testset = np.array(
    [[1., 1, 1, 1, 1],
     [90, 90, 10, 10, 1]
     ])

result, dists = FLANN().nn(
    dataset, testset, 1, algorithm="kmeans", branching=32, iterations=7, checks=16)

输出:

>>> result
array([0, 2], dtype=int32)
>>> dists
array([  5., 664.])
>>> ((testset[0] - dataset[0])**2).sum()
5.0
>>> ((testset[1] - dataset[2])**2).sum()
664.0

SIFT 特征是整数,因此在平方欧几里得距离的情况下,所得距离也是整数。

于 2013-06-07T13:37:26.323 回答