我在matlab中使用FLANN并使用SIFT特征描述符作为我的数据。有一个功能:
[result, ndists] = flann_search(index, testset, ...);
这里index
是用kd-tree构建的。 “用户手册”表示result
返回testset
中样本的最近邻居,ndists
包含测试样本与最近邻居之间的相应距离。我使用了欧氏距离,发现ndists
中的距离与原始数据计算的距离不同。更奇怪的是,ndists
中的所有数字都是整数,这对于欧氏距离来说通常是不可能的。你能帮我解释一下吗?
答案 0 :(得分:1)
FLANN默认返回平方欧氏距离(x 1 2 + ... + x n < SUP> 2 )。您可以使用flann_set_distance_type(type, order)
更改已使用的指标(请参阅manual)。
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特征是整数,因此在平方欧氏距离的情况下,结果距离也是整数。