私は約200k個のオブジェクトからなるデータセットを扱います。すべてのオブジェクトには4つの機能があります。ユークリッド距離でK最近隣(KNN)でそれらを分類します。プロセスは約20秒で終了します。KNNがカスタムメトリックで遅いのはなぜですか?
最近、カスタムメトリックを使用する理由があります。おそらくそれはより良い結果を生むでしょう。私はカスタムメトリックを実装し、KNNは1時間以上働くようになっています。私はそれを終えるのを待たなかった。
私はこの問題の理由が私の基準であると考えました。私はコードをreturn 1
で置き換えます。 KNNはまだ1時間以上働いていました。私は理由がアルゴリズムボールツリーだと仮定しましたが、KNNとそれとユークリッドメトリックは約20秒で動作します。
今私は何が間違っているのか分かりません。私はPython 3とSklearn 0.17.1を使用します。 Hereプロセスをカスタムメトリックで終了することはできません。私もアルゴリズムbrute
を試しましたが、同じ効果があります。 scikit-learnのアップグレードとダウングレードは効果がありません。 Python 2でカスタムメトリックによる分類を実装しても効果はありません。私はこのメトリック(ちょうど1を返す)をCythonで実装しましたが、同じ効果があります。
def custom_metric(x: np.ndarray, y: np.ndarray) -> float:
return 1
clf = KNeighborsClassifier(n_jobs=1, metric=custom_metric)
clf.fit(X, Y)
カスタムメトリックでKNNによる分類プロセスを向上させることはできますか?
私の英語が不明な場合は、
ユーザ定義関数はPythonでは特に高速ではありません。それらを呼び出す際にオーバーヘッドが多くあります。あなたのカスタムメトリックは、Cで実装されているものを置き換えている可能性があります。 – chepner
KNNのユークリッドメトリックを持つ距離行列は、行列の加算と乗算の観点から実装できます(|| ab ||^2 = || a || (OpenBLAS、ATLAS、MKL) – damienfrancois
@chepner関数は 'return 1'でもオーバーヘッドが存在するのでしょうか?また、私が上で指摘したように、私はCythonでメトリックを実装し、実行時間も大きかった。 @damienfrancoisユークリッドメトリックでは問題ありません。それはsklearnの標準メトリックです。カスタムメトリックを使用しようとすると、パフォーマンスに問題があります。 C/C++ライブラリを見て、C/C++でプログラムを再実装する必要がありますか? – ANtlord