Python で scikits.learn を使用して一連の RBF SVM をトレーニングし、結果を Pickled しました。これらは画像処理タスク用であり、テストのためにやりたいことの 1 つは、いくつかのテスト画像のすべてのピクセルに対して各分類子を実行することです。つまり、ピクセル (i,j) を中心とするウィンドウから特徴ベクトルを抽出し、その特徴ベクトルに対して各分類子を実行してから、次のピクセルに移動して繰り返します。これは、Python で行うには遅すぎます。
明確化:「これは遅すぎる...」と言うときは、scikits.learn が使用する Libsvm の内部コードでさえ遅すぎることを意味します。GPU の手動決定関数を実際に書いているので、各ピクセルでの分類が並行して行われます。
Pickle を使用して分類器をロードし、特徴ベクトルから決定がどのように計算されるかを説明するある種の属性を取得し、その情報を自分の C コードに渡すことは可能ですか? 線形 SVM の場合、重みベクトルとバイアス ベクトルを抽出し、それらを C 関数への入力として追加するだけで済みます。しかし、RBF 分類子に対して行う同等のことは何ですか? また、scikits.learn オブジェクトからその情報を取得するにはどうすればよいでしょうか?
追加:ソリューションの最初の試み。
分類子オブジェクトにはsupport_vectors_
、配列の各行としてサポート ベクターを含む属性があるようです。dual_coef_
1×len(support_vectors_)
係数の配列である属性もあります。非線形 SVM に関する標準的なチュートリアルから、次のことを行う必要があるようです。
v
テスト対象のデータ ポイントから特徴ベクトルを計算します。これは の行と同じ長さのベクトルになりますsupport_vectors_
。- の各行について
i
、そのサポート ベクターと の間support_vectors_
の 2 乗ユークリッド距離を計算します。d[i]
v
- は RBF パラメータ
t[i]
として計算gamma * exp{-d[i]}
します。gamma
- 全体を合計し
dual_coef_[i] * t[i]
ますi
。intercept_
scikits.learn 分類子の属性の値をこの合計に追加します。 - 合計が正の場合、1 として分類します。それ以外の場合、0 として分類します。
追加:このドキュメント リンクの番号付きの 9 ページで、実際にintercept_
分類子の属性がバイアス項を保持していることに言及しています。これを反映するために、上記の手順を更新しました。