如何使用 FLANN 进行标记和聚类?

Posted

技术标签:

【中文标题】如何使用 FLANN 进行标记和聚类?【英文标题】:How to use FLANN for labeling and clustering? 【发布时间】:2018-08-19 03:31:39 【问题描述】:

我读过一篇论文,他们的检索系统基于 SIFT 描述符和fast approximate k-means clustering。我安装了pyflann。如果我没记错的话,以下命令只会找到特定样本的接近数据点的索引(例如,这里是从datasettestset 的 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 clusterin。以及如何根据集群中心拟合测试。因为我们可以在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 使用相同的程序吗? (我的意思是对数据集进行聚类(找到聚类中心并量化特征),然后根据上一步找到的聚类中心量化测试集。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢您的评论。请问FLANN有什么用? flann.nn() 函数到底在做什么?我将它用于数据集中点的坐标 (x,y),并通过 thisflann.nn(dataset,testset, 5, algorithm="kdtree") 进行测试集,以获得 5 个最近点。是正确的还是我的理解有误? 我是否可以使用设置kmeans 算法的 FLANN 并通过分配 2000 作为簇数来量化 SIFT 特征?谢谢 非常感谢您分享您的知识。

以上是关于如何使用 FLANN 进行标记和聚类?的主要内容,如果未能解决你的问题,请参考以下文章

使用 IF NOT EXISTS 使用主键和聚类列进行唯一插入

2. 观点提取和聚类代码详解

使用 SciKit-Image 和 SciKit-Learn 进行图像预处理和聚类 - 需要一些建议

如何在 GoogleMaps for iOS 中使用自定义标记进行标记聚类?

如何对标记化的文档进行聚类

时间序列的快速傅里叶变换和聚类