抱歉回复慢。我决定将此作为 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("完成");
}
}
}