Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有余弦距离的mlpack最近邻?_C++_Metrics_Knn_Mlpack - Fatal编程技术网

C++ 具有余弦距离的mlpack最近邻?

C++ 具有余弦距离的mlpack最近邻?,c++,metrics,knn,mlpack,C++,Metrics,Knn,Mlpack,我想使用mlpack中的NeighborSearch类对一些表示文档的向量执行KNN分类 我想用余弦距离,但我有困难。我认为这样做的方法是使用内积度量“IPMetric”并指定余弦距离核。。。这就是我所拥有的: NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>> nn(X_train); 邻域搜索nn(X_列车); 但我得到以下编译错误: /usr/include/mlpack/core/tree

我想使用mlpack中的NeighborSearch类对一些表示文档的向量执行KNN分类

我想用余弦距离,但我有困难。我认为这样做的方法是使用内积度量“IPMetric”并指定余弦距离核。。。这就是我所拥有的:

NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>> nn(X_train);
邻域搜索nn(X_列车);
但我得到以下编译错误:

/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)
^
/usr/include/mlpack/core/tree/hrectbound\u impl.hpp:211:15:错误:“电源”不是“mlpack::metric::IPMetric”的成员
总和+=pow((较低+fabs(较低))+(较高+fabs(较高)),
^
/usr/include/mlpack/core/tree/hrectbund_impl.hpp:220:3:错误:“TakeRoot”不是“mlpack::metric::IPMetric”的成员
if(MetricType::TakeRoot)
^
我怀疑问题可能是默认的树类型KDTree不支持这个距离度量?如果这是问题所在,是否有一个树类型适用于余弦距离

最后,有可能使用暴力搜索吗?我似乎找不到一种完全不用树的方法


谢谢!

不幸的是,正如您所怀疑的,任意度量类型不适用于KDTree——这是因为kd树需要一个可以分解为不同维度的距离。但这在
IPMetric
中是不可能的。相反,为什么不尝试使用覆盖树呢?树的构建时间可能有点长r但应提供可比性能:

NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>, arma::mat,
    tree::StandardCoverTree> nn(X_train);
邻域搜索nn(X_列车);
如果要执行暴力搜索,请在构造函数中指定搜索模式:

NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>, arma::mat,
    tree::StandardCoverTree> nn(X_train, NAIVE_MODE);
邻域搜索nn(X_序列,朴素模式);

我希望这是有帮助的;如果我能澄清什么,请告诉我。

不幸的是,正如您所怀疑的,任意度量类型不适用于KDTree——这是因为KDTree需要一个可以分解为不同维度的距离。但这在
IPMetric
中是不可能的。相反,为什么不尝试使用封面呢树?树的构建时间可能稍长,但应提供可比性能:

NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>, arma::mat,
    tree::StandardCoverTree> nn(X_train);
邻域搜索nn(X_列车);
如果要执行暴力搜索,请在构造函数中指定搜索模式:

NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>, arma::mat,
    tree::StandardCoverTree> nn(X_train, NAIVE_MODE);
邻域搜索nn(X_序列,朴素模式);

我希望这会有帮助;如果我能澄清什么,请告诉我。

Ack,我应该补充两件事:我认为
tree::BallTree
在这里也适用于您,而且,您的任务是查找具有最大余弦相似性的点吗?您使用的设置将查找具有最小余弦相似性的点。谢谢!!我尝试使用BallTree bu我仍然收到编译错误…它说邻居搜索需要二元空间树,它使用hrectbound,它需要LMetric。我已经共享了我的代码和编译器输出,如果这有帮助的话。可能是我在用#includes做傻事吗?我看到你在使用mlpack 2.0.2,所以使用
true
作为第二个参数使用构造函数而不是
NAIVE_MODE
。您提供的代码和编译器输出中没有任何内容;如果使用BallTree,它根本不应该实例化HRectBound类。您确定这是一个干净的构建吗?我想我可能已经弄明白了——NeighborSearch还将“TraversalType”作为模板参数,默认值是mlpack::tree::BinarySpaceTree,它正在生成这些编译错误。我应该将TraversalType设置为什么?这很奇怪,TraversalType应该默认为给定的树型,而不是BinarySpaceTree。您可能可以将其设置为
BallTree,arma::mat>::DualTreeTraverser
,我认为我工作。你想在mlpack github上打开一个bug吗?我想你已经发现了一个问题。确认,我应该添加两件事:我认为
tree::BallTree
在这里也适用于你,而且,你的任务是找到具有最大余弦相似性的点吗?你正在使用的设置将找到具有最小余弦相似性的点拉里蒂。谢谢!!我试过使用BallTree,但仍然有编译错误…这是说邻居搜索需要使用二进制空间树,它使用hrectbound,它需要LMetric。如果有帮助的话,我已经分享了我的代码和编译器输出。可能是我在用#包含做一些愚蠢的事情吗?我看到你在使用mlpack 2.0.2,所以使用
true
作为构造函数的第二个参数,而不是
NAIVE_MODE
。您提供的代码和编译器输出中没有任何内容;如果使用BallTree,它不应该实例化HRectBound类。您确定这是一个干净的构建吗?我想我可能已经找到了它——NeightorSearch also将“TraversalType”作为模板参数,默认值是mlpack::tree::BinarySpaceTree,它正在生成这些编译错误。我应该将TraversalType设置为什么?奇怪的是,TraversalType应该默认为给定的树类型,而不是BinarySpaceTree。您可能可以将其设置为
BallTree,arma::mat>::DualTreeTraverser
我认为这会起作用。不过,您是否想在mlpack github上打开一个bug?我认为您发现了一个问题。