全文共5889字,预计学习时长15分钟
图源:Google
我们正在经历一场灭绝性的大事件,颇受欢迎的KNN算法正面临淘汰,而几乎每门数据科学课上都会学习这种算法!
KNN背景
寻找与给定项目的K个相似项的做法在机器学习界被广泛称为“相似”搜索或“最近邻”(NN)搜索。最广为人知的最近邻搜索算法便是K最近邻(KNN)算法。
它的用途很广,在已有的物品集如手机电商目录中,运用KNN,便可以从这一整个目录中找到一个少数(K)最近邻来发起新的搜索请求。
比如说,在下面这个例子中,如果将K设为3,那每一个“iphone”的3最近邻便是其他“iphone”。类似地,对每一个“Samsung”的3最近邻便是所有的Samsungs。
6款手机的目录
KNN的问题
尽管KNN很适合寻找类似项,但是它使用的是穷尽匹配距离计算方法。如果数据中有1000项的话,要找到一个新产品中K=3的最近邻,该算法就会把新产品与数据库中其他产品一起执行1000次距离计算。
这还不算太糟糕。但试想在现实中,顾客对顾客(C2C)的市场数据库里有着上百万的产品,并且每天都可能会上传新的产品。把新产品与所有数百万的产品进行比对的做法确实太浪费时间了,也就是说根本无法拓展。
解决方法
让最近邻在大量的数据中也适用的解决方法就是彻底规避这种暴力的距离计算法,代之以更复杂的一类算法,名为近似最近邻(ANN)。
近似最近邻(ANN)
严格来说,近似最近邻这种算法在最近邻搜索中允许少量的错误。但在现实中的C2C市场里,“真正的”最近邻的数字要比被搜索的“K”最近邻高。相比暴力的KNN,ANN能够在短时间内达到惊人的准确率。下列有几种ANN算法:
· Spotify的【ANNOY】
· Google的【ScaNN】
· Facebook的【Faiss】
· 还有个人最爱:分层可导航小世界图【HNSW】
下面我们把焦点从Python的 sklearn中的KNN算法转向在Python的hnswlib 包中的HNSW图这一出色的ANN算法。接下来将使用大型的【Amazon product dataset】,其中包含‘手机&配件’分类中的527000个产品,以此来证明HNSW的速度非常快(准确说是快380倍),同