我读过一篇论文,他们的检索系统是基于SIFT描述符和快速近似k均值聚类的。我安装了pyflann
.如果我没记错的话,以下命令仅查找特定样本的接近数据点的索引(例如,此处,从 dataset
到 testset
的 5 个最近点的索引(
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)
但是,我浏览了用户手册,可以找到如何使用FLANN
进行k-means
集群,以及如何根据集群中心拟合测试。由于我们可以在scikitlearn中使用kmeans++
聚类,然后我们根据模型拟合数据集:
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
使用相同的程序吗?(我的意思是对数据集进行聚类(查找聚类中心并量化特征(,然后根据上一步中找到的聚类中心量化测试集(。
您将无法使用 FLANN 进行最佳变体,因为它们同时使用两个索引,并且实现起来很丑陋。
但是,您可以在每次迭代的中心上构建一个新索引。但除非你有 k> 1000,否则它可能没有多大帮助。