methodxvalidation.java
来自「一个很好的LIBSVM的JAVA源码。对于要研究和改进SVM算法的学者。可以参考」· Java 代码 · 共 154 行
JAVA
154 行
/*
* 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.validation;
import edu.udo.cs.yale.operator.Operator;
import edu.udo.cs.yale.operator.OperatorChain;
import edu.udo.cs.yale.operator.IOContainer;
import edu.udo.cs.yale.operator.OperatorException;
import edu.udo.cs.yale.operator.IllegalInputException;
import edu.udo.cs.yale.operator.IODescription;
import edu.udo.cs.yale.operator.IOObject;
import edu.udo.cs.yale.operator.Value;
import edu.udo.cs.yale.operator.MissingIOObjectException;
import edu.udo.cs.yale.operator.OperatorException;
import edu.udo.cs.yale.operator.parameter.*;
import edu.udo.cs.yale.example.ExampleSet;
import edu.udo.cs.yale.example.SplittedExampleSet;
import edu.udo.cs.yale.example.Example;
import edu.udo.cs.yale.example.ExampleReader;
import edu.udo.cs.yale.example.AttributeVector;
import edu.udo.cs.yale.example.Attribute;
import edu.udo.cs.yale.operator.performance.*;
import edu.udo.cs.yale.tools.*;
import java.util.List;
import java.util.Iterator;
/** This operator evaluates the performance of algorithms, e.g. feature selection algorithms. The first
* inner operator is the algorithm to be evaluated itself. It must return an example set which is in turn
* used to create a new model using the second inner operator and retrieve a performance vector using
* the third inner operator. This performance vector serves as a performance indicator for the actual algorithm.
* This implementation of a MethodValidationChain that works similar to the {@link XValidation}.
*
* @yale.xmlclass MethodXValidation
* @see edu.udo.cs.yale.operator.validation.XValidation
* @author ingo
* @version 08.06.2001
*/
public class MethodXValidation extends MethodValidationChain {
/** Total number of iterations. */
private int number;
/** Current iteration. */
private int iteration;
private AttributeVector attributeVector;
public MethodXValidation() {
addValue(new Value("iteration", "The number of the current iteration.") {
public double getValue() {
return iteration;
}
});
}
public int getNumberOfValidationSteps() {
return number;
}
public IOObject[] apply() throws OperatorException {
ExampleSet eSet = (ExampleSet)getInput(ExampleSet.class);
if (getParameterAsBoolean("leave_one_out")) {
number = eSet.getSize();
} else {
number = getParameterAsInt("number_of_validations");
}
boolean shuffle = getParameterAsBoolean("shuffle");
SplittedExampleSet inputSet = new SplittedExampleSet(eSet, number, shuffle);
LogService.logMessage(getName() + ": Starting "+number+"-fold method cross validation", LogService.TASK);
attributeVector = new AttributeVector(inputSet, number);
PerformanceVector performanceVector = null;
for (iteration = 0; iteration < number; iteration++) {
// training
inputSet.selectAllSubsetsBut(iteration);
// apply method
ExampleSet methodExampleSet = (ExampleSet)useMethod(inputSet).getInput(ExampleSet.class);
countAttributes(methodExampleSet);
SplittedExampleSet newInputSet = (SplittedExampleSet)inputSet.clone();
newInputSet.setAttributes(methodExampleSet);
learn(newInputSet);
// testing
newInputSet.selectSingleSubset(iteration);
IOContainer evalOutput = evaluate(newInputSet);
// retrieve performance
PerformanceVector iterationPerformance = (PerformanceVector)evalOutput.getInput(PerformanceVector.class);
if (performanceVector == null) {
performanceVector = iterationPerformance;
} else {
for (int i = 0; i < performanceVector.size(); i++) {
performanceVector.getCriterion(i).buildAverage(iterationPerformance.getCriterion(i));
}
}
setLastPerformance(iterationPerformance.getMainCriterion());
inApplyLoop();
}
// end of cross validation
IOObject[] outputArray = new IOObject[2];
setResult(performanceVector.getMainCriterion());
return new IOObject[] { performanceVector, attributeVector};
}
private void countAttributes(ExampleSet es) {
for (int i = 0; i < es.getNumberOfAttributes(); i++) {
attributeVector.countAttribute(es.getAttribute(i));
}
}
public List getParameterTypes() {
List types = super.getParameterTypes();
ParameterType type = new ParameterTypeInt("number_of_validations", "Number of subsets for the crossvalidation.", 2, Integer.MAX_VALUE, 10);
type.setExpert(false);
types.add(type);
types.add(new ParameterTypeBoolean("leave_one_out", "Set the number of validations to the number of examples. If set to true, number_of_validations is ignored.", false));
types.add(new ParameterTypeBoolean("shuffle", "If true, shuffle the dataset records.", true));
return types;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?