Encog中的多类SVM分类
Posted
技术标签:
【中文标题】Encog中的多类SVM分类【英文标题】:Multiclass SVM Classification in Encog 【发布时间】:2013-05-20 13:47:20 【问题描述】:有人可以告诉我如何在 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# 中的答案
EDIT 仍然无法解决这个问题。真的很喜欢使用 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
【问题讨论】:
【参考方案1】:抱歉回复慢。我决定将此作为 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("完成");
【讨论】:
太好了,感谢您的回复,不知道为什么我没想过尝试。发现 Encog 确实非常有用。 你不就是用回归来分类的吗? ***.com/questions/9160669/… 同意,使用回归做分类不好,但这里不是这样。在 Encog 中,SVM 在构造函数中被指定为回归或分类。这是 SVM 的两种非常不同的设置。注意构造函数有一个假值,这意味着它是分类。因此,1.0、2.0 等的值是类号。它总是使用浮点输入来保持一致性。 @JeffHeaton 你知道如何规范化 0, 1 范围内的数据吗?是否有任何内置功能或可以这样做的东西? ...最后一个问题如何控制内核类型 en encog? 好的,杰夫,但您应该精确地突出显示 - SVM 仅适用于 (0,1) 范围内的 NORMALIZED 值【参考方案2】:您不能拥有多类 SVM。 SVM 只能分为两类。当然,有一些方法可以将它们用于多类分类。它们是一对一和一对一的。
在一对一中,您为每对类训练 (k * (k-1))/2 个 SVM。然后你让他们投票,得票最多的班级获胜。
在 one-vs-all 中,您只有 k 个 SVM,对于每个班级,您针对其余班级训练一个 SVM,然后再次让他们投票并选择获胜者。
我不知道Encog是否支持一对一和一对一,最坏的情况你可以自己写。但是,我确信您正在查看代码库的错误部分。它很可能不会出现在 SVM 的实现中。
【讨论】:
感谢您的回答,我最终可能会编写自己的实现,或者只是回到使用 Accord NET,但我确信 Encog 中必须支持此功能。我强调的文档肯定暗示了这一点。以上是关于Encog中的多类SVM分类的主要内容,如果未能解决你的问题,请参考以下文章