6

Encog 3.1 でマルチクラス SVM 分類を使用する方法を教えてもらえますか?

彼らのニューラル ネットワークを使用してある程度成功しましたが、マルチクラス SVM をセットアップする方法がわかりません。

ドキュメントには次のように書かれています。

「これは、1 つ以上のサポート ベクター マシン (SVM) によって支えられているネットワークです。Encog ニューラル ネットワークと非常によく似た機能を果たすように設計されており、Encog ニューラル ネットワークと大部分は互換性があります。分類は、次の場合に使用されます。 SVM で入力データを 1 つ以上のクラスにグループ化する必要があります. サポート ベクター マシンは通常 1 つの出力を持ちます. ニューラル ネットワークは複数の出力ニューロンを持つことができます. この問題を回避するために, このクラスは複数の SVM を作成します.出力指定」

それでも、複数の出力を指定する方法がわかりません。実際、出力プロパティは単に 1 を返します。

 /// <value>For a SVM, the output count is always one.</value>
    public int OutputCount
    {
        get { return 1; }
    }

Java または C# での回答は大歓迎です

EDITはまだこれを解決できません。Encog の使用を本当に楽しんでいますが、サポート フォーラムはジェフ ヒートン (プロジェクトの作成者) 自身が機会があれば回答するだけなので、プロジェクト コードをリンクして報奨金を追加し、誰かが明らかに不足しているものを確認できるようにしています。

プロジェクト: http://heatonresearch.com/

Google コードの SupportVectorMachine クラス: https://code.google.com/p/encog-cs/source/browse/trunk/encog-core/encog-core-cs/ML/SVM/SupportVectorMachine.cs

4

2 に答える 2

5

返信が遅くなり申し訳ありません。これを Encog の FAQ にすることにしました。ここでFAQと例を見ることができます。http://www.heatonresearch.com/faq/5/2

基本的に、Encog はマルチクラス SVM をサポートします。ニューラル ネットワークのように複数の出力は必要ありません。単一の出力でトレーニングするだけで、その出力はクラス番号、つまり、クラスの数に応じて 0.0、1.0、2.0 などになります。

これは、Encog の Java バージョンと C# バージョンの両方に当てはまります。私はC#で例を作りました。

システムを使用する;
System.Collections.Generic の使用;
System.Linq を使用します。
System.Text を使用します。
Encog.ML.SVM を使用します。
Encog.ML.Data を使用します。
Encog.ML.Data.Basic を使用します。
Encog.ML.Train を使用します。
Encog.ML.SVM.Training を使用します。

名前空間 MultiClassSVM
{
    クラス プログラム
    {
        ///
        /// 0 から 1 に正規化された関数の入力。
        ///
        public static double[][] ClassificationInput = {
            新しい[] {0.0、0.0}、
            新しい[] {0.1、0.0}、
            新しい[] {0.2、0.0}、
            新しい[] {0.3、0.0}、
            新しい[] {0.4、0.5}、
            新しい[] {0.5、0.5}、
            新しい[] {0.6、0.5}、
            新しい[] {0.7、0.5}、
            新しい[] {0.8、0.5}、
            新しい[] {0.9、0.5}
            };

        ///
        /// 理想的な出力。これらはクラス番号で、合計 4 つのクラス (0、1、2、3) です。
        /// 分数クラスを使用しないでください (つまり、クラス 1.5 はありません)
        ///
        public static double[][] ClassificationIdeal = {
            新しい[] {0.0}、
            新しい[] {0.0}、
            新しい[] {0.0}、
            新しい[] {0.0}、
            新しい[] {1.0}、
            新しい[] {1.0}、
            新しい[] {2.0}、
            新しい[] {2.0}、
            新しい[] {3.0}、
            新しい[] {3.0}
        };

        static void Main(string[] args)
        {
            // ファクトリを使用せずにニューラル ネットワークを作成します
            var svm = 新しい SupportVectorMachine(2, false); // 2 つの入力、& 分類の場合は false

            // トレーニングデータを作成
            IMLDataSet trainingSet = new BasicMLDataSet(ClassificationInput, ClassificationIdeal);

            // SVM を訓練する
            IMLTrain トレイン = 新しい SVMSearchTrain(svm, trainingSet);

            int エポック = 1;

            行う
            {
                train.Iteration();
                Console.WriteLine(@"エポック #" + エポック + @" エラー:" + train.Error);
                エポック++;
            while (train.Error > 0.01);

            // SVM をテストする
            Console.WriteLine(@"SVM 結果:");
            foreach (trainingSet の IMLDataPair ペア)
            {
                IMLData 出力 = svm.Compute(pair.Input);
                Console.WriteLine(pair.Input[0]
                                  + @", actual=" + 出力[0] + @",ideal=" + pair.Ideal[0]);
            }

            Console.WriteLine("完了");
        }
    }
}
于 2013-05-30T20:38:53.953 に答える
1

マルチクラス SVM を持つことはできません。SVM は 2 つのクラスにしか分類できません。もちろん、マルチクラス分類にそれらを使用する方法があります。それらは、1 対 1 および 1 対すべてです。

1 対 1 では、クラスのペアごとに (k * (k-1))/2 SVM をトレーニングします。次に、彼らに投票させ、最も多くの票を獲得したクラスが勝ちます。

1 対すべてでは、k 個の SVM しかなく、クラスごとに残りのクラスに対して 1 つの SVM をトレーニングし、再び投票して勝者を選択させます。

Encog で one-vs-one と one-vs-all がサポートされているかどうかはわかりませんが、最悪の場合は自分で記述できます。ただし、コードベースの間違った部分を見ていると確信しています。おそらく、SVM の実装には含まれないでしょう。

于 2013-05-29T20:09:44.923 に答える