有人能告诉我如何在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
答案 0 :(得分:5)
很抱歉反应迟钝。我决定把它作为Encog的常见问题解答。你可以看到FAQ&amp;这里的例子。 http://www.heatonresearch.com/faq/5/2
基本上Encog DOES支持多类SVM。您不需要像神经网络那样需要多个输出。你只需用一个输出训练它,输出就是类号,即0.0,1.0,2.0等等。取决于你有多少个类。
这适用于Encog的Java和C#版本。我在C#中做了这个例子。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Encog.ML.SVM; using Encog.ML.Data; using Encog.ML.Data.Basic; using Encog.ML.Train; using Encog.ML.SVM.Training; namespace MultiClassSVM { class Program { /// /// Input for function, normalized to 0 to 1. /// public static double[][] ClassificationInput = { new[] {0.0, 0.0}, new[] {0.1, 0.0}, new[] {0.2, 0.0}, new[] {0.3, 0.0}, new[] {0.4, 0.5}, new[] {0.5, 0.5}, new[] {0.6, 0.5}, new[] {0.7, 0.5}, new[] {0.8, 0.5}, new[] {0.9, 0.5} }; /// /// Ideal output, these are class numbers, a total of four classes here (0,1,2,3). /// DO NOT USE FRACTIONAL CLASSES (i.e. there is no class 1.5) /// public static double[][] ClassificationIdeal = { new[] {0.0}, new[] {0.0}, new[] {0.0}, new[] {0.0}, new[] {1.0}, new[] {1.0}, new[] {2.0}, new[] {2.0}, new[] {3.0}, new[] {3.0} }; static void Main(string[] args) { // create a neural network, without using a factory var svm = new SupportVectorMachine(2, false); // 2 input, & false for classification // create training data IMLDataSet trainingSet = new BasicMLDataSet(ClassificationInput, ClassificationIdeal); // train the 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); // test the 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"); } } }
答案 1 :(得分:1)
您不能拥有多类SVM。 SVM只能分为两类。当然有如何将它们用于多类分类的方法。他们是一对一,一对一。
在一对一中,你为每对类训练(k *(k-1))/ 2个SVM。然后你让他们投票,获得最多选票的班级获胜。
在一对一中你只有k个SVM,每个班级你训练一个SVM对抗其余的班级,你再让他们投票并选择胜利者。
我不知道在Encog中是否支持one-vs-one和one-vs-all,你可以在最糟糕的情况下自己编写。但是,我确信您正在查看代码库的错误部分。它很可能不会在SVM的实现中。