C++ KNN搜索,增长集,任意范数
假设E3中的以下问题具有任意范数。例如,使用L1范数(汉明、卡尔斯鲁厄、测地线等也适用) 随后,对于i=1:n,我们重复以下步骤:C++ KNN搜索,增长集,任意范数,c++,algorithm,search,metrics,knn,C++,Algorithm,Search,Metrics,Knn,假设E3中的以下问题具有任意范数。例如,使用L1范数(汉明、卡尔斯鲁厄、测地线等也适用) 随后,对于i=1:n,我们重复以下步骤: 根据给定的范数,在B中找到距离A[i]最近的点 B * = argmin(|A[i]-B|) 如果B*-A[i]
- 根据给定的范数,在B中找到距离A[i]最近的点
B * = argmin(|A[i]-B|)
- 如果B*-A[i]
const int k = 1;
for (int i = 1; i < A.size(); i++) {
partial_sort(B.begin(), B.begin() + k, B.end(), bind(less<double>(), bind(nL1, _1, A[i]), bind(nL1, _2, A[i])));
if (nL1(*B.begin(), A[i]) < 1e4) B.push_back(A[i]); //Some threshold, eps=1.0*10^4
}
}
const int k=1;
对于(int i=1;i
B在不断增长,搜索成本也越来越高。。。在循环中重复,速度太慢,即使对于小集合(n=1*10^6)。。。在这里,部分排序效率很低
- 速度是否有显著的改善?当然,也可以使用幼稚的方法(但不是更快)
- 如何加速nn搜索
由于存在任意范数,因此无法使用当前的k-nn搜索库(该问题可以在球体上解决)。我尝试使用nano-flann,但它不支持某些特定规范…卡尔斯鲁厄规范是什么?对于测地线,你是说E3中的一些曲面吗?无论如何,你应该仍然能够使用kd树,你只需要能够回答某些问题,比如:这个球(你的标准)包括在这个盒子里吗?卡尔斯鲁厄标准是什么?对于测地线,你是说E3中的一些曲面吗?无论如何,你应该仍然能够使用kd树,你只需要能够回答某些问题,比如:这个球(你的标准)包括在这个盒子里吗?
B.push_back(A[0]);
B * = argmin(|A[i]-B|)
const int k = 1;
for (int i = 1; i < A.size(); i++) {
partial_sort(B.begin(), B.begin() + k, B.end(), bind(less<double>(), bind(nL1, _1, A[i]), bind(nL1, _2, A[i])));
if (nL1(*B.begin(), A[i]) < 1e4) B.push_back(A[i]); //Some threshold, eps=1.0*10^4
}
}