海量高维向量中如何找出相似的topN

问题: 海量高维向量中如何找出相似的topN

原理:

假设如果两个点无限近的话,任何平面都无法切分他们,所以可对这些点在空间中用超平面进行切分,如果这些点紧挨着的,会被切分到同一边

annoy算法详细解释:https://www.cnblogs.com/futurehau/p/6524396.html

github项目地址: https://github.com/spotify/annoy

python演示代码:

#coding=utf-8
from annoy import AnnoyIndex
import random



f = 2 #维度
t = AnnoyIndex(f)  # Length of item vector that will be indexed

tmp=[];
x=[];
y=[];
for i in xrange(500):
    v = [random.gauss(0, 1) for z in xrange(f)]
    tmp.append(v)
    x.append(v[0])
    y.append(v[1])
    t.add_item(i, v) #添加向量

t.build(100) # 10 trees
t.save('test.ann')

# ...

u = AnnoyIndex(f)
u.load('test.ann') # super fast, will just mmap the file
nearest= u.get_nns_by_item(1, 40) # will find the 1000 nearest         neighbors of the first(0) vec

target = tmp.__getitem__(1)

nearx=[];
neary=[];
nearest.pop(0)
for i in nearest:
   near= tmp.__getitem__(i)
   #print u.get_distance(1,i)
   print u.get_item_vector(i)
   nearx.append(near[0])
   neary.append(near[1])

import matplotlib.pyplot as plt

p1 = plt.scatter(x, y, marker='x', color='g', label='1', s=30)

p1 = plt.scatter(target[0], target[1], marker='*', color='r', label='1', s=30)

plt.scatter(nearx, neary, marker='+', color='b', label='1', s=30)


plt.title('Scatter')
plt.legend(loc='upper right')
plt.xticks(x)
plt.show()

结果:

在这里插入图片描述

图中红色点为目标点,蓝色为跟这个目标点相似的,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值