我想使用mlpack中的NeighborSearch类对一些表示文档的向量执行KNN分类。
我想使用余弦距离,但我遇到了麻烦。我认为这样做的方法是使用内积度量"IPMetric“并指定CosineDistance内核……这就是我所拥有的:
NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>> nn(X_train);但是我得到了以下编译错误:
/usr/include/mlpack/core/tree/hrectbound_impl.hpp:211:15: error: ‘Power’ is not a member of ‘mlpack::metric::IPMetric<mlpack::kernel::CosineDistance>’
sum += pow((lower + fabs(lower)) + (higher + fabs(higher)),
^
/usr/include/mlpack/core/tree/hrectbound_impl.hpp:220:3: error: ‘TakeRoot’ is not a member of ‘mlpack::metric::IPMetric<mlpack::kernel::CosineDistance>’
if (MetricType::TakeRoot)
^我怀疑问题可能是缺省树类型KDTree不支持此距离度量?如果这就是问题所在,有没有适用于CosineDistance的树类型?
最后,是否可以使用暴力搜索?我似乎找不到一种方法来使用没有树...
谢谢!
发布于 2017-02-08 06:01:01
不幸的是,正如您所怀疑的那样,任意度量类型不适用于KDTree-这是因为kd-tree需要一个可以分解为不同维度的距离。但对于IPMetric来说,这是不可能的。相反,为什么不尝试使用封面树呢?树的构建时间可能会稍长一些,但它应该提供类似的性能:
NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>, arma::mat,
tree::StandardCoverTree> nn(X_train);如果要执行暴力搜索,请在构造函数中指定搜索模式:
NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>, arma::mat,
tree::StandardCoverTree> nn(X_train, NAIVE_MODE);我希望这是有帮助的;如果我能澄清什么,请告诉我。
https://stackoverflow.com/questions/42097957
复制相似问题