在介绍腾讯词向量时,用到了annoy,这里对annoy的用法详细做一下介绍。

GitHub地址:https://github.com/spotify/annoy

Annoy是Erik Bernhardsson在Hack Week期间花了几个下午写的(github原话),全称Approximate Nearest Neighbors Oh Yeah(这个Oh Yeah真是亮瞎眼)。这个包的优点就是快,内存占用也小,还可以静态存储索引用于更多任务。目前已经在音乐推荐系统Spotify中应用。

这个工具可以用来计算空间中点的距离,输入某个点,返回最近的若干点。

这个包直接pip install annoy就可以安装,C++版本的直接下载后#include "annoylib.h"

使用方法:

from annoy import AnnoyIndex
import randomf = 40
t = AnnoyIndex(f, 'angular')  # Length of item vector that will be indexed
for i in range(1000):v = [random.gauss(0, 1) for z in range(f)]t.add_item(i, v)t.build(10) # 10 trees
t.save('test.ann')# ...u = AnnoyIndex(f, 'angular')
u.load('test.ann') # super fast, will just mmap the file
print(u.get_nns_by_item(0, 1000)) # will find the 1000 nearest neighbors

默认的索引是从0到n-1。

API:

AnnoyIndex(f, metric) f 向量维度,metric 距离度量方式,取值 "angular", "euclidean", "manhattan", "hamming", or "dot". 计算angular是使用的sqrt(2(1-cos(u,v)))这个公式,用的欧几里得距离。euc = sqrt(2(1-cos))。

a.add_item(i, v) 添加元素 i 和向量 v

a.build(n_trees, n_jobs=-1) n_trees是森林的树数目,值越大结果越精确,n_jobs 进程数,默认-1使用所有的CPU。build调用之后,就不能再添加元素了。

a.save(fn, prefault=False) 保存到本地

a.load(fn, prefault=False) 从本地读取,prefault是预先读入内存,默认为False.

a.unload() 清除加载内容

a.get_nns_by_item(i, n, search_k=-1, include_distances=False) 返回n个最近元素。在查询过程中,它将检查search_k个节点,如果没有提供,默认为n_trees * n。search_k给了一个速度和准确率的折中。include_distances设为True,会提供一个由两个列表组成的二元组,第二个列表包含所有相关的距离。

a.get_nns_by_vector(v, n, search_k=-1, include_distances=False)结果一样,不过是通过向量v来查询。

a.get_item_vector(i) 返回索引i对应的向量

a.get_distance(i, j) 返回元素i和j的距离,squared distance

a.get_n_items() 返回元素数量

a.get_n_trees() 返回树数目

a.on_disk_build(fn) 指定在除了RAM之外的其他文件上构建索引(在添加元素之前执行)

a.set_seed(seed) 在构建树之前可以指定随机数

这里面主要有两个参数需要调,n_trees和search_k,一个是构建时的参数,一个是搜索时的参数。

下面这是qps和recall值之间的trade-off,使用时要综合考虑准确率和速度。

