私はサポートベクターマシンモデルを訓練しなければならず、プリセットのもの(RBF、Poly、eccなど)の代わりにカスタムカーネルマトリックスを使用したいと思います。 opencvのマシンラーニングライブラリでどうすればできますか?opencvでカスタムSVMカーネルマトリックスを構築
ありがとうございました!
私はサポートベクターマシンモデルを訓練しなければならず、プリセットのもの(RBF、Poly、eccなど)の代わりにカスタムカーネルマトリックスを使用したいと思います。 opencvのマシンラーニングライブラリでどうすればできますか?opencvでカスタムSVMカーネルマトリックスを構築
ありがとうございました!
AFAICTでは、SVC用のカスタムカーネルはOpenCVで直接サポートされていません。 OpenCVがこれに使用する基礎となるライブラリであるLIBSVMのように見えますが、カスタムカーネルを定義するのに特に簡単な手段はありません。したがって、LIBSVMを使用するラッパーの多くはこれを提供しません。いくつかあると思われます(例: Python用のscikit:SVMlightのようにまったく別のライブラリを見ることもできます:SVMlightカスタムカーネルを直接サポートします。またthis SO questionを見てください。その答えには、SVMライブラリのいくつかと、簡単なレビューが含まれています。
OpenCVにとどまる魅力的な理由がある場合は、カーネルタイプCvSVM::LINEAR
を使用してSVMをトレーニングする前にカスタムカーネルをデータに適用することができます。私は、この方向性が実りあるかどうかについて少し不明なので、SVMの経験が豊富な人がチャイムでチャットしたりコメントしたりできることを願っています。 がの場合は、 "linear"をカーネルとして選択して "precomputed kernel"を使用することができます。次に進める方法についてはthis answerをご覧ください。
また、LIBSVMを含めてOpenCVを使用せずに直接呼び出すことも考えられます。
Q:私は自分のカーネルを使いたいです。を参照してください。どんな例ですか? svm.cppには、カーネルの評価のための2つのサブルーチン、k_function()とkernel_function()があります。どちらを修正する必要がありますか?
例は、LIBSVMツールの「LIBSVM for string data」です。
2つの機能を持つ理由は次のとおりです。 RBFカーネルexp(-g | xi-xj |^2)に対して、まずxi-xjを計算し、次にノルム2乗を計算すると、3n回の演算が行われます。 exp(-xi |^2 - 2dot(xi、xj)+ | xj |^2))を考察し、最初にすべての| xi |^2を計算することにより、操作数は2nに減少する。これはトレーニングのためのものです。予測のためにはこれを行うことはできませんので、その3n演算を使用する通常のサブルーチンが必要です。あなた自身のカーネルを持つ最も簡単な方法は、カーネルを置き換えることによって、これらの2つのサブルーチンに同じコードを入れることです。
最後のオプションは痛みのように聞こえますが、私はscikitまたはSVMlightをお勧めしたいと思います。あなたに最高の運があります!
この完全な回答をいただきありがとうございます。 ちなみに、私はLibSVMを直接使用すると思います... OpenCVでプリコンパイルされたカーネルを使う方法がないようですね。( –