annoy

Annoy 近邻算法

自作多情 提交于 2021-02-10 07:31:32
Annoy 随机选择两个点,以这两个节点为初始中心节点,执行聚类数为2的kmeans过程,最终产生收敛后两个聚类中心点 二叉树底层是叶子节点记录原始数据节点,其他中间节点记录的是分割超平面的信息 但是上述描述存在两个问题: (1)查询过程最终落到叶子节点的数据节点数小于 我们需要的Top N相似邻居节点数目怎么办? (2)两个相近的数据节点划分到二叉树不同分支上怎么办? 针对这个问题可以通过两个方法来解决: (1)如果分割超平面的两边都很相似,那可以两边都遍历 (2) 建立多棵二叉树树,构成一个森林 (3)所有树返回近邻点都插入到优先队列中,求并集去重, 然后计算和查询点距离, 最终根据距离值从近距离到远距离排序, 返回Top N近邻节点集合 Summary of features Euclidean distance , Manhattan distance , cosine distance , Hamming distance , or Dot (Inner) Product distance Cosine distance is equivalent to Euclidean distance of normalized vectors = sqrt(2-2*cos(u, v)) Works better if you don't have too many

一文看懂HNSW算法理论的来龙去脉

99封情书 提交于 2020-12-25 08:24:18
HNSW算法----Hierarchcal Navigable Small World graphs,第一贡献者:Y.Malkov(俄) 一.背景介绍 在浩渺的数据长河中做高效率相似性查找一直以来都是让人头疼的问题。比如,我在搜狗app上阅读了一篇文章,推荐系统就应当为我推送与这篇文章最相近的文章,数据库中所有文章是用向量表示的,所以我们要解决的问题就是“找到与这篇文章的向量最相近的几个向量”,然后把这些向量对应的文章推送出去。数据库中的文章千千万,所有用户每秒的请求也是千千万,我们需要又快又准又相对节约资源的办法来解决这个问题。 解决这个问题的方法有很多,PQ,Annoy,HNSW等等。篇幅有限,这篇文章只介绍HNSW算法。 二.朴素想法 朴素想法图 请大家把目光投向上面这张图。假设我们现在有13个2维数据向量,我们把这些向量放在了一个平面直角坐标系内,隐去坐标系刻度,它们的位置关系如上图所示。 朴素查找法:不少人脑子里都冒出过这样的朴素想法,把某些点和点之间连上线,构成一个查找图,存下来备用;当我想查找与粉色点最近的一点时,我从任意一个黑色点出发,计算它和粉色点的距离,与这个任意黑色点有连接关系的点我们称之为“友点”(直译),然后我要计算这个黑色点的所有“友点”与粉色点的距离,从所有“友点”中选出与粉色点最近的一个点,把这个点作为下一个进入点,继续按照上面的步骤查找下去

K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍

微笑、不失礼 提交于 2020-10-03 03:46:33
1、什么是K近邻算法 K近邻算法(KNN)是一种常用的分类和回归方法,它的基本思想是从训练集中寻找和输入样本最相似的k个样本,如果这k个样本中的大多数属于某一个类别,则输入的样本也属于这个类别。 关于KNN算法,一个核心问题是: 如何快速从数据集中找到和目标样本最接近的K个样本? 本文将从这个角度切入,介绍常用的K近邻算法的实现方法。具体将从原理、使用方法、时间开销和准确率对比等方面进行分析和实验。 2、距离度量 在介绍具体算法之前,我们先简单回顾一下KNN算法的三要素: 距离度量、k值的选择和分类决策规则 。 其中机器学习领域常用的距离度量方法,有欧式距离、余弦距离、曼哈顿距离、dot内积等 主流的近邻算法都支持上述不同的距离度量。其中n维特征空间的a、b向量的 欧式距离 体现数值上的绝对差异,而余弦距离基于余弦相似度(两个向量间夹角的余弦值),体现方向上的相对差异。 如果对向量做归一化处理,二者的结果基本是等价的。 实际应用中,需要根据业务目标来选择合适的度量方法。 3、K近邻算法的实现方法 K近邻的实现方式多达数十种,笔者从中挑选了几种常用、经典的方法作为分析案例。 首先最直观的想法(暴力法),是线性扫描法。将待预测样本和候选样本逐一比对,最终挑选出距离最接近的k个样本即可,时间复杂度O(n)。对于样本数量较少的情况,这种方法简单稳定,已经能有不错的效果。但是数据规模较大时

HDU 6656 Kejin Player (期望DP 逆元)