【annoy】高维空间求近似最近邻相关推荐

  1. 余弦相似度 高维数据_海量高维数据与近似最近邻

    在实际工程当中,我们常常会遇到海量的数据,那作为一个数据挖掘准从业人员,如何从海量的数据当中挖掘出他们数据之间的关系和规律就显得尤为重要了. 今天我要讲的时海量高维数据及其近似最近邻方案. K-近邻算 ...

  2. 最近邻查找最优算法_近似最近邻算法-annoy解析

    转自https://www.cnblogs.com/futurehau/p/6524396.html Annoy是高维空间求近似最近邻的一个开源库. Annoy构建一棵二叉树,查询时间为O(logn) ...

  3. RBF神经网络——直接看公式,本质上就是非线性变换后的线性变化(RBF神经网络的思想是将低维空间非线性不可分问题转换成高维空间线性可分问题)...

    Deeplearning Algorithms tutorial 谷歌的人工智能位于全球前列,在图像识别.语音识别.无人驾驶等技术上都已经落地.而百度实质意义上扛起了国内的人工智能的大旗,覆盖无人驾驶 ...

  4. 高维空间最近邻逼近搜索算法评测

    高维空间最近邻逼近搜索算法评测 最近邻方法是机器学习中一个非常流行的方法,它的原理很容易理解:邻近的数据点是相似的数据点,更可能属于同一分类.然而,在高维空间中快速地应用最近邻方法,却是非常有挑战性的 ...

  5. 海量数据索引与近似最近邻随记

    最近邻问题(NN) 将次数看成向量,然后我们就可以比对向量的距离(欧式距离,余弦距离).数据中会有一些异常点,这些异常点会导致结果的不稳定.这种思想非常的不稳定,因为他只基于一个样本来做最后类别的判定 ...

  6. 快速近似最近邻算法_数据科学家指南,以选择最佳近似最近邻算法

    快速近似最近邻算法 by Braden Riggs and George Williams (gwilliams@gsitechnology.com) Braden Riggs和George Will ...

  7. 一个点到多边形顶点距离相同_走进高维空间——所有点之间的距离都相等!奇妙、疯狂、不可思议...

    欢迎来到高维系列的第三部分,在这里我们将探索高维空间中一些奇怪而不可思议的现象.这是走进高维空间系列的第三部分,感兴趣的朋友可以阅读前两个部分,在文章的末尾我会附上链接. 今天我们将探索一种现象,这种 ...

  8. Computer Science Theory for the Information Age-3: 高维空间中的高斯分布和随机投影

    Computer Science Theory for the Information Age-3: 高维空间中的高斯分布和随机投影 高维空间中的高斯分布和随机投影 (一)在高维球体表面产生均匀分布点 ...

  9. LSH 近似最近邻查找

    一.什么是近似最近邻查找 NN与ANN NN,Nearest Neighbor Search,最近邻查找问题 KNN,K-Nearest Neighbor,k最近邻,查找离目标数据最近的前k个数据项 ...

最新文章

  1. mongodb数据库的一些常用命令列表
  2. Vulnhub靶机渗透之 RAVEN: 1
  3. leetcode632. 最小区间(堆+多指针)
  4. 安卓学习笔记20:Fragment入门
  5. 风控人需知:信贷风险流程中的决策矩阵与实操
  6. POJ 3624 Charm Bracelet【01背包】
  7. 笔记本电脑频繁自动重启_电脑为何总是自动重启 电脑自动重启原因【解决方法】...
  8. 百度地图点聚合仿链家定位点多级聚合,且滑动、刷新加载定位点
  9. 清华大学出版社2013年第二期书评征集图书列表
  10. Winform实现微信功能
  11. 免费4s店汽车保养维修记录查询的方式
  12. 亲身经历:程序人生路上的荆棘与感动
  13. flex effect
  14. DNS云监控出现问题如何解决
  15. 教学资源库建设计算机专业,教学资源库建设计算机应用论文
  16. html 剩余时间 自动减,HTML+CSS+JS实现今天的日期和今天剩余的时间
  17. 安装radis看我就可以了
  18. 【bzoj3620】【似乎在梦中见过的样子】【kmp】
  19. 复式、别墅、大户型无线wifi覆盖方案
  20. 如何安全地打开远程桌面,防止被勒索病毒攻击?

热门文章

  1. 工程项目缺少C文件会怎么样?STM32 flasher
  2. 数据资产管理 与 智能设备_如何使用“智能管理器”释放三星设备上的空间
  3. 航空铝合金和客家话艰苦
  4. ARFoundation入门到精通 - 1.2 ARCore 支持机型
  5. 客户数据管理的法宝——应用创新的“信息生命周期管理”四步法则
  6. ✔️连读(略读)规则:
  7. stripos() 函数
  8. Java 8 的一些新特性
  9. 生成唯一序列号 Unique ID
  10. 系统设计面试题 之 如何设计Pastebin.com