Open qxzhou1010 opened 4 years ago
https://github.com/matteodellamico/flexible-clustering 可参考这个仓库的python版本hnsw代码
https://github.com/nmslib/hnswlib 这个官方hnsw仓库里有各个语言版本的hnsw代码链接
非常感谢,我用了https://github.com/matteodellamico/flexible-clustering这里面的hnsw来做同样的事情,我随机生成了一个大小为(nums,dims)的数据,然后先添加,然后再利用同样的数据集来做查找,得到的结果效果依然很差,我不知道是我代码使用的问题,还是hnsw本身实现的问题,想跟你进一步交流一下。
` num = 100 dim = 1024 train = np.random.random((num, dim)) test = train test_num = num
hnsw = HNSW('cosine', m=16, ef=200)
for i in range(num):
hnsw.add(train[i])
acc = 0
t1 = time.time()
for i in range(test_num):
res = hnsw.search(test[i], k=1)
idx = res[0][0]
dis = res[0][1]
print("当前查询样本:", i, "查询结果:", idx, "距离:", dis)
print("当前查询样本与自己的距离:", 1 - (np.dot(test[i], train[i]) / (np.linalg.norm(test[i]) * np.linalg.norm(train[i]))))
if idx == i:
acc += 1
t2 = time.time()
print("特征维度:", dim, "查询特征数量:", test_num, "耗时:", t2 - t1, "召回率:", acc / test_num)`
麻烦你看看我的代码会有问题吗
你好,还想请问一下,你代码中的hnsw_original和https://github.com/matteodellamico/flexible-clustering中的hnsw是完全一样的吗?
我还观察到一个问题是,准确率和使用的距离度量有关系,当使用l2距离的时候,测试效果非常好,可以达到官方库的效果。但是用consine距离的时候,效果就非常的差。但是直观上不应该差距这么大,我在官方库也测试过,用不同的距离,几乎是没有任何差距的。
我想我已经解决这个问题了,我看了您的源码中hnsw_original计算cosine距离的时候,代码是(np.dot(a, b)/(np.linalg.norm(a)*(np.linalg.norm(b))))
,我把它改成了1 - (np.dot(a, b)/(np.linalg.norm(a)*(np.linalg.norm(b))))
后,再次测试,准确率就上来了。
多有打扰,非常感谢!
您好!我想和您交流一下,我也是最近有个作业需要hnsw代码,如果您看到了可以马上回复我或者Email:hyuxin021@gmail.com吗?非常非常感谢!!
你好,我用自己的数据跑了一下你的代码,目前测出来的召回率比较低,想跟你请教一下这个问题,是由于我使用的问题还是?我是这样做的,先有一个训练数据集和一个测试数据集,二者的lable就是index,是一一对应的,比如train[i] 和 test[i] 就是同一个label的不同数据,然后先用tarin来建立索引(add),建立好了后,用test[i]去做query,返回topk个结果,结果返回是[j ,distance],然后就比较j 和 i是否相等,如果相等则acc+1,最后acc/test_num。但这样测出来的准确率很低,同样的思路我用https://github.com/nmslib/hnswlib这个库测过,准确率是可以很高的。我急需一份hnsw的python实现代码,然后拿过来进行一些改进,所以想跟您交流一下