高维数据的快速最近邻算法FLANN

1.     简介

在计算机视觉和机器学习中,对于一个高维特征,找到训练数据中的最近邻计算代价是昂贵的。对于高维特征,目前来说最有效的方法是 the randomized k-d forest和the priority search k-means tree,而对于二值特征的匹配 multiple hierarchical clusteringtrees则比LSH方法更加有效。

目前来说,fast library for approximate nearest neighbors (FLANN)库可以较好地解决这些问题。

2.     快速近似NN匹配(FAST APPROXIMATE NN MATCHING)

2.1 随机k-d树算法(The Randomized k-d TreeAlgorithm)

a. Classick-d tree

找出数据集中方差最高的维度,利用这个维度的数值将数据划分为两个部分,对每个子集重复相同的过程。

参考http://www.cnblogs.com/eyeszjwang/articles/2429382.html

b.  Randomizedk-d tree

建立多棵随机k-d树,从具有最高方差的N_d维中随机选取若干维度,用来做划分。在对随机k-d森林进行搜索时候,所有的随机k-d树将共享一个优先队列。

增加树的数量能加快搜索速度,但由于内存负载的问题,树的数量只能控制在一定范围内,比如20,如果超过一定范围,那么搜索速度不会增加甚至会减慢。

2.2  优先搜索k-means树算法(The Priority Search K-MeansTree Algorithm)

随机k-d森林在许多情形下都很有效,但是对于需要高精度的情形,优先搜索k-means树更加有效。 K-means tree 利用了数据固有的结构信息,它根据数据的所有维度进行聚类,而随机k-d tree一次只利用了一个维度进行划分。

2.2.1  算法描述

算法1 建立优先搜索k-means tree:

(1)  建立一个层次化的k-means 树;

(2)  每个层次的聚类中心,作为树的节点;

(3)  当某个cluster内的点数量小于K时,那么这些数据节点将做为叶子节点。

算法2 在优先搜索k-means tree中进行搜索:

(1)  从根节点N开始检索;

(2)  如果是N叶子节点则将同层次的叶子节点都加入到搜索结果中,count += |N|;

(3)  如果N不是叶子节点,则将它的子节点与query Q比较,找出最近的那个节点Cq,同层次的其他节点加入到优先队列中;

(4)  对Cq节点进行递归搜索;

(5)  如果优先队列不为空且 count<L,那么从取优先队列的第一个元素赋值给N,然后重复步骤(1)。

聚类的个数K,也称为branching factor 是个非常主要的参数。

建树的时间复杂度 = O( ndKI ( log(n)/log(K) ))  n为数据点的总个数,I为K-means的迭代次数。搜索的时间复杂度 = O( L/K * Kd * ( log(n)/(log(K) ) ) = O(Ld ( log(n)/(log(K) ) )。

2.3 层次聚类树 (The Hierarchical ClusteringTree)

层次聚类树采用k-medoids的聚类方法,而不是k-means。即它的聚类中心总是输入数据的某个点,但是在本算法中,并没有像k-medoids聚类算法那样去最小化方差求聚类中心,而是直接从输入数据中随机选取聚类中心点,这样的方法在建立树时更加简单有效,同时又保持多棵树之间的独立性。

同时建立多棵树,在搜索阶段并行地搜索它们能大大提高搜索性能(归功于随机地选择聚类中心,而不需要多次迭代去获得更好的聚类中心)。建立多棵随机树的方法对k-d tree也十分有效,但对于k-means tree却不适用。

3.      参考文献

(1)  ScalableNearest Neighbor Algorithms for High Dimensional Data. Marius Muja, Member,IEEE and David G. Lowe, Member, IEEE.

(2)  OptimisedKD-trees for fast image descriptor matching. Chanop Silpa-Anan, Richard Hartley.

(3)  FastMatching of Binary Features. Marius Muja and David G. Lowe.

高维数据的快速最近邻算法FLANN,布布扣,bubuko.com

时间: 2024-08-10 17:19:57

高维数据的快速最近邻算法FLANN的相关文章

KNN(最近邻算法)

KNN是最简单的机器学习算法之一. 在模式识别中,K-近邻算法(或近邻的简称)是一种用于分类和回归的非参数方法.[ 1 ]在这两种情况下,输入包含k个最近的训练样本在特征空间中.输出取决于近邻是用于分类或回归: l 在kNN分类中,输出的是一个分类的关系.一个对象是由其邻居投票进行分类,被分类到最近的K个最近邻对象(k是一个正整数,通常小的).如果k = 1,那么对象只是分配到单个最近邻. l 在KNN回归中, 输出该对象的属性值,这个值是k个邻居的平均值. K-NN是一种基于实例的学习,或懒惰

流形学习-高维数据的降维与可视化

1.流形学习的概念 流形学习方法(Manifold Learning),简称流形学习,自2000年在著名的科学杂志<Science>被首次提出以来,已成为信息科学领域的研究热点.在理论和应用上,流形学习方法都具有重要的研究意义. 假设数据是均匀采样于一个高维欧氏空间中的低维流形,流形学习就是从高维采样数据中恢复低维流形结构,即找到高维空间中的低维流形,并求出相应的嵌入映射,以实现维数约简或者数据可视化.它是从观测到的现象中去寻找事物的本质,找到产生数据的内在规律. 以上选自百度百科 简单地理解

KNN(k-nearest neighbor的缩写)又叫最近邻算法

机器学习笔记--KNN算法1 前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 KNN算法简介 KNN(k-nearest neighbor的缩写)又叫最近邻算法.是1968年由Cover和Hart提出的一种用于分类和回归的无母数统计方法.什么叫无母统计方法呢,这里作个补充:无母统计方法又称非参数统计学,是统计学的一个分支,适用于母群体情况未明,小样

[转]快速平方根算法

在3D图形编程中,经常要求平方根或平方根的倒数,例如:求向量的长度或将向量归一化.C数学函数库中的sqrt具有理想的精度,但对于3D游戏程式来说速度太慢.我们希望能够在保证足够的精度的同时,进一步提高速度. Carmack在QUAKE3中使用了下面的算法,它第一次在公众场合出现的时候,几乎震住了所有的人.据说该算法其实并不是Carmack发明的,它真正的作者是Nvidia的Gary Tarolli(未经证实). // // 计算参数x的平方根的倒数 // float InvSqrt (float

TensorFlow经典案例2:实现最近邻算法

本次案例需要大家了解关于手写数字识别(mnist)的数据集的特点和结构: #TensorFlow实现最近邻算法 #次案例的前提是了解mnist数据集(手写数字识别) import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data #导入mnist数据集 mnist = input_data.read_data_sets("/tmp/data/",

Java中Map相关的快速查找算法与唯一性(转载)

原文地址:http://blog.csdn.net/chuyuqing/article/details/19629229 在对<Set和hashCode()>的一篇原创文章写完后,由于对自己的一些论断产生了模糊和怀疑,因此又对Set进行了一些研究,形成本篇. 在Set的使用场景中,我们不外乎看中了她存储数据的唯一性,即不能存储重复值,这在某些应用场合下是很必要的一个特性.那么从更深一层来考虑,Set究竟如何使数据不重复的呢?从另一个层面来考虑,她又如何确保在验证数据是否重复过程中的快速性呢?假

快速乘法/快速幂 算法

快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩阵快速乘法 一.整数运算:(快速乘法.快速幂) 先说明一下基本的数学常识: (a*b) mod c == ( (a mod c) * (b mod c) ) mod c //这最后一个mod c 是为了保证结果不超过c 对于2进制,2n可用1后接n个0来表示.对于8进制,可用公式 i+3*j ==

gamma原理及快速实现算法(C/C++)

参考 http://www.cambridgeincolour.com/tutorials/gamma-correction.htm http://en.wikipedia.org/wiki/Gamma_correction 论文Gamma矫正的快速算法以及其C语言实现 一.什么是Gamma校正 Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: [2]   A是一个常数,通常取1,这个指数即为Gamma 经过Gamma校正后的输入和输出图像灰度值关系

数据采样与处理算法

数据采样与处理算法 这里特别说明,输入量是作为周期函数的算法 ? 均方根算法(参考馈线终端单元的设计与实现-郭阳春) 均方根将所采集的离散型的采样点值计算得出电压电流的幅值,主要用于设备的测量功能,该算法不区分系统中的谐波干扰分量,得到是整体的有效值. 算法可以采用多个周期计算一次,在一周期计算一次的情况下,将采样点的采样值先进行平方计算,然后讲一个周期的N点采样值的平方顺序相加,然后将所得的N点采样值的平方和除以N再开放,就可以得到电气量的有效值. 傅立叶算法 傅立叶算法主要是用于将采集到的离