别说谁变了你拦得住时间么 提交于 2020-04-30 04:20:56
2019 杭电多校 7 1011 题目链接: HDU 6656 比赛链接: 2019 Multi-University Training Contest 7 Problem Description Cuber QQ always envies those Kejin players, who pay a lot of RMB to get a higher level in the game. So he worked so hard that you are now the game designer of this game. He decided to annoy these Kejin players a little bit, and give them the lesson that RMB does not always work. This game follows a traditional Kejin rule of "when you are level i, you have to pay $a_i$ RMB to get to level $i+1$". Cuber QQ now changed it a little bit: "when you are level $i$, you pay $a_i$ RMB, are you get to level

error: command 'gcc' failed with exit status 1 fatal error: 'vector' file not found

杀马特。学长 韩版系。学妹 提交于 2020-01-05 09:39:41
问题 I ran pip install annoy and got the following error: Collecting annoy Using cached https://files.pythonhosted.org/packages/b5/28/f8ce7400344090bb5cfa1c9fae3fdb03b9438db082d458686442633d82a3/annoy-1.15.0.tar.gz Building wheels for collected packages: annoy Running setup.py bdist_wheel for annoy ... error Complete output from command /anaconda3/bin/python -u -c "import setuptools, tokenize;__file__='/private/var/folders/yp/4w8nvxls4y99r68kpxzzwdl00000gn/T/pip-build-h3hirwtn/annoy/setup.py';f

error: command 'gcc' failed with exit status 1 fatal error: 'vector' file not found

こ雲淡風輕ζ 提交于 2020-01-05 09:37:07
问题 I ran pip install annoy and got the following error: Collecting annoy Using cached https://files.pythonhosted.org/packages/b5/28/f8ce7400344090bb5cfa1c9fae3fdb03b9438db082d458686442633d82a3/annoy-1.15.0.tar.gz Building wheels for collected packages: annoy Running setup.py bdist_wheel for annoy ... error Complete output from command /anaconda3/bin/python -u -c "import setuptools, tokenize;__file__='/private/var/folders/yp/4w8nvxls4y99r68kpxzzwdl00000gn/T/pip-build-h3hirwtn/annoy/setup.py';f

求近似最近邻的库 Annoy

我与影子孤独终老i 提交于 2019-12-04 05:00:00
Annoy 是 Spotify 开源的高维空间求近似最近邻的库,在 Spotify 使用它进行音乐推荐。最邻近搜索(Nearest Neighbor Search, NNS)又称为“最近点搜索”(Closest point search),是一个在尺度空间中寻找最近点的优化问题。 Annoy 能够使用静态文件作为索引,意味着可以跨进程共享索引。它还创建了大量的基于只读文件的数据结构,这些数据结构被嵌入内存中,以便许多进程可以共享相同的数据。Annoy 的另一个好处是它试图最小化内存占用,因此索引非常小。 特性: 欧几里德距离, 曼哈顿距离, 余弦距离, 汉明距离或 点(内)积距离 余弦距离等价于归一化向量的欧氏距离=sqrt(2-2*cos(u,v) 如果你的维度不多(比如<100),效果会更好,即使达到 1000 个维度,它也表现得非常出色 内存使用量小 允许你在多个进程之间共享内存 索引创建与查找是分开的(特别是在创建树后,就无法添加更多项目) 原生 Python 支持 在磁盘上生成索引,以便为不适合内存的大型数据集建立索引 来源: https://www.cnblogs.com/fewfwf/p/11832542.html

快速计算距离Annoy算法原理及Python使用

匿名 (未验证) 提交于 2019-12-02 22:51:30
快速计算距离Annoy算法 基本原理 高维稀疏数据 进行快速相似查找,可以采用 learning to hash 参考:Minhashing & LSH & Simhash 技术汇总 ,但 高维稠密数据 查找则采用 annoy 如何从海量文本中快速查找出相似的Top N 文本 Annoy(Approximate Nearest Neighbors Oh Yeah)快速算法,在实际应用中发现无论计算速度和准确性都非常不错。 原始2D数据分布图: 1. 建立索引过程 Annoy的目标是建立一个数据结构,使得查询一个点的最近邻点的时间复杂度是次线性。Annoy 通过建立一个二叉树来使得每个点查找时间复杂度是O(log n)。 看下面这个图,**随机选择两个点,以这两个节点为初始中心节点,执行聚类数为2的kmeans过程,最终产生收敛后两个聚类中心点。**这两个聚类中心点之间连一条线段(灰色短线),建立一条垂直于这条灰线,并且通过灰线中心点的线(黑色粗线)。这条黑色粗线把数据空间分成两部分。在多维空间的话,这条黑色粗线可以看成等距垂直超平面。 在划分的子空间内进行不停的递归迭代继续划分,知道每个子空间最多只剩下K个数据节点。 通过多次递归迭代划分的话,最终原始数据会形成类似下面这样一个二叉树结构。二叉树底层是叶子节点记录原始数据节点,其他中间节点记录的是分割超平面的信息