I J*_*I J 4 kdtree nearest-neighbor knn computational-geometry
我正在寻找一种方法来做快速最近邻居(希望是O(log n))的高维点(通常是~11-13维).我希望它在初始化结构后的插入过程中表现得最佳.KD树出现在我的脑海中,但是如果你不进行批量加载但是进行动态插入,则kd树不再平衡,并且afaik平衡是一项昂贵的操作.
所以,我想知道你喜欢哪种数据结构进行这种设置.您有高维度点,并且您想要插入并查询最近邻居.
维度的诅咒在这里受到阻碍.您可以考虑应用主成分分析(PCA)来降低维数,但据我所知,没有人对此有很好的答案.
我之前(在音频和视频指纹识别中)处理过这种类型的问题,有时最多有30个维度.分析通常显示某些维度不包含搜索的相关信息(实际上是模糊搜索,我的主要目标),所以我从用于访问数据的索引结构中省略了它们,但是将它们包含在逻辑中以确定来自搜索期间找到的候选人名单.这有效地将维度降低到易处理的水平.
我通过严格量化剩余维度来进一步简化了事情,使得整个多维空间被映射为32位整数.我使用它作为STL映射(红黑树)中的键,尽管我可以使用哈希表.我能够在大约一两分钟内动态地向这样的结构(基于RAM)添加数百万条记录,并且搜索平均花费大约一毫秒,尽管数据并非均匀分布.搜索需要仔细枚举映射到32位密钥的维度中的值,但是足够可靠,可以在商业产品中使用.如果我的消息来源正确的话,我相信它在iTunes Match中已经习惯了.:)
最重要的是,我建议你看看你的数据并做一些利用其中的功能的自定义,以便快速索引和搜索.找到变化最大且彼此最独立的维度.量化这些并将它们用作索引中的关键字.索引中的每个存储桶都包含共享该密钥的所有项目(可能会有多个).要查找最近的邻居,请查看"附近"键并在每个桶中查找附近的值.祝好运.
ps我写了一篇关于我的技术的论文,可以在这里找到.对于付费墙感到抱歉.也许你可以在其他地方找到免费副本.如果您对此有任何疑问,请与我们联系.
| 归档时间: |
|
| 查看次数: |
603 次 |
| 最近记录: |