1

我读了一篇论文,他们的检索系统基于 SIFT 描述符和快速近似 k-means 聚类。我安装了pyflann. 如果我没记错的话,下面的命令只会找到特定样本的接近数据点的索引(例如,这里是从datasetto的 5 个最近点的索引testset

from pyflann import *
from numpy import *
from numpy.random import *
dataset = rand(10000, 128)
testset = rand(1000, 128)
flann = FLANN()
result,dists = flann.nn(dataset,testset,5,algorithm="kmeans",
branching=32, iterations=7, checks=16)

但是,我浏览了用户手册,可以找到如何k-means使用FLANN. 以及如何根据集群中心拟合测试。因为我们可以在scikitlearnkmeans++中使用聚类,然后我们根据模型拟合数据集:

kmeans=KMeans(n_clusters=100,init='k-means++',random_state = 0, verbose=0)
kmeans.fit(dataset)

稍后我们可以使用KDTree例如为测试集分配标签。

kdt=KDTree(kmeans.cluster_centers_)
Q=testset  #query
kdt_dist,kdt_idx=kdt.query(Q,k=1)  #knn
test_labels=kdt_idx  #knn=1 labels

有人可以帮助我如何使用相同的程序FLANN吗?(我的意思是对数据集进行聚类(找到聚类中心并量化特征),然后根据上一步找到的聚类中心量化测试集)。

4

1 回答 1

1

您将无法使用 FLANN 进行最佳变体,因为它们同时使用两个索引,并且很难实现。

但是您可以为每次迭代在中心上建立一个新索引。但除非你有 k > 1000,否则它可能不会有太大帮助。

于 2018-03-12T07:08:41.167 回答