2023-05-26
所做工作及结果
将半径改为自适应计算,每个子空间的半径通过子空间的密度和knn来确定,结果如下
【limit=1000, r=10】
recall@100 = 0.34426
R@1 = 0.52160
R@10 = 0.53650
R@100 = 0.53650
构建时间:3763.296234 ms
搜索时间:68142.903484 ms
合并时间:8188.190704 ms
【limit=1000, r=自适应】
计算出来的r都在9~13之间
recall = 0.35164
R@1 = 0.52860
R@10 = 0.54410
R@100 = 0.54410
构建时间:4026.350929 ms
搜索时间:70175.884969 ms
合并时间:8172.631783 ms
自适应半径的计算结果和时间与r=10的计算结果和运行时间差不多,但是因为可以自适应半径,所以最终结果相对比较优,r=10也是通过多次尝试得到的相对较优的一个参数。
之所以recall增加并不明显,我觉得可能因为不同的子空间并不是均匀分布,那么计算出来的密度参考价值就比较低。将r改为自适应结果+1,即在根据密度计算出来的半径上稍微增加一点半径,可以得到以下结果:
【limit=1000, r=自适应+1】
recall@100 = 0.35860
R@1 = 0.53690
R@10 = 0.55290
R@100 = 0.55290
构建时间:4113.738097 ms
搜索时间:75362.564368 ms
合并时间:8232.312792 ms
【limit=1000, r=自适应-1】
recall@100 = 0.34316
R@1 = 0.51930
R@10 = 0.53400
R@100 = 0.53400
构建时间:3636.434508 ms
搜索时间:66166.673366 ms
合并时间:8139.967997 ms
半径加一减一,recall变化不大,但是搜索时间差4~5秒
结论,由于数据分布不均匀等原因,自适应半径r与固定r=10结果差不多,并没有取得很好的效果。
第二个问题,需要看一下为什么搜索时间会那么久,应该是与半径r的关系最大,是不是因为半径增加之后,添加到优先队列中的节点太多?
我检查了rnn的运行时间,发现在相同的limit和r下,rnn的搜索时间要快很多
【limit=1000, r=10, search mode = rnn】
recall@100 = 0.28344
R@1 = 0.44570
R@10 = 0.45460
R@100 = 0.45460
构建时间:3735.390424 ms
搜索时间:19278.503358 ms
合并时间:8033.415259 ms
-------------------------------------------------------------------------------------