Encog中的多类支持向量机分类

6
有人能向我展示如何在Encog 3.1中使用多类SVM分类吗?
我已经成功地使用了他们的神经网络,但是无法弄清楚如何设置多类SVM。
文档中有这样的说法:
“这是由一个或多个支持向量机(SVM)支持的网络。它被设计为与Encog神经网络非常相似,并且在很大程度上可以与Encog神经网络互换.....当您希望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/

在Google代码上的SupportVectorMachine类: https://code.google.com/p/encog-cs/source/browse/trunk/encog-core/encog-core-cs/ML/SVM/SupportVectorMachine.cs

2个回答

5

抱歉回复较慢。我决定将这个问题设为Encog的FAQ。你可以在这里看到常见问题和示例。 http://www.heatonresearch.com/faq/5/2

基本上,Encog确实支持多类SVM。你不需要像神经网络那样使用多个输出。你只需用单个输出进行训练,该输出就是类别编号,例如0.0、1.0、2.0等,具体取决于你有多少个类别。

这适用于Java和C#版本的Encog。我在C#中做了示例。

使用System;
使用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 { 类Program { /// /// 函数的输入,归一化为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} };
/// /// 理想输出,这些是类号,在这里总共有四个类(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} };
静态无返回 Main(string[] args) { // 创建一个神经网络,不使用工厂 var svm = new SupportVectorMachine(2, false); // 2个输入,& false表示分类
// 创建训练数据 IMLDataSet trainingSet = new BasicMLDataSet(ClassificationInput, ClassificationIdeal);
// 训练SVM IMLTrain train = new SVMSearchTrain(svm, trainingSet);
int epoch = 1;
do { train.Iteration(); Console.WriteLine(@"Epoch #" + epoch + @" Error:" + train.Error); epoch++; } while (train.Error > 0.01);
// 测试SVM Console.WriteLine(@"SVM Results:"); foreach (IMLDataPair pair in trainingSet) { IMLData output = svm.Compute(pair.Input); Console.WriteLine(pair.Input[0] + @", actual=" + output[0] + @",ideal=" + pair.Ideal[0]); }
Console.WriteLine("Done"); } } }

太好了,谢谢你的回复,不知道为什么我没想到尝试那个。确实发现Encog非常有用。 - Steve
你难道不是在使用回归来进行分类吗?http://stackoverflow.com/questions/9160669/why-is-it-not-to-approach-classification-through-regression - David Marek
同意,使用回归进行分类是不好的,但这里并非如此。在Encog中,SVM在构造函数中被指定为回归或分类。这是两种非常不同的SVM设置。请注意构造函数具有false值,这意味着它是分类。因此,1.0、2.0等值是类号。它始终使用浮点输入以保持一致性。 - JeffHeaton
@JeffHeaton 你有没有办法将数据归一化到0到1的范围内?有没有内置函数或其他方法可以实现这个功能?...最后一个问题,如何控制Encog中的核类型? - Ibrahim Amer
好的,很好 Jeff,但你应该明确强调 - SVM 仅适用于在范围(0,1)内规范化的值。 - murt

1
你不能使用多类SVM,SVM只能分类为两类。当然有方法可以将其用于多类分类,它们是一对一和一对所有。在一对一中,你需要为每一对类别训练(k * (k-1))/2个SVM,然后让它们投票,获得最多票数的类别胜出。在一对所有中,你只需要k个SVM,并且对于每个类别,你需要训练一个SVM来与其他类别进行比较,同样地,让它们投票并选择胜者。我不知道Encog是否支持一对一和一对所有,如果最坏的情况下没有,你可以自己编写代码。但是,我相信你正在看错代码库的部分。它很可能不会在SVM的实现中。

谢谢你的回答,我可能会自己编写实现,或者回到使用Accord NET,但我相信Encog肯定内置了对此的支持。我所强调的文档确实暗示了这一点。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接