public final MLMethod create(final String architecture, final int input,
final int output) {
final List<String> layers = ArchitectureParse.parseLayers(architecture);
if (layers.size() != MAX_LAYERS) {
throw new EncogError(
"SVM's must have exactly three elements, separated by ->.");
}
final ArchitectureLayer inputLayer = ArchitectureParse.parseLayer(
layers.get(0), input);
final ArchitectureLayer paramsLayer = ArchitectureParse.parseLayer(
layers.get(1), input);
final ArchitectureLayer outputLayer = ArchitectureParse.parseLayer(
layers.get(2), output);
final String name = paramsLayer.getName();
final String kernelStr = paramsLayer.getParams().get("KERNEL");
final String svmTypeStr = paramsLayer.getParams().get("TYPE");
SVMType svmType = SVMType.NewSupportVectorClassification;
KernelType kernelType = KernelType.RadialBasisFunction;
boolean useNew = true;
if (svmTypeStr == null) {
useNew = true;
} else if (svmTypeStr.equalsIgnoreCase("NEW")) {
useNew = true;
} else if (svmTypeStr.equalsIgnoreCase("OLD")) {
useNew = false;
} else {
throw new EncogError("Unsupported type: " + svmTypeStr
+ ", must be NEW or OLD.");
}
if (name.equalsIgnoreCase("C")) {
if (useNew) {
svmType = SVMType.NewSupportVectorClassification;
} else {
svmType = SVMType.SupportVectorClassification;
}
} else if (name.equalsIgnoreCase("R")) {
if (useNew) {
svmType = SVMType.NewSupportVectorRegression;
} else {
svmType = SVMType.EpsilonSupportVectorRegression;
}
} else {
throw new EncogError("Unsupported mode: " + name
+ ", must be C for classify or R for regression.");
}
if (kernelStr == null) {
kernelType = KernelType.RadialBasisFunction;
} else if ("linear".equalsIgnoreCase(kernelStr)) {
kernelType = KernelType.Linear;
} else if ("poly".equalsIgnoreCase(kernelStr)) {
kernelType = KernelType.Poly;
} else if ("precomputed".equalsIgnoreCase(kernelStr)) {
kernelType = KernelType.Precomputed;
} else if ("rbf".equalsIgnoreCase(kernelStr)) {
kernelType = KernelType.RadialBasisFunction;
} else if ("sigmoid".equalsIgnoreCase(kernelStr)) {
kernelType = KernelType.Sigmoid;
} else {
throw new EncogError("Unsupported kernel: " + kernelStr
+ ", must be linear,poly,precomputed,rbf or sigmoid.");
}
final int inputCount = inputLayer.getCount();
final int outputCount = outputLayer.getCount();
if (outputCount != 1) {
throw new EncogError("SVM can only have an output size of 1.");
}
final SVM result = new SVM(inputCount, svmType, kernelType);
return result;