normalize.java

来自「Weka」· Java 代码 · 共 570 行 · 第 1/2 页

JAVA
570
字号
/* *    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. *//* *    Normalize.java *    Copyright (C) 1999 University of Waikato, Hamilton, New Zealand * */package weka.filters.unsupervised.attribute;import weka.core.Capabilities;import weka.core.Instance;import weka.core.Instances;import weka.core.Option;import weka.core.OptionHandler;import weka.core.SparseInstance;import weka.core.Utils;import weka.core.Capabilities.Capability;import weka.filters.Sourcable;import weka.filters.UnsupervisedFilter;import java.util.Enumeration;import java.util.Vector;/**  <!-- globalinfo-start --> * Normalizes all numeric values in the given dataset (apart from the class attribute, if set). The resulting values are by default in [0,1] for the data used to compute the normalization intervals. But with the scale and translation parameters one can change that, e.g., with scale = 2.0 and translation = -1.0 you get values in the range [-1,+1]. * <p/> <!-- globalinfo-end --> * <!-- options-start --> * Valid options are: <p/> *  * <pre> -unset-class-temporarily *  Unsets the class index temporarily before the filter is *  applied to the data. *  (default: no)</pre> *  * <pre> -S &lt;num&gt; *  The scaling factor for the output range. *  (default: 1.0)</pre> *  * <pre> -T &lt;num&gt; *  The translation of the output range. *  (default: 0.0)</pre> *  <!-- options-end --> *  * @author Eibe Frank (eibe@cs.waikato.ac.nz)  * @author FracPete (fracpete at waikato dot ac dot nz) * @version $Revision: 1.12 $ */public class Normalize   extends PotentialClassIgnorer   implements UnsupervisedFilter, Sourcable, OptionHandler {    /** for serialization. */  static final long serialVersionUID = -8158531150984362898L;  /** The minimum values for numeric attributes. */  protected double[] m_MinArray;    /** The maximum values for numeric attributes. */  protected double[] m_MaxArray;  /** The translation of the output range. */  protected double m_Translation = 0;    /** The scaling factor of the output range. */  protected double m_Scale = 1.0;    /**   * Returns a string describing this filter.   *   * @return 		a description of the filter suitable for   * 			displaying in the explorer/experimenter gui   */  public String globalInfo() {    return         "Normalizes all numeric values in the given dataset (apart from the "      + "class attribute, if set). The resulting values are by default "      + "in [0,1] for the data used to compute the normalization intervals. "      + "But with the scale and translation parameters one can change that, "      + "e.g., with scale = 2.0 and translation = -1.0 you get values in the "      + "range [-1,+1].";  }  /**   * Returns an enumeration describing the available options.   *   * @return 		an enumeration of all the available options.   */  public Enumeration listOptions() {    Vector result = new Vector();    Enumeration en = super.listOptions();    while (en.hasMoreElements())      result.addElement(en.nextElement());    result.addElement(new Option(	"\tThe scaling factor for the output range.\n"	+ "\t(default: 1.0)",	"S", 1, "-S <num>"));    result.addElement(new Option(	"\tThe translation of the output range.\n"	+"\t(default: 0.0)",	"T", 1,"-T <num>"));    return result.elements();  }  /**   * Parses a given list of options. <p/>   *    <!-- options-start -->   * Valid options are: <p/>   *    * <pre> -unset-class-temporarily   *  Unsets the class index temporarily before the filter is   *  applied to the data.   *  (default: no)</pre>   *    * <pre> -S &lt;num&gt;   *  The scaling factor for the output range.   *  (default: 1.0)</pre>   *    * <pre> -T &lt;num&gt;   *  The translation of the output range.   *  (default: 0.0)</pre>   *    <!-- options-end -->   *   * @param options the list of options as an array of strings   * @throws Exception if an option is not supported   */  public void setOptions(String[] options) throws Exception {    String      tmpStr;    tmpStr = Utils.getOption('S', options);    if (tmpStr.length() != 0)      setScale(Double.parseDouble(tmpStr));    else      setScale(1.0);        tmpStr = Utils.getOption('T', options);    if (tmpStr.length() != 0)      setTranslation(Double.parseDouble(tmpStr));    else      setTranslation(0.0);    if (getInputFormat() != null)      setInputFormat(getInputFormat());  }  /**   * Gets the current settings of the filter.   *   * @return an array of strings suitable for passing to setOptions   */  public String[] getOptions() {    Vector<String>	result;        result = new Vector<String>();    result.add("-S");    result.add("" + getScale());    result.add("-T");    result.add("" + getTranslation());        return result.toArray(new String[result.size()]);  }  /**    * Returns the Capabilities of this filter.   *   * @return            the capabilities of this object   * @see               Capabilities   */  public Capabilities getCapabilities() {    Capabilities result = super.getCapabilities();    // attributes    result.enableAllAttributes();    result.enable(Capability.MISSING_VALUES);        // class    result.enableAllClasses();    result.enable(Capability.MISSING_CLASS_VALUES);    result.enable(Capability.NO_CLASS);        return result;  }  /**   * Sets the format of the input instances.   *   * @param instanceInfo 	an Instances object containing the input    * 				instance structure (any instances contained in    * 				the object are ignored - only the structure is    * 				required).   * @return 			true if the outputFormat may be collected    * 				immediately   * @throws Exception 		if the input format can't be set successfully   */  public boolean setInputFormat(Instances instanceInfo)        throws Exception {    super.setInputFormat(instanceInfo);    setOutputFormat(instanceInfo);    m_MinArray = m_MaxArray = null;    return true;  }  /**   * Input an instance for filtering. Filter requires all   * training instances be read before producing output.   *   * @param instance 	the input instance   * @return 		true if the filtered instance may now be   * 			collected with output().   * @throws Exception 	if an error occurs   * @throws IllegalStateException 	if no input format has been set.   */  public boolean input(Instance instance) throws Exception {    if (getInputFormat() == null)      throw new IllegalStateException("No input instance format defined");        if (m_NewBatch) {      resetQueue();      m_NewBatch = false;    }    if (m_MinArray == null) {      bufferInput(instance);      return false;    }    else {      convertInstance(instance);      return true;    }  }  /**   * Signify that this batch of input to the filter is finished.    * If the filter requires all instances prior to filtering,   * output() may now be called to retrieve the filtered instances.   *   * @return 		true if there are instances pending output   * @throws Exception 	if an error occurs   * @throws IllegalStateException 	if no input structure has been defined   */  public boolean batchFinished() throws Exception {    if (getInputFormat() == null)      throw new IllegalStateException("No input instance format defined");    if (m_MinArray == null) {      Instances input = getInputFormat();      // Compute minimums and maximums      m_MinArray = new double[input.numAttributes()];      m_MaxArray = new double[input.numAttributes()];      for (int i = 0; i < input.numAttributes(); i++)	m_MinArray[i] = Double.NaN;      for (int j = 0; j < input.numInstances(); j++) {	double[] value = input.instance(j).toDoubleArray();	for (int i = 0; i < input.numAttributes(); i++) {	  if (input.attribute(i).isNumeric() &&	      (input.classIndex() != i)) {	    if (!Instance.isMissingValue(value[i])) {

⌨️ 快捷键说明

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