2013-05-30 15 views
5

私は、サポートベクターマシンをPython(scikit-learnを使用)からC++(OpenCVのマシンラーニングライブラリを使用)に移植しています。訓練されたSVMをscikit-learnからOpenCVにインポートする

私はPythonで訓練されたSVMにアクセスでき、SVCモデルパラメータをXMLファイルからOpenCVにインポートできます。 scikit-learnとOpenCVの両方のSVM実装はLibSVMに基づいているので、私はOpenCVで訓練されたscikit SVMのパラメータを使用することが可能でなければならないと思います。私は今、訓練を受けたscikit-学ぶSVMからの値で、このXMLファイルを埋めたい

<?xml version="1.0"?> 
<opencv_storage> 
<my_svm type_id="opencv-ml-svm"> 
    <svm_type>C_SVC</svm_type> 
    <kernel><type>RBF</type> 
    <gamma>0.058823529411764705</gamma></kernel> 
    <C>100</C> 
    <term_criteria><epsilon>0.0</epsilon> 
    <iterations>1000</iterations></term_criteria> 
    <var_all>17</var_all> 
    <var_count>17</var_count> 
    <class_count>2</class_count> 
    <class_labels type_id="opencv-matrix"> 
    <rows>1</rows> 
    <cols>2</cols> 
    <dt>i</dt> 
    <data> 
     0 1</data></class_labels> 
    <sv_total>20</sv_total> 
    <support_vectors> 
    <_> 
     2.562423055146794554e-02 1.195797425735170838e-01 
     8.541410183822648050e-02 9.395551202204914520e-02 
     1.622867934926303379e-01 3.074907666176152077e-01 
     4.099876888234874062e-01 4.697775601102455179e-01 
     3.074907666176152077e-01 3.416564073529061440e-01 
     5.124846110293592716e-01 5.039432008455355660e-01 
     5.466502517646497639e-01 1.494746782168964394e+00 
     4.168208169705446942e+00 7.214937388193202183e-01 
     7.400275229357797802e-01</_> 
    <!-- omit 19 vectors to keep it short --> 
    </support_vectors> 
    <decision_functions> 
    <_> 
     <sv_count>20</sv_count> 
     <rho>-5.137523249549433402e+00</rho> 
     <alpha> 
     2.668992955678978518e+01 7.079767098112181145e+01 
     3.554240018130368384e+01 4.787014908624512088e+01 
     1.308470223155845069e+01 5.499185410034550614e+01 
     4.160483074010306126e+01 2.885504210853826379e+01 
     7.816431542954153144e+01 6.882061506693679576e+01 
     1.069534676985309574e+01 -1.000000000000000000e+02 
     -5.088050252552544350e+01 -1.101740897543916375e+01 
     -7.519686789702373630e+01 -3.893481464245511603e+01 
     -9.497774056452135483e+01 -4.688632332663718927e+00 
     -1.972745089701982835e+01 -8.169343841768861125e+01</alpha> 
     <index> 
     0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
     </index></_></decision_functions></my_svm> 
</opencv_storage> 

次の例では、OpenCVのではSVMを初期化するために使用できるXMLファイルを示しています。しかし、私はscikit-learnとOpenCVのパラメータがどのように対応しているのかよくわかりません。ここで私は(clfはPythonで分類子オブジェクトである)、これまで持っているものです。

  • <kernel><gamma>clf.gamma
  • <C>に対応clf.C
  • <term_criteria><epsilon>に対応clf.tol
  • <support_vectors>に対応clf.support_vectors_
  • に対応

これまでのところ正しいですか?ここに私が本当にわからないものがあります:

  • <term_criteria><iterations>については?
  • <decision_functions><_><rho>clf.intercept_に対応していますか?
  • <decision_functions><_><alpha>clf.dual_coef_に対応していますか?ここでは、scikit-learnのドキュメントに「」と書かれているので、わかりません。 iα i " OpenCVは、、ではなく、 iしか期待していないようです。

答えて

6

epsiloniterationsはもう必要ありません。これらはトレーニング最適化の問題で使用されています。お気に入りの番号に設定したり、無視したりすることができます。

の間でインデックスが異なる可能性があるため、サポートベクターを移植するには少しの手間が必要になることがあります。あなたの例のXMLは、例えば疎フォーマットを持っていません。他のパラメータについては

  • rhointercept_に対応している必要がありますが、あなたは、符号を変更する必要があるかもしれません。
  • scikitのdual_coef_は、標準モデル(alpha_i * y_i)のsv_coefに対応します。

を移植する際に、あなたがalphaを提供する値を訴えた場合、dual_coef_(例えば全て正)の絶対値を使用します。これらはSVMモデルの真のアルファ値です。

+0

この回答ありがとうございます。私はまだそれを試していないが、とにかくあなたの答えはいくつかの非常に有用な情報が含まれています。 'intercept_'の記号を変更する必要があるかどうかを知るにはどうすればいいですか? –

+1

@RobertHegnerでは、scikitとopencvで同じテストポイントを使用できます。インターセプトの符号が間違っている場合、予測の決定値は正確に2 *のインターセプトだけ異なります。 –

+1

ほかの人の参考にしてください:私は 'intercept_'の記号を変更する必要はなく、' dual_coef_'の絶対値を使う必要はありませんでした。それは完全にうまくいくようです!もう一度おねがいします。 –

関連する問題