1

我想使用 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 的树类型?

最后,是否可以使用蛮力搜索?我似乎根本找不到不使用树的方法...

谢谢!

4

1 回答 1

0

不幸的是,正如您所怀疑的那样,任意度量类型不适用于 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);

我希望这是有帮助的; 让我知道我是否可以澄清任何事情。

于 2017-02-07T22:01:00.850 回答