如何选择最佳的最近邻算法

简介: 如何选择最佳的最近邻算法

介绍一种通过数据驱动的方法,在自定义数据集上选择最快,最准确的ANN算法

640.png

人工神经网络背景

KNN是我们最常见的聚类算法,但是因为神经网络技术的发展出现了很多神经网络架构的聚类算法,例如 一种称为HNSW的ANN算法与sklearn的KNN相比,具有380倍的速度,同时提供了99.3%的相同结果。

为了测试更多的算法,我们整理了几种ANN算法,例如

  • Spotify’s ANNOY
  • Google’s ScaNN
  • Facebook’s Faiss
  • HNSW(Hierarchical Navigable Small World graphs)
  • 一些其他算法

作为数据科学家,我我们这里将制定一个数据驱动型决策来决定那种算法适合我们的数据。在本文中,我将演示一种数据驱动的方法,通过使用出色的an-benchmarks GitHub存储库,确定哪种ANN算法是自定义数据集的最佳选择。

640.png

下图是通过使用距离度量在glove-100 数据集上运行ANN基准而得到的图形。在此数据集上,scann算法在任何给定的Recall中具有最高的每秒查询数,因此在该数据集上具有最佳的算法。

640.png

总流程

这些是在自定义数据集上运行ann-benchmarks代码的步骤。

  • 在python 3.6环境中安装ann-benchmarks。
  • 将自定义嵌入数据框架上传到anbenchmarks / data目录。
  • 更新ann-benchmarks / ann-benchmarks / dataset.py,以读取并拆分新的自定义DataFrame。
  • 运行基准测试代码。
  • 绘制结果

1.在python 3.6环境中安装ann-benchmarks

此步骤的代码需要在终端中执行。我在使用anaconda进行环境设置。这将需要几分钟才能完成。您可以使用proc参数增加并发进程的数量,从而加快速度。我仅在安装完成后才升级pandas和scipy。

在撰写本文时,Ann基准仅支持Python 3.6。

condacreate-nannpython=3.6jupyterlab-ycondaactivateanngitclonehttps://github.com/erikbern/ann-benchmarks.gitcdann-benchmarks/pipinstall-rrequirements.txtpythoninstall.py--proc=8pipinstall--upgradepandasscipymkdirdata

可能出现的问题:

  • 未安装gcc:使用sudo apt-get install gcc安装GCC。
  • 权限问题:如果在运行python install.py时遇到任何权限问题,只需使用sudo / opt / conda / envs / ann / bin / python install.py即可运行它。使用sudo时,请记住在您的环境中提供anaconda python的完整路径。

2.上传自定义DataFrame

在此步骤中,将自定义数据框架文件复制到ann-benchmarks / data目录中。对于这篇文章,我的DataFrame与使用的带有FastText句子嵌入的[Amazon产品数据集]。但是,我只是随机抽样5万行,以确保基准测试能够在合理的时间内运行。以下是将嵌入数据框保存为正确目录中名为custom-euclidean.pkl的文件的代码,也是该数据框前5行的摘录。

df.to_pickle('ann-benchmarks/data/custom-euclidean.pkl')
df.head()

640.png

3.更新datasets.py以处理您的自定义DataFrame

我们需要更新ANN基准代码,编写我们的新的DataFrame处理代码。我们在ann-benchmarks / ann-benchmarks / datasets.py文件的末尾添加了一个新的function和dictionary元素。距离参数的允许选项是“euclidean”,“angular”,“hamming”或“jaccard”。距离度量的选择特定于您的问题。就我而言,我发现“欧式距离”提供了最好的结果

defcustom_dataset(out_fn, test_ratio, distance):
#Functiontohandleourcustomdatasetimportpandasaspd#ReadtheDataFrame#out_fnisoftheform'data/<dataset-name>.hdf5'df=pd.read_pickle(out_fn.split('.')[0]+'.pkl')
#ConvertsingleembeddingcolumntonumpylistoflistsX=pd.DataFrame(df['emb'].tolist()).to_numpy()    
#SplitTrainandTestX_train, X_test=train_test_split(X, test_size=test_ratio)
#WriteHDF5Outputwrite_output(X_train, X_test, out_fn, distance)
#Createanewdictionaryelementtocallournewfunction#20%ofrowsusedasTestSet#EuclideandistanceusedasmeasureforfindingneighborsDATASETS['custom-euclidean'] =lambdaout_fn: custom_dataset(out_fn, test_ratio=0.2, distance='euclidean')

4.运行基准测试代码

如果到目前为止一切顺利,我们现在可以通过从终端调用以下代码来运行基准测试。将并行性的值更改为要使用的尽可能多的CPU内核。我使用的是16核CPU,因此我选择parallelism = 14来为其他任务保留2核。这将需要一些时间才能完成。我的具有20%测试集的5万数据行了大约7个小时。

pythonrun.py--dataset='custom-euclidean'--parallelism=14

5.绘制结果

运行完成后,我们可以通过运行plot.py绘制结果。我们还可以使y轴以对数比例绘制。请注意,我在使用sudo时使用了Anaconda Python的完整路径,因为在尝试正常运行plot.py时遇到权限问题:python plot.py --dataset = custom-euclidean --y-log。您可以使用任何适合您的方法。

sudo/opt/conda/envs/ann/bin/pythonplot.py--dataset=custom-euclidean--y-log

结果图将作为png文件保存在结果目录中。对于我在本文中使用的5万行Amazon数据集,结果如下。

640.png

从该图中可以看出,通过在任意给定的Recall上每秒提供更高的查询,诸如NGT-onng,hnsw(nmslib),n2,hnswlib,SW-graph(nmslib)之类的算法明显优于其余算法。因此,我们可以在亚马逊产品数据集上为我们的项目进一步探索这些算法。

总结

总之,通过使用ann-benchmarks,并编写一些自定义的代码,我们可以 在自己的自定义数据集上测试大量的ANN算法,以缩小筛选范围,以进一步探索。这篇文章的所有代码都可以在我的Github存储库中找到。感谢您的阅读!

代码地址:https://github.com/stephenleo/adventures-with-ann/blob/main/ann_benchmarking.ipynb

目录
相关文章
|
存储 运维 算法
UUID和雪花(Snowflake)算法该如何选择?
UUID和雪花(Snowflake)算法该如何选择?
326 0
|
机器学习/深度学习 数据采集 算法
Py之scikit-learn:机器学习Sklearn库的简介、安装、使用方法(ML算法如何选择)、代码实现之详细攻略
Py之scikit-learn:机器学习Sklearn库的简介、安装、使用方法(ML算法如何选择)、代码实现之详细攻略
Py之scikit-learn:机器学习Sklearn库的简介、安装、使用方法(ML算法如何选择)、代码实现之详细攻略
|
19天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
4天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
5天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
6天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
5天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。
|
5天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
22 3