快速近似近邻搜索框架。
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)创建随机查询向量
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)创建随机查询向量