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

📄 attribute.java

📁 :<<数据挖掘--实用机器学习技术及java实现>>一书的配套源程序
💻 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. *//* *    Attribute.java *    Copyright (C) 1999 Eibe Frank * */package weka.core;import java.io.*;import java.util.*;/**  * Class for handling an attribute. Once an attribute has been created, * it can't be changed. <p> * * Three attribute types are supported: * <ul> *    <li> numeric: <ul> *         This type of attribute represents a floating-point number. *    </ul> *    <li> nominal: <ul> *         This type of attribute represents a fixed set of nominal values. *    </ul> *    <li> string: <ul> *         This type of attribute represents a dynamically expanding set of *         nominal values. String attributes are not used by the learning *         schemes in Weka. They can be used, for example,  to store an  *         identifier with each instance in a dataset. *    </ul> * </ul> * Typical usage (code from the main() method of this class): <p> * * <code> * ... <br> * * // Create numeric attributes "length" and "weight" <br> * Attribute length = new Attribute("length"); <br> * Attribute weight = new Attribute("weight"); <br><br> *  * // Create vector to hold nominal values "first", "second", "third" <br> * FastVector my_nominal_values = new FastVector(3); <br> * my_nominal_values.addElement("first"); <br> * my_nominal_values.addElement("second"); <br> * my_nominal_values.addElement("third"); <br><br> * * // Create nominal attribute "position" <br> * Attribute position = new Attribute("position", my_nominal_values);<br> * * ... <br> * </code><p> * * @author Eibe Frank (eibe@cs.waikato.ac.nz) * @version $Revision: 1.19.2.3 $ */public class Attribute implements Copyable, Serializable {  /** Constant set for numeric attributes. */  public final static int NUMERIC = 0;  /** Constant set for nominal attributes. */  public final static int NOMINAL = 1;  /** Constant set for attributes with string values. */  public final static int STRING = 2;  /** Strings longer than this will be stored compressed. */  private final static int STRING_COMPRESS_THRESHOLD = 200;  /** The attribute's name. */  private String m_Name;  /** The attribute's type. */  private int m_Type;  /** The attribute's values (if nominal or string). */  private FastVector m_Values;  /** Mapping of values to indices (if nominal or string). */  private Hashtable m_Hashtable;  /** The attribute's index. */  private int m_Index;  /**   * Constructor for a numeric attribute.   *   * @param attributeName the name for the attribute   */  public Attribute(String attributeName) {    m_Name = attributeName;    m_Index = -1;    m_Values = null;    m_Hashtable = null;    m_Type = NUMERIC;  }  /**   * Constructor for nominal attributes and string attributes.   * If a null vector of attribute values is passed to the method,   * the attribute is assumed to be a string.   *   * @param attributeName the name for the attribute   * @param attributeValues a vector of strings denoting the    * attribute values. Null if the attribute is a string attribute.   */  public Attribute(String attributeName, 		   FastVector attributeValues) {    m_Name = attributeName;    m_Index = -1;    if (attributeValues == null) {      m_Values = new FastVector();      m_Hashtable = new Hashtable();      m_Type = STRING;    } else {      m_Values = new FastVector(attributeValues.size());      m_Hashtable = new Hashtable(attributeValues.size());      for (int i = 0; i < attributeValues.size(); i++) {	Object store = attributeValues.elementAt(i);	if (((String)store).length() > STRING_COMPRESS_THRESHOLD) {	  try {	    store = new SerializedObject(attributeValues.elementAt(i), true);	  } catch (Exception ex) {	    System.err.println("Couldn't compress nominal attribute value -"			       + " storing uncompressed.");	  }	}	m_Values.addElement(store);	m_Hashtable.put(store, new Integer(i));      }      m_Type = NOMINAL;    }  }  /**   * Produces a shallow copy of this attribute.   *   * @return a copy of this attribute with the same index   */  public Object copy() {    Attribute copy = new Attribute(m_Name);    copy.m_Index = m_Index;    if (!isNominal() && !isString())      return copy;    copy.m_Type = m_Type;    copy.m_Values = m_Values;    copy.m_Hashtable = m_Hashtable;     return copy;  }  /**   * Returns an enumeration of all the attribute's values if   * the attribute is nominal or a string, null otherwise.    *   * @return enumeration of all the attribute's values   */  public final Enumeration enumerateValues() {    if (isNominal() || isString()) {      final Enumeration ee = m_Values.elements();      return new Enumeration () {          public boolean hasMoreElements() {            return ee.hasMoreElements();          }          public Object nextElement() {            Object oo = ee.nextElement();            if (oo instanceof SerializedObject) {              return ((SerializedObject)oo).getObject();            } else {              return oo;            }          }        };    }    return null;  }  /**   * Tests if given attribute is equal to this attribute.   *   * @param other the Object to be compared to this attribute   * @return true if the given attribute is equal to this attribute   */  public final boolean equals(Object other) {    if ((other == null) || !(other.getClass().equals(this.getClass()))) {      return false;    }    Attribute att = (Attribute) other;    if (!m_Name.equals(att.m_Name)) {      return false;    }    if (isNumeric() && att.isNumeric()) {      return true;    }    if (isNumeric() || att.isNumeric()) {      return false;    }    if (m_Values.size() != att.m_Values.size()) {      return false;    }    for (int i = 0; i < m_Values.size(); i++) {      if (!m_Values.elementAt(i).equals(att.m_Values.elementAt(i))) {	return false;      }    }    return true;  }  /**   * Returns the index of this attribute.   *   * @return the index of this attribute   */  public final int index() {    return m_Index;  }  /**   * Returns the index of a given attribute value. (The index of   * the first occurence of this value.)   *   * @param value the value for which the index is to be returned   * @return the index of the given attribute value if attribute   * is nominal or a string, -1 if it is numeric or the value    * can't be found   */  public final int indexOfValue(String value) {    if (!isNominal() && !isString())      return -1;    Object store = value;    if (value.length() > STRING_COMPRESS_THRESHOLD) {      try {        store = new SerializedObject(value, true);      } catch (Exception ex) {        System.err.println("Couldn't compress string attribute value -"                           + " searching uncompressed.");      }    }    Integer val = (Integer)m_Hashtable.get(store);    if (val == null) return -1;    else return val.intValue();  }  /**   * Test if the attribute is nominal.   *   * @return true if the attribute is nominal   */  public final boolean isNominal() {    return (m_Type == NOMINAL);  }  /**   * Tests if the attribute is numeric.   *   * @return true if the attribute is numeric   */  public final boolean isNumeric() {    return (m_Type == NUMERIC);  }  /**   * Tests if the attribute is a string.   *   * @return true if the attribute is a string   */  public final boolean isString() {    return (m_Type == STRING);  }  /**   * Returns the attribute's name.   *   * @return the attribute's name as a string   */  public final String name() {    return m_Name;  }    /**   * Returns the number of attribute values. Returns 0 for numeric attributes.   *   * @return the number of attribute values   */  public final int numValues() {    if (!isNominal() && !isString()) {      return 0;    } else {      return m_Values.size();    }  }  /**   * Returns a description of this attribute in ARFF format. Quotes   * strings if they contain whitespace characters, or if they   * are a question mark.   *   * @return a description of this attribute as a string   */  public final String toString() {        StringBuffer text = new StringBuffer();        text.append("@attribute " + Utils.quote(m_Name) + " ");    if (isNominal()) {      text.append('{');      Enumeration enum = enumerateValues();      while (enum.hasMoreElements()) {	text.append(Utils.quote((String) enum.nextElement()));	if (enum.hasMoreElements())	  text.append(',');      }      text.append('}');    } else {      if (isNumeric()) {	text.append("numeric");

⌨️ 快捷键说明

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