📄 libsvmlearner.java
字号:
/*
* YALE - Yet Another Learning Environment
* Copyright (C) 2001-2004
* Simon Fischer, Ralf Klinkenberg, Ingo Mierswa,
* Katharina Morik, Oliver Ritthoff
* Artificial Intelligence Unit
* Computer Science Department
* University of Dortmund
* 44221 Dortmund, Germany
* email: yale-team@lists.sourceforge.net
* web: http://yale.cs.uni-dortmund.de/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
package edu.udo.cs.yale.operator.learner.kernel;
import edu.udo.cs.yale.operator.learner.AbstractLearner;
import edu.udo.cs.yale.operator.learner.Model;
import edu.udo.cs.yale.example.ExampleSet;
import edu.udo.cs.yale.example.ExampleReader;
import edu.udo.cs.yale.example.Example;
import edu.udo.cs.yale.example.Attribute;
import edu.udo.cs.yale.operator.OperatorException;
import edu.udo.cs.yale.operator.UserError;
import edu.udo.cs.yale.operator.parameter.*;
import edu.udo.cs.yale.tools.LogService;
import libsvm.svm;
import libsvm.svm_problem;
import libsvm.svm_parameter;
import libsvm.svm_node;
import libsvm.svm_model;
import java.util.List;
import java.util.LinkedList;
/** Applies the <a href="http://www.csie.ntu.edu.tw/~cjlin/libsvm">libsvm</a> learner
* by Chih-Chung Chang and Chih-Jen Lin. The SVM is a powerful method for both
* classification and regression.
*
* @yale.index SVM
* @version $Id: LibSVMLearner.java,v 1.2 2004/08/27 11:57:40 ingomierswa Exp $
*/
public class LibSVMLearner extends AbstractLearner {
public static final String[] SVM_TYPES = { "C-SVC", "nu-SVC", "one-class", "epsilon-SVR", "nu-SVR" };
public static final String[] KERNEL_TYPES = { "linear", "poly", "rbf", "sigmoid" };
public static svm_node[] makeNodes(Example e) {
List nodes = new LinkedList();
for (int a = 0; a < e.getNumberOfAttributes(); a++) {
double value = e.getValue(a);
Attribute attr = e.getAttribute(a);
if (!attr.isDefault(value)) {
svm_node node = new svm_node();
node.index = a;
node.value = value;
nodes.add(node);
}
}
svm_node[] nodeArray = new svm_node[nodes.size()];
nodes.toArray(nodeArray);
return nodeArray;
}
public static svm_problem getProblem(ExampleSet exampleSet) {
LogService.logMessage("Creating LibSVM problem.", LogService.MINIMUM);
int nodeCount = 0;
svm_problem problem = new svm_problem();
problem.l = exampleSet.getSize();
problem.y = new double[exampleSet.getSize()];
problem.x = new svm_node[exampleSet.getSize()][];
ExampleReader i = exampleSet.getExampleReader();
int j = 0;
while (i.hasNext()) {
Example e = i.next();
problem.x[j] = makeNodes(e);
problem.y[j] = e.getLabel();
nodeCount += problem.x[j].length;
j++;
}
LogService.logMessage("Created "+nodeCount+" nodes for "+j+" examples.", LogService.MINIMUM);
return problem;
}
private svm_parameter getParameters(ExampleSet exampleSet) {
svm_parameter params = new svm_parameter();
params.svm_type = getParameterAsInt("svm_type");
params.kernel_type = getParameterAsInt("kernel_type");
params.degree = getParameterAsDouble("degree");
params.gamma = getParameterAsDouble("gamma");
if (params.gamma == 0)
params.gamma = 1.0/exampleSet.getSize();
params.coef0 = getParameterAsDouble("coef0");
params.nu = getParameterAsDouble("nu");
params.cache_size = getParameterAsInt("cache_size");
params.C = getParameterAsDouble("C");
params.eps = getParameterAsDouble("epsilon");
params.p = getParameterAsDouble("p");
params.shrinking = getParameterAsBoolean("shrinking") ? 1 : 0;
return params;
}
public Model learn(ExampleSet exampleSet) throws OperatorException {
svm_parameter params = getParameters(exampleSet);
svm_problem problem = getProblem(exampleSet);
String errorMsg = svm.svm_check_parameter(problem, params);
if (errorMsg != null)
throw new UserError(this, 905, new Object[] {"libsvm", errorMsg});
LogService.logMessage("Training LibSVM.", LogService.MINIMUM);
return new LibSVMModel(exampleSet.getLabel(), svm.svm_train(problem, params));
}
public List getParameterTypes() {
List types = super.getParameterTypes();
ParameterType type = new ParameterTypeCategory("svm_type", "SVM for classification (C-SVC, nu-SVC), regression (epsilon-SVR, nu-SVR) and distribution estimation (one-class)", SVM_TYPES, 0);
type.setExpert(false);
types.add(type);
type = new ParameterTypeCategory("kernel_type", "The type of the kernel functions", KERNEL_TYPES, 0);
type.setExpert(false);
types.add(type);
type = new ParameterTypeDouble("degree", "The degree for a polynomial kernel function.", 1, Double.POSITIVE_INFINITY, 3);
type.setExpert(false);
types.add(type);
type = new ParameterTypeDouble("gamma", "The parameter gamma for polynomial, rbf, and sigmoid kernel functions. 0 means 1/#attributes.", 0, 1, 0);
type.setExpert(false);
types.add(type);
type = new ParameterTypeDouble("C", "The cost parameter C for c_svc, epsilon_svr, and nu_svr.",
Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 100);
type.setExpert(false);
types.add(type);
types.add(new ParameterTypeDouble("coef0", "The parameter coef0 for polynomial and sigmoid kernel functions.", Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 0));
types.add(new ParameterTypeDouble("nu", "The parameter nu for nu_svc, one_class, and nu_svr.", Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 0.5));
types.add(new ParameterTypeInt("cache_size", "Cache size in Megabyte.", 0, Integer.MAX_VALUE, 40));
types.add(new ParameterTypeDouble("epsilon", "Tolerance of termination criterion.", Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 0.001));
types.add(new ParameterTypeDouble("p", "Tolerance of loss function of epsilon-SVR.", Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 0.1));
types.add(new ParameterTypeBoolean("shrinking", "Whether to use the shrinking heuristics.", true));
return types;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -