背景描述
最近在做高维特征向量查找比对的过程中,由于数据库内的数据过于庞大,从头遍历效率太低,故想要寻找一些快速的高维空间向量的查找方式。
经过调研与学习,笔者发现有球树、KDtree等多种高维空间向量查找方式,但是都存在一个共性的问题,即:在分类边界容易出现分类错误的现象发生。故在本篇笔者提出了一种新的高维空间向量查找方式,希望可以对读者有新的启发。
原理详解
KDtree原理详解与缺陷详解
原理详解
KDtree的构建过程是一个递归的过程,其核心在于不断将特征向量空间细分为更小的子空间。在每一次递归中,选择某一维度进行划分,并确定一个划分点,将当前子空间划分为两个子空间。这一划分过程基于数据的分布特性以及分类任务的需求,旨在使得划分后的子空间内数据点的相似度尽可能高,而不同子空间间的数据点相似度尽可能低。
为了确定划分维度和划分点,我们采用了一系列统计方法。具体而言,我们计算每个维度上的数据分布特性,包括方差、信息增益,并选择那些能够最大程度区分不同类别的维度进行划分。划分点的选择则基于该维度上数据的分布情况,选择能够使得划分后子空间内数据点分布尽可能均匀的点作为划分点。
在划分子空间的过程中,我们还需要为每个子空间选取一个代表向量。这个代表向量选择为该子空间内所有数据点的均值或中位数,它能够较好地反映该子空间内数据点的整体特性。通过将代表向量作为分类树的节点,我们构建了一个能够反映特征向量分布的分类树结构。
最终得到的高维分类树不仅具有直观的结构,而且能够高效地处理高维数据。通过遍历分类树,我们可以快速地找到与给定特征向量相似的数据点,从而实现高效的分类和检索任务。
缺陷详解
KDtree在边界处可能会出现分类错误的情况。若分类的边界刚好处于目标向量和待查找向量之间,那么就会出现分类错误的情况。
优化思路详解与维诺图原理详解
本文采用高维空间维诺图三角剖分的方式补齐这一缺陷。
构建高维球面维诺图的关键在于对单位球面上的点集进行区域划分。这个过程涉及到复杂的计算几何算法,包括三角剖分技术。三角剖分是将球面划分为一系列小三角形的过程,每个小三角形都对应三个特征向量,并且与其相邻的三角形共享边或顶点。通过这样的剖分,我们可以将单位球面划分为一个由小三角形组成的网格结构,将所有的邻接三角内的点进行两两连接构成为维诺图。每个维诺图的cell内部的点都离其对应的特征向量最近。需要注意的是,高维球面上的三角剖分算法采用的距离算法并非空间的欧几里得距离,而是球面距离,即大圆距离。对于该算法的一个三维球面映射如下图所示:
【立马补上】
一旦构建了高维球面维诺图,我们就可以通过查询该图来快速找到每个特征向量的邻接点集。具体来说,对于给定的特征向量,我们只需找到包含该向量的三角形,然后进一步查找与该三角形相邻的其他三角形所对应的特征向量,即可得到其临近点集。
通过高维空间分类树的方式找到目标特征向量的近似值,再通过维诺图的方式找到近似值的临近点集。最后在此临近点集中查找余弦相似度最近的特征向量。通过上诉方案,可以高效而准确的获取人脸目标特征向量的最近向量。从而大大提高目标人脸的查找效率。