⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 experiment.java

📁 wekaUT是 university texas austin 开发的基于weka的半指导学习(semi supervised learning)的分类器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* *    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., 675 Mass Ave, Cambridge, MA 02139, USA. *//* *    Experiment.java *    Copyright (C) 1999 Len Trigg * */package weka.experiment;import weka.core.OptionHandler;import weka.core.Utils;import weka.core.Option;import weka.core.Instances;import weka.core.FastVector;import weka.core.AdditionalMeasureProducer;import java.io.Serializable;import java.io.File;import java.io.IOException;import java.io.Reader;import java.io.FileReader;import java.io.BufferedReader;import java.lang.reflect.Array;import java.lang.reflect.Method;import java.util.Enumeration;import java.util.Vector;import java.beans.PropertyDescriptor;import javax.swing.DefaultListModel;import java.io.FileInputStream;import java.io.ObjectInputStream;import java.io.BufferedInputStream;import java.io.FileOutputStream;import java.io.BufferedOutputStream;import java.io.ObjectOutputStream;import java.beans.Customizer;import java.beans.PropertyChangeEvent;import java.beans.PropertyDescriptor;import java.beans.MethodDescriptor;import java.beans.PropertyEditor;import java.beans.PropertyChangeSupport;import java.beans.PropertyChangeListener;/** * Holds all the necessary configuration information for a standard * type experiment. This object is able to be serialized for storage * on disk. * * @author Len Trigg (trigg@cs.waikato.ac.nz) * @version $Revision: 1.3 $ */public class Experiment implements Serializable, OptionHandler {    /** The filename extension that should be used for experiment files */  public static String FILE_EXTENSION = ".exp";  /** Where results will be sent */  //====================  BEGIN EDIT mbilenko ============================   protected ResultListener m_ResultListener = new InstancesResultListener();  //====================  END EDIT mbilenko ==============================     /** The result producer */  protected ResultProducer m_ResultProducer = new RandomSplitResultProducer();  /** Lower run number */  protected int m_RunLower = 1;  /** Upper run number */  protected int m_RunUpper = 10;  /** An array of dataset files */  protected DefaultListModel m_Datasets = new DefaultListModel();  /** True if the exp should also iterate over a property of the RP */  protected boolean m_UsePropertyIterator = false;    /** The path to the iterator property */  protected PropertyNode [] m_PropertyPath;    /** The array of values to set the property to */  protected Object m_PropertyArray;  /** User notes about the experiment */  protected String m_Notes = "";  /** Method names of additional measures of objects contained in the       custom property iterator. Only methods names beginning with "measure"      and returning doubles are recognised */  protected String [] m_AdditionalMeasures = null;  /** True if the class attribute is the first attribute for all      datasets involved in this experiment. */  protected boolean m_ClassFirst = false;  /** If true an experiment will advance the current data set befor      any custom itererator */  protected boolean m_AdvanceDataSetFirst = true;  /**   * Sets whether the first attribute is treated as the class   * for all datasets involved in the experiment. This information   * is not output with the result of the experiments!   */  public void classFirst(boolean flag) {        m_ClassFirst = flag;  }    boolean m_m_AdvanceRunFirst;    /**   * Get the value of m_DataSetFirstFirst.   *   * @return Value of m_DataSetFirstFirst.   */  public boolean getAdvanceDataSetFirst() {        return m_AdvanceDataSetFirst;  }    /**   * Set the value of m_AdvanceDataSetFirst.   *   * @param newm_AdvanceDataSetFirst Value to assign to m_AdvanceRunFirst.   */  public void setAdvanceDataSetFirst(boolean newAdvanceDataSetFirst) {        m_AdvanceDataSetFirst = newAdvanceDataSetFirst;  }    /**   * Gets whether the custom property iterator should be used.   *   * @return true if so   */  public boolean getUsePropertyIterator() {        return m_UsePropertyIterator;  }  /**   * Sets whether the custom property iterator should be used.   *   * @param newUsePropertyIterator true if so   */  public void setUsePropertyIterator(boolean newUsePropertyIterator) {        m_UsePropertyIterator = newUsePropertyIterator;  }  /**   * Gets the path of properties taken to get to the custom property   * to iterate over.   *   * @return an array of PropertyNodes   */  public PropertyNode [] getPropertyPath() {        return m_PropertyPath;  }    /**   * Sets the path of properties taken to get to the custom property   * to iterate over.   *   * @param newPropertyPath an array of PropertyNodes   */  public void setPropertyPath(PropertyNode [] newPropertyPath) {        m_PropertyPath = newPropertyPath;  }    /**   * Sets the array of values to set the custom property to.   *   * @param newPropArray a value of type Object which should be an   * array of the appropriate values.   */  public void setPropertyArray(Object newPropArray) {    m_PropertyArray = newPropArray;  }  /**   * Gets the array of values to set the custom property to.   *   * @return a value of type Object which should be an   * array of the appropriate values.   */  public Object getPropertyArray() {    return m_PropertyArray;  }  /**   * Gets the number of custom iterator values that have been defined   * for the experiment.   *   * @return the number of custom property iterator values.   */  public int getPropertyArrayLength() {    return Array.getLength(m_PropertyArray);  }  /**   * Gets a specified value from the custom property iterator array.   *   * @param index the index of the value wanted   * @return the property array value   */  public Object getPropertyArrayValue(int index) {    return Array.get(m_PropertyArray, index);  }    /* These may potentially want to be made un-transient if it is decided   * that experiments may be saved mid-run and later resumed   */  /** The current run number when the experiment is running */  protected transient int m_RunNumber;  /** The current dataset number when the experiment is running */  protected transient int m_DatasetNumber;  /** The current custom property value index when the experiment is running */  protected transient int m_PropertyNumber;  /** True if the experiment has finished running */  protected transient boolean m_Finished = true;  /** The dataset currently being used */  protected transient Instances m_CurrentInstances;  /** The custom property value that has actually been set */  protected transient int m_CurrentProperty;  /**   * When an experiment is running, this returns the current run number.   *   * @return the current run number.   */  public int getCurrentRunNumber() {    return m_RunNumber;  }  /**   * When an experiment is running, this returns the current dataset number.   *   * @return the current dataset number.   */  public int getCurrentDatasetNumber() {    return m_DatasetNumber;  }  /**   * When an experiment is running, this returns the index of the   * current custom property value.   *   * @return the index of the current custom property value.   */  public int getCurrentPropertyNumber() {    return m_PropertyNumber;  }    /**   * Prepares an experiment for running, initializing current iterator   * settings.   *   * @exception Exception if an error occurs   */  public void initialize() throws Exception {        m_RunNumber = getRunLower();    m_DatasetNumber = 0;    m_PropertyNumber = 0;    m_CurrentProperty = -1;    m_CurrentInstances = null;    m_Finished = false;    if (m_UsePropertyIterator && (m_PropertyArray == null)) {      throw new Exception("Null array for property iterator");    }    if (getRunLower() > getRunUpper()) {      throw new Exception("Lower run number is greater than upper run number");    }    if (getDatasets().size() == 0) {      throw new Exception("No datasets have been specified");    }    if (m_ResultProducer == null) {      throw new Exception("No ResultProducer set");    }    if (m_ResultListener == null) {      throw new Exception("No ResultListener set");    }    //    if (m_UsePropertyIterator && (m_PropertyArray != null)) {    determineAdditionalResultMeasures();      //    }    m_ResultProducer.setResultListener(m_ResultListener);    m_ResultProducer.setAdditionalMeasures(m_AdditionalMeasures);    m_ResultProducer.preProcess();    // constrain the additional measures to be only those allowable    // by the ResultListener    String [] columnConstraints = m_ResultListener.      determineColumnConstraints(m_ResultProducer);    if (columnConstraints != null) {      m_ResultProducer.setAdditionalMeasures(columnConstraints);    }  }  /**   * Iterate over the objects in the property array to determine what   * (if any) additional measures they support   */  private void determineAdditionalResultMeasures() throws Exception {    m_AdditionalMeasures = null;    FastVector measureNames = new FastVector();    // first try the result producer, then property array if applicable    if (m_ResultProducer instanceof AdditionalMeasureProducer) {      Enumeration am = ((AdditionalMeasureProducer)m_ResultProducer).	enumerateMeasures();      while (am.hasMoreElements()) {	String mname = (String)am.nextElement();	if (mname.startsWith("measure")) {	  if (measureNames.indexOf(mname) == -1) {	    measureNames.addElement(mname);	  }	} else {	  throw new Exception ("Additional measures in "			       + m_ResultProducer.getClass().getName()			       +" must obey the naming convention"			       +" of starting with \"measure\"");	}      }    }    if (m_UsePropertyIterator && (m_PropertyArray != null)) {      for (int i = 0; i < Array.getLength(m_PropertyArray); i++) {	Object current = Array.get(m_PropertyArray, i);	if (current instanceof AdditionalMeasureProducer) {	  Enumeration am = ((AdditionalMeasureProducer)current).	    enumerateMeasures();	  while (am.hasMoreElements()) {	    String mname = (String)am.nextElement();	    if (mname.startsWith("measure")) {	      if (measureNames.indexOf(mname) == -1) {		measureNames.addElement(mname);	      }	    } else {	      throw new Exception ("Additional measures in "				   + current.getClass().getName()				   +" must obey the naming convention"				   +" of starting with \"measure\"");	    }	  }	}      }    }    if (measureNames.size() > 0) {      m_AdditionalMeasures = new String [measureNames.size()];      for (int i=0;i<measureNames.size();i++) {	m_AdditionalMeasures[i] = (String)measureNames.elementAt(i);      }    }  }    /**   * Recursively sets the custom property value, by setting all values   * along the property path.   *   * @param propertyDepth the current position along the property path   * @param origValue the value to set the property to   * @exception Exception if an error occurs   */  protected void setProperty(int propertyDepth, Object origValue)    throws Exception {        PropertyDescriptor current = m_PropertyPath[propertyDepth].property;    Object subVal = null;    if (propertyDepth < m_PropertyPath.length - 1) {      Method getter = current.getReadMethod();      Object getArgs [] = { };      subVal = getter.invoke(origValue, getArgs);      setProperty(propertyDepth + 1, subVal);    } else {      subVal = Array.get(m_PropertyArray, m_PropertyNumber);    }    Method setter = current.getWriteMethod();    Object [] args = { subVal };    setter.invoke(origValue, args);  }  /**   * Returns true if there are more iterations to carry out in the experiment.   *   * @return true if so   */  public boolean hasMoreIterations() {    return !m_Finished;  }    /**   * Carries out the next iteration of the experiment.   *   * @exception Exception if an error occurs   */  public void nextIteration() throws Exception {        if (m_UsePropertyIterator) {      if (m_CurrentProperty != m_PropertyNumber) {	setProperty(0, m_ResultProducer);	m_CurrentProperty = m_PropertyNumber;      }    }        if (m_CurrentInstances == null) {      File currentFile = (File) getDatasets().elementAt(m_DatasetNumber);      Reader reader = new FileReader(currentFile);      Instances data = new Instances(new BufferedReader(reader));      if (m_ClassFirst) {	data.setClassIndex(0);      } else {	data.setClassIndex(data.numAttributes() - 1);      }      m_CurrentInstances = data;      m_ResultProducer.setInstances(m_CurrentInstances);    }        m_ResultProducer.doRun(m_RunNumber);    advanceCounters();  }  /**   * Increments iteration counters appropriately.   */  public void advanceCounters() {    if (m_AdvanceDataSetFirst) {      m_RunNumber ++;      if (m_RunNumber > getRunUpper()) {	m_RunNumber = getRunLower();	m_DatasetNumber ++;	m_CurrentInstances = null;	if (m_DatasetNumber >= getDatasets().size()) {	  m_DatasetNumber = 0;	  if (m_UsePropertyIterator) {	    m_PropertyNumber ++;	    if (m_PropertyNumber >= Array.getLength(m_PropertyArray)) {	      m_Finished = true;	    }	  } else {	    m_Finished = true;	  }	}      }    } else { // advance by custom iterator before data set      m_RunNumber ++;      if (m_RunNumber > getRunUpper()) {	m_RunNumber = getRunLower();	if (m_UsePropertyIterator) {	  m_PropertyNumber ++;	  if (m_PropertyNumber >= Array.getLength(m_PropertyArray)) {	    m_PropertyNumber = 0;	    m_DatasetNumber ++;	    m_CurrentInstances = null;	    if (m_DatasetNumber >= getDatasets().size()) {	      m_Finished = true;	    } 	  }	} else {	  m_DatasetNumber ++;	  m_CurrentInstances = null;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -