4

C++用のすべてのSVMライブラリはどちらかであるようです

  1. カスタムカーネルの禁止または
  2. Linux専用であり、VisualStudioで使用するのは大変な苦痛です。

カスタムカーネルをサポートし、Visual Studio(具体的には2010)で使用できるSVMライブラリは現在利用できますか?

4

1 に答える 1

9

私が言ったように、必要なものに合わせてlibsvmを変更するのは簡単です。説明は次のとおりです。http ://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f418

私はこれらの2つのカーネルに精通していないので、Googleから数式をコピーしました。私はそれらを正しくしたことを願っています:D

A.ヒストグラム交差カーネル(SOが悪すぎるとラテックスがレンダリングされません):SUM(min(x_i、y_i))->線形カーネルを変更してこれに変換できるので、基本的にバージョン3.12(最新)バージョン)、svm.cpp内:

->233行目returndot(x [i]、x [j]); -Kernel :: dotメソッドからコードをコピーし、それに応じて変更する必要があるため、次のようになります。

double sum = 0;
while(x->index != -1 && y->index != -1)
{
    if(x->index == y->index)
    {
        sum += min(x->value, y->value);
        ++x;
        ++y;
    }
    else
    {
        if(x->index > y->index)
            ++x;
        else
            ++y;
    }           
}
return sum;

(通常のテストファイルの場合、xはyと同じ長さである必要があります。テストファイルまたはモデルファイルに値0の属性が含まれている場合、elseブランチが存在すると思います。これは省略できますが、libsvmが期待される結果を生成する場合は線形カーネルの場合、この変更されたカーネルでも問題なく動作します)

->322行目returndot(x、y); - 同上

B.カイ2乗カーネル:SUM((2 x_i y_i)/(x_i + y_i))-さて、見てみましょう...線形カーネルの変更を再試行できると思います(RBFの最適化の一部は次のようになります)この場合は悪用されますが、今は無視しましょう):

->233行目は次のようになります。

double sum = 0;
while(x->index != -1 && y->index != -1)
{
    if(x->index == y->index)
    {
        sum += 2 * x->value * y->value / (x->value + y->value);
        ++x;
        ++y;
    }
    else
    {
        if(x->index > y->index)
            ++x;
        else
            ++y;
    }           
}
return sum;

->322行目-上記と同じ

PS:上記のコードはメモ帳で書かれており、テストされていません。それが機能せず、暗号Cコードのデバッグに2週間を費やす必要がある場合は、私を殺さないでください。[sarcasm]私にとっては最初の試行から機能しました。[/sarcasm]それでも、ワークフローを理解すれば、これら2つの場所にブレークポイントを設定することで簡単にデバッグできます。問題が発生した場合は、さらにサポートを提供させていただきますので、行き詰まった場合はお知らせください。

于 2012-09-11T21:35:52.110 に答える