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 + -
显示快捷键?