1951年推出的K-Nearest邻居(K-NN)算法已被广泛用于分类和回归任务。核心概念涉及将K最相似的实例(邻居)识别到数据集中的给定查询点,并使用这些邻居进行预测或分类。近年来,矢量数据库和向量索引的重要性已经增长,特别是在处理大量文本和其他数据数据集中,信息检索以支持大型语言模型(LLMS)。该应用程序的一个突出例子是检索仪器(RAG)。
该项目比较了各种数据集大小和尺寸的不同K-NN搜索算法的性能。比较的算法是:
KD-Tree(K维树):
y
|
4 | C
| A D
2 | B
|___________
0 2 4 x
点:A(1,3),B(3,1),C(4,3),D(3,3)树结构:root(x = 2) - >左(y = 2) - >右(x = 3)
球树:
y
|
4 | (C)
| (A) (D)
2 | (B)
|___________
0 2 4 x
外圆包含所有点,内圆圈划分子集。
完整的KNN(蛮力):
y
|
4 | C
| A D
2 |----Q--B
|___________
0 2 4 x
计算距离:QA = 1.41,QB = 1,QC = 2.24,QD = 1.41结果:最近的2个邻居是B和A(或D)
HNSW(层次可通航的小世界):
Layer 2: A --- C
|
Layer 1: A --- B --- C
| | |
Layer 0: A --- B --- C --- D --- E
搜索从顶层的随机点开始,然后下降,探索每个级别的邻居直到到达底部。
这些算法之间的选择取决于数据集大小,维度,所需的准确性和查询速度。 KD-Tree和Ball树提供了精确的结果,并且对于低到中等的尺寸有效。完整的KNN很简单,但对于大型数据集而言变得很慢。 HNSW在速度和准确性之间提供了良好的平衡,尤其是对于高维数据或大型数据集提供了良好的平衡。
克隆这个存储库:
git clone https://github.com/yourusername/knn-search-comparison.git
cd knn-search-comparison
创建虚拟环境(可选但建议):
python -m venv venv
source venv/bin/activate # On Windows, use `venvScriptsactivate`
安装所需的依赖项:
pip install -r requirements.txt
这将安装requirements.txt文件中列出的所有必要软件包,包括numpy,scipy,scikit-learn,hnswlib,tabulate和tqdm。
使用默认参数运行比较测试:
python app.py
您还可以使用命令行参数自定义测试参数:
python app.py --vectors 1000 10000 100000 --dimensions 4 16 256 --num-tests 5 --k 5
可用参数:
--vectors :测试矢量计数列表(默认值:1000,2000,5000,10000,20000,50000,100000,200000)--dimensions :要测试的尺寸列表(默认值:4 16 256 1024)--num-tests :每种组合要运行的测试数(默认值:10)--k :搜索最近的邻居数(默认:10)该脚本将在执行过程中显示进度条,使您估算剩余时间。
可以随时按CTRL+C来中断该脚本。即使在耗时的操作中,例如构建HNSW索引,它也将尝试优雅地退出。
该脚本将在控制台中显示进度并结果。完成后,您会看到:
单个组合的示例输出:
Results for 10000 vectors with 256 dimensions:
KD-Tree build time: 0.123456 seconds
Ball Tree build time: 0.234567 seconds
HNSW build time: 0.345678 seconds
KD-Tree search time: 0.001234 seconds
Ball Tree search time: 0.002345 seconds
Brute Force search time: 0.012345 seconds
HNSW search time: 0.000123 seconds
最终结果表和CSV文件将包括每种算法的构建时间和搜索时间,从而可以全面比较不同矢量计数和维度的性能。
您可以在app.py中修改以下变量以调整测试参数:
NUM_VECTORS_LIST :测试矢量计数列表NUM_DIMENSIONS_LIST :测试尺寸列表NUM_TESTS :每种组合要运行的测试数K :最近的邻居数量欢迎捐款!请随时提交拉动请求。
该项目是开源的,并根据麻省理工学院许可获得。
以下是显示KNN搜索结果的图表:

包含详细结果的CSV文件可在此处找到。