快速近似近邻搜索框架。

Near的Python项目详细描述


#nearpy

nearpy是一个python框架,用于使用不同的局部敏感哈希方法在高维向量空间中进行快速(近似)近邻搜索。

它允许实验和评估新方法,但也可以生产。它带有一个redis存储适配器。

要安装,只需执行*pip install nearpy*。它还将安装scipy、numpy和redis包。

d是索引的。对于每个应该被索引("存储")的向量,都会生成一个散列,
这是一个字符串值。这个散列用作存储向量的bucket的bucket key
。bucket在大多数情况下只是向量的列表,这是这些应用程序中使用的术语。

因此,这种机制的"秘密"是使用所谓的对位置敏感的散列lsh。
这些散列考虑了空间性,因此它们倾向于为闭合向量生成相同的散列值(桶键)。这使得在给定查询向量的情况下,获得接近
向量的速度变得非常快。因为这是一种非常粗糙的方法,所以称为近似近邻搜索,因为您可能无法得到真正的近邻。在许多应用程序中,这很好,因为您只想得到20个"足够相等"的向量。

引擎可配置
用于近似近邻搜索(anns)的管道,使用对位置敏感的散列(lsh)。

![alt text](http://nerpy.io/images/pipeline.png"管道图")


引擎使用接受管道沿线不同组件的构造函数进行配置:

``python
def\uu init(self,dim,lshashes=[randombinaryprojections('default',10]),
distance=cosinedistance(),
向量过滤器=[nearestfilter(10)],
存储=memoryStorage()):
````

anns管道配置为使用构造函数的dim参数设置的特征空间的固定维度。这必须是正整数值。

这仅在使用需要距离的过滤器(如NearestFilter或DistanceThresholdFilter)时才需要。


现有的实现有nearestfilter、distancethresholdfilter和uniquefilter。

是引擎的另一个参数,称为fetch_vector_filters,它在从存储桶中提取候选向量之后,在使用distance
或vector filter之前执行。默认情况下,这是一个uniquefilter,它应该始终是。如果人们需要玩弄这个,我会把它作为一个参数。

引擎支持不同的方式存储索引向量(和存储桶)。当前的存储实现是内存存储和再存储。

存储中的g个桶。
可选数据参数必须是json可序列化的。它与矢量一起存储,并将在搜索结果中返回。
最好只使用数据库ID作为附加的"数据",并将实际数据存储在数据库中。

neighbors()h将向量v与所有配置的lsh进行灰化,从存储中的匹配
存储桶中收集所有候选向量,应用(可选)距离函数,最后应用(可选)过滤函数
,以构造(向量、数据、距离)元组或(向量、数据)元组的返回列表。

a从引擎中可以使用这两个方法:

`` python
`清除所有的存储桶(self)
清除存储桶(self,hash\u name)
````
`散列

所有lsh实现都在nearpy do子类nearpy.hash中,除了
构造函数和重置方法之外,它还有一个主要方法。

`` python
`散列向量(self,v)
```

hash_vector()对指定向量进行哈希运算,并返回包含一个或多个项的存储桶键列表。

lsh randombinaryprojections将指定向量投影到特征空间中的n个random规范化向量上,并返回由零和一组成的字符串。如果v位于第n个法向量的正边,则字符串中的第n个字符为"1";如果v位于第n个法向量的负边,则字符串中的第n个字符为"0"。这样,lsh将特征空间("输入空间")的每个可能向量投影到许多可能的存储桶中。


lsh随机离散投影几乎与随机二进制投影相同。唯一的区别是,
将投影值除以一个bin宽度,并将每个随机投影中的bin索引
用作bucket键的一部分。如果随机投影向量的计数与随机二进制投影相同,则在给定相同向量集的情况下,这将导致更多的桶。投影上的桶密度可以通过作为构造函数一部分的桶宽度来控制。


lsh pcabinaryprojections使用构造函数指定的一组训练向量进行训练。它执行pca(主成分分析)以找出训练集中方差最大的方向,然后使用前n个主成分作为投影向量(或投影到的子空间的维数)。其想法是这样可以更安全地在
桶之间获得向量的良好分布。我对此没有任何测试,也不知道这是否有意义。


例如,在redis中,在索引过程完成后重新使用它,您应该保留您的散列配置,以便以后可以重新创建相同的引擎,以便进行更多索引或查询。


这样做:

``` python
``创建redis存储适配器
redis object=redis(host=localhost,port=6379,db=0)
redis_u storage=redisstorage(redis_object)

e没有参数的散列
lshash=randombinaryprojections(none,none)
应用从redis加载的配置
lshash.apply謺config(config)

謺为100个维度的功能空间创建引擎并使用我们的散列。
謺这将只在第一次设置lshash的维度,而不是在使用configurati时从redis加载时。使用redis存储来存储
存储桶。
引擎=引擎(100,lshashes=[lshash],存储=redis存储)

```
==


示例用法:

`` python
来自nearpy导入引擎
来自nearpy.hash导入randombinaryprojections

10)

dex)创建随机查询向量

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用jsonb库从Postgres读取jsonb   java如何在SeleniumWebDriver中选择下拉选项?   java如何获取需要在tessbase中使用的目录。init(“目录”,“eng”)?   java计算二进制字的奇偶校验   java如何使用jBCrypt进行密码哈希比较?   eclipse的java分析器插件   在java中调用C函数   java在嵌入式Apache Tomcat 9中以编程方式启用SSL并添加证书   java在中遇到问题。nextDouble()   java如何为JScrollPane的视口绘制引导标记   swing Java组件在启动时不显示   有没有类似java的C语言。util。属性类