6

有人可以告诉我如何在 Encog 3.1 中使用多类 SVM 分类吗?

我已经成功地使用了他们的神经网络,但无法弄清楚如何设置多类 SVM。

文档有这样的说法:

“这是一个由一个或多个支持向量机 (SVM) 支持的网络。它的功能与 Encog 神经网络非常相似,并且在很大程度上可与 Encog 神经网络互换......您希望 SVM 将输入数据分为一个或多个类。支持向量机通常有一个输出。神经网络可以有多个输出神经元。为了解决这个问题,如果有多个 SVM,此类将创建多个 SVM输出指定"

但是我看不到如何指定多个输出,实际上输出属性只是返回 1:

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

非常感谢 Java 或 c# 中的答案

编辑仍然无法解决这个问题。真的很喜欢使用 Encog,但是支持论坛上只有 Jeff Heaton(项目的作者)有机会自己回答,所以我链接了项目代码并添加了赏金,希望有人能看到我明显缺少的东西。

项目: http ://heatonresearch.com/

谷歌代码上的 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 的常见问题解答。您可以在此处查看常见问题解答和示例。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。
        ///
        公共静态双[][]分类输入= {
            新[] {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}
            };

        ///
        /// 理想输出,这些是类号,这里一共四个类(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}
        };

        静态无效主要(字符串 [] 参数)
        {
            // 创建一个神经网络,不使用工厂
            var svm = new SupportVectorMachine(2, false); // 2 个输入,& false 用于分类

            // 创建训练数据
            IMLDataSet trainingSet = new BasicMLDataSet(ClassificationInput, ClassificationIdeal);

            // 训练 SVM
            IMLTrain train = new SVMSearchTrain(svm, trainingSet);

            整数时代 = 1;

            做
            {
                train.Iteration();
                Console.WriteLine(@"Epoch #" + epoch + @" Error:" + train.Error);
                纪元++;
            } while (train.Error > 0.01);

            // 测试 SVM
            Console.WriteLine(@"SVM 结果:");
            foreach(训练集中的 IMLDataPair 对)
            {
                IMLData 输出 = svm.Compute(pair.Input);
                Console.WriteLine(pair.Input[0]
                                  + @", 实际=" + 输出[0] + @",ideal=" + pair.Ideal[0]);
            }

            Console.WriteLine("完成");
        }
    }
}
于 2013-05-30T20:38:53.953 回答
1

您不能拥有多类 SVM。SVM 只能分为两类。当然有一些方法可以将它们用于多类分类。它们是一对一和一对一的。

在一对一中,您为每对类训练 (k * (k-1))/2 个 SVM。然后你让他们投票,得票最多的班级获胜。

在 one-vs-all 中,您只有 k 个 SVM,并且对于每个班级,您针对其余班级训练一个 SVM,然后再次让他们投票并选择获胜者。

我不知道Encog是否支持一对一和一对一,最坏的情况你可以自己写。但是,我确信您正在查看代码库的错误部分。它很可能不会出现在 SVM 的实现中。

于 2013-05-29T20:09:44.923 回答