- lsh学习链接:
LSH(Locality Sensitive Hashing)原理与实现
对高维数据查询最近邻,推荐使用p-stable LSH;
minLSH是针对文档查询最近邻得方法; - python学习与使用:
python入门之类 - 常用函数:
random.gauss(mu, sigma):均值为mu且标准偏差为sigma的高斯分布
random.uniform(x, y):将随机生成下一个实数,它在 [x, y] 范围内。
numpy.inner():返回一维数组的向量内积。对于更高的维度,它返回最后一个轴上的和的乘积。
字典(Dictionary) update() :函数把字典dict2的键/值对更新到dict里。 - lsh参数计算学习链接:
参考论文:2004 Locality-sensitive hashing using stable distributions
E2LSH的原理与实现
LSH在欧式空间的应用(1)–碰撞概率分析
LSH在欧式空间的应用(2)–工作原理
LSH在欧式空间的应用(3)–参数选择
以上三个链接是用R语言举例;
正态分布就是高斯分布; - knn搜索
在使用lsh做近似近邻搜索后,得到近邻索引,通过近邻索引对近邻数据做k近邻检索,得到精确的k个最近邻。
python做 knn可以调用库函数实现:
from sklearn.neighbors import NearestNeighbors
# 函数功能:对数据集x的前1000个数据做10近邻搜索;
# 搜索范围:数据集x内全体数据;
def knn_search(X):
# 查询点y:x内前一千个数;
Y = X[0:1000]
# 查询范围:x内全体数据;查询11近邻;
nbs = NearestNeighbors(n_neighbors=11, algorithm='ball_tree').fit(X)
# distances:最近邻距离;indices:最近邻索引号;
distances, indices = nbs.kneighbors(Y)
# knn近邻搜索范围包含自己,返回结果去除自己(即去除查询结果第一列),得到查询点的十近邻;
return indices[:, 1:]
综上,完成lsh对数据集k近邻查询;
查询结果(对数据集做两遍查询,一次e2lsh,一次knn,对比查询结果):