2017-02-07 16 views
1

私は、mlpackのNeighborSearchクラスを使用して、ドキュメントを表すいくつかのベクトルでKNN分類を実行したいと考えています。コサイン距離のmlpack最近隣?

私はCosine Distanceを使いたいですが、問題があります。

NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>> nn(X_train); 

しかし、私は、次のコンパイルエラーを取得::私はこれを行う方法は、メトリック内積「IPMetric」を使用してCosineDistanceカーネルを指定することだと思う...これは私が持っているものである

/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で動作するツリータイプはありますか?

最後に、ブルートフォース検索を使用できますか?私は木を一切使わない方法を見つけることができないようです...

ありがとう!

答えて

0

残念ながら、疑わしいように、任意のメトリックタイプはKDTreeでは機能しません。これは、kdツリーに異なる次元に分解できる距離が必要なためです。しかし、それは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); 

Iこれが助けになることを望みます。私が何かを明確にすることができるかどうか私に知らせてください。

+0

Ack、私は2つのことを追加する必要があります:私は 'tree :: BallTree'もここではうまくいくと思っていますし、コサインの類似性が最大のポイントを見つける作業もありますか?使用しているセットアップでは、コサインの類似度が最小の点が見つかります。 – ryan

+0

ありがとう!!私はBallTreeを使ってみましたが、まだコンパイルエラーです...隣人検索には、LMetricが必要なhrectboundを使用するbinary_space_treeが必要です。私は自分のコード[ここ](https://github.com/chrisjmccormick/mlpack-examples/blob/master/reuters_example_cosine.cpp#L52)とコンパイラの出力[ここ](https://github.com/)を共有しました。 chrisjmccormick/mlpack-examples/blob/master/error_output.txt)が役立ちます。私は#includesで何か愚かなことをすることができますか? – chrismcc

+0

私はあなたがmlpack 2.0.2を使っているのを見ていますので、 'NAIVE_MODE'の代わりに' true'をコンストラクタの2番目のパラメータとして使います。何かあなたが与えたコードとコンパイラ出力を追加していません。 BallTreeが使用されている場合、HRectBoundクラスをインスタンス化してはなりません。これはきれいなビルドだと確信していますか? – ryan