假设我们有具有正实分量并使用 Jaccard 距离为每个点找到我想知道,是否有可能在不计算所有成对距离的情况下获得精确的解决方案(找到所有
使用 Jaccard 距离查找正实值向量的最近邻
计算科学
计算几何
最近邻
2021-12-23 00:26:26
2个回答
C++ 库 mlpack ( http://www.mlpack.org ) 目前包含少数树类型的实现;最令人感兴趣的可能是覆盖树(参见“最近邻居的覆盖树”,Beygelzimer、Kakade 和 Langford,ICML 2006)。覆盖树将适用于满足三角不等式的任何度量。这不适用于树、八叉树(和变体)或 M 树。
因为 Jaccard 距离确实满足三角不等式,所以您可以轻松编写一个带有 Evaluate() 函数的 JaccardDistance 类,用于计算两点之间的 Jaccard 距离。然后,您可以使用 Jaccard 距离在这些点上构建覆盖树,并轻松运行精确的个最近邻。
请参阅本教程:http ://www.mlpack.org/doxygen.php?doc=nstutorial.html
那么,给定一些 JaccardDistance 类,您可以编写看起来有点像这样的代码......
using namespace mlpack::neighbor;
using namespace mlpack::tree;
extern arma::mat dataset; // The dataset containing the points.
extern size_t k; // The number of neighbors being searched for.
NeighborSearch<NearestNeighborSort, JaccardDistance, CoverTree<JaccardDistance> > ns(dataset);
arma::Col<size_t> neighbors; // Will store the neighbors of each point.
arma::mat distances; // Will store the distances to those neighbors.
ns.Search(k, neighbors, distances);
我没有测试过那个或任何东西;那只是一个草图。但这应该足以让您开始使用 Jaccard 距离进行最近邻搜索的快速算法。
也可以调整 mlpack -tree 实现以使用 Jaccard 距离,但这不会那么简单,这就是为什么为了简单起见我推荐覆盖树的原因。