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

📄 bestfirst.java

📁 这是关于数据挖掘的一些算法
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
   * Returns a list of attributes (and or attribute ranges) as a String   * @return a list of attributes (and or attribute ranges)   */  public String getStartSet () {    return m_startRange.getRanges();  }  /**   * Returns the tip text for this property   * @return tip text for this property suitable for   * displaying in the explorer/experimenter gui   */  public String searchTerminationTipText() {    return "Set the amount of backtracking. Specify the number of ";  }  /**   * Set the numnber of non-improving nodes to consider before terminating   * search.   *   * @param t the number of non-improving nodes   * @throws Exception if t is less than 1   */  public void setSearchTermination (int t)    throws Exception {    if (t < 1) {      throw  new Exception("Value of -N must be > 0.");    }    m_maxStale = t;  }  /**   * Get the termination criterion (number of non-improving nodes).   *   * @return the number of non-improving nodes   */  public int getSearchTermination () {    return  m_maxStale;  }  /**   * Returns the tip text for this property   * @return tip text for this property suitable for   * displaying in the explorer/experimenter gui   */  public String directionTipText() {    return "Set the direction of the search.";  }  /**   * Set the search direction   *   * @param d the direction of the search   */  public void setDirection (SelectedTag d) {        if (d.getTags() == TAGS_SELECTION) {      m_searchDirection = d.getSelectedTag().getID();    }  }  /**   * Get the search direction   *   * @return the direction of the search   */  public SelectedTag getDirection () {    return new SelectedTag(m_searchDirection, TAGS_SELECTION);  }  /**   * Gets the current settings of BestFirst.   * @return an array of strings suitable for passing to setOptions()   */  public String[] getOptions () {    String[] options = new String[6];    int current = 0;    if (!(getStartSet().equals(""))) {      options[current++] = "-P";      options[current++] = ""+startSetToString();    }    options[current++] = "-D";    options[current++] = "" + m_searchDirection;    options[current++] = "-N";    options[current++] = "" + m_maxStale;    while (current < options.length) {      options[current++] = "";    }    return  options;  }  /**   * converts the array of starting attributes to a string. This is   * used by getOptions to return the actual attributes specified   * as the starting set. This is better than using m_startRanges.getRanges()   * as the same start set can be specified in different ways from the   * command line---eg 1,2,3 == 1-3. This is to ensure that stuff that   * is stored in a database is comparable.   * @return a comma seperated list of individual attribute numbers as a String   */  private String startSetToString() {    StringBuffer FString = new StringBuffer();    boolean didPrint;    if (m_starting == null) {      return getStartSet();    }    for (int i = 0; i < m_starting.length; i++) {      didPrint = false;            if ((m_hasClass == false) || 	  (m_hasClass == true && i != m_classIndex)) {	FString.append((m_starting[i] + 1));	didPrint = true;      }            if (i == (m_starting.length - 1)) {	FString.append("");      }      else {	if (didPrint) {	  FString.append(",");	  }      }    }    return FString.toString();  }  /**   * returns a description of the search as a String   * @return a description of the search   */  public String toString () {    StringBuffer BfString = new StringBuffer();    BfString.append("\tBest first.\n\tStart set: ");    if (m_starting == null) {      BfString.append("no attributes\n");    }    else {      BfString.append(startSetToString()+"\n");    }    BfString.append("\tSearch direction: ");    if (m_searchDirection == SELECTION_BACKWARD) {      BfString.append("backward\n");    }    else {if (m_searchDirection == SELECTION_FORWARD) {      BfString.append("forward\n");    }    else {      BfString.append("bi-directional\n");    }    }    BfString.append("\tStale search after " 		    + m_maxStale + " node expansions\n");    BfString.append("\tTotal number of subsets evaluated: " 		    + m_totalEvals + "\n");    BfString.append("\tMerit of best subset found: "		    +Utils.doubleToString(Math.abs(m_bestMerit),8,3)+"\n");    return  BfString.toString();  }  protected void printGroup (BitSet tt, int numAttribs) {    int i;    for (i = 0; i < numAttribs; i++) {      if (tt.get(i) == true) {	System.out.print((i + 1) + " ");      }    }    System.out.println();  }  /**   * Searches the attribute subset space by best first search   *   * @param ASEval the attribute evaluator to guide the search   * @param data the training instances.   * @return an array (not necessarily ordered) of selected attribute indexes   * @throws Exception if the search can't be completed   */  public int[] search (ASEvaluation ASEval, Instances data)    throws Exception {    m_totalEvals = 0;    if (!(ASEval instanceof SubsetEvaluator)) {      throw  new Exception(ASEval.getClass().getName() 			   + " is not a " 			   + "Subset evaluator!");    }    if (ASEval instanceof UnsupervisedSubsetEvaluator) {      m_hasClass = false;    } else {      m_hasClass = true;      m_classIndex = data.classIndex();    }    SubsetEvaluator ASEvaluator = (SubsetEvaluator)ASEval;    m_numAttribs = data.numAttributes();    int i, j;    int best_size = 0;    int size = 0;    int done;    int sd = m_searchDirection;    BitSet best_group, temp_group;    int stale;    double best_merit;    double merit;    boolean z;    boolean added;    Link2 tl;    Hashtable lookup = new Hashtable(m_cacheSize * m_numAttribs);    int insertCount = 0;    int cacheHits = 0;    LinkedList2 bfList = new LinkedList2(m_maxStale);    best_merit = -Double.MAX_VALUE;    stale = 0;    best_group = new BitSet(m_numAttribs);    m_startRange.setUpper(m_numAttribs-1);    if (!(getStartSet().equals(""))) {      m_starting = m_startRange.getSelection();    }    // If a starting subset has been supplied, then initialise the bitset    if (m_starting != null) {      for (i = 0; i < m_starting.length; i++) {	if ((m_starting[i]) != m_classIndex) {	  best_group.set(m_starting[i]);	}      }      best_size = m_starting.length;      m_totalEvals++;    } else {      if (m_searchDirection == SELECTION_BACKWARD) {	setStartSet("1-last");	m_starting = new int[m_numAttribs];	// init initial subset to all attributes	for (i = 0, j = 0; i < m_numAttribs; i++) {	  if (i != m_classIndex) {	    best_group.set(i);	    m_starting[j++] = i;	  }	}	best_size = m_numAttribs - 1;	m_totalEvals++;      }    }    // evaluate the initial subset    best_merit = ASEvaluator.evaluateSubset(best_group);    // add the initial group to the list and the hash table    Object [] best = new Object[1];    best[0] = best_group.clone();    bfList.addToList(best, best_merit);    BitSet tt = (BitSet)best_group.clone();    String hashC = tt.toString();    lookup.put(hashC, new Double(best_merit));    while (stale < m_maxStale) {      added = false;      if (m_searchDirection == SELECTION_BIDIRECTIONAL) {	// bi-directional search        done = 2;        sd = SELECTION_FORWARD;      } else {	done = 1;      }      // finished search?      if (bfList.size() == 0) {	stale = m_maxStale;	break;      }      // copy the attribute set at the head of the list      tl = bfList.getLinkAt(0);      temp_group = (BitSet)(tl.getData()[0]);      temp_group = (BitSet)temp_group.clone();      // remove the head of the list      bfList.removeLinkAt(0);      // count the number of bits set (attributes)      int kk;      for (kk = 0, size = 0; kk < m_numAttribs; kk++) {	if (temp_group.get(kk)) {	  size++;	}      }      do {	for (i = 0; i < m_numAttribs; i++) {	  if (sd == SELECTION_FORWARD) {	    z = ((i != m_classIndex) && (!temp_group.get(i)));	  } else {	    z = ((i != m_classIndex) && (temp_group.get(i)));	  }          	  if (z) {	    // set the bit (attribute to add/delete)	    if (sd == SELECTION_FORWARD) {	      temp_group.set(i);	      size++;	    } else {	      temp_group.clear(i);	      size--;	    }	    /* if this subset has been seen before, then it is already 	       in the list (or has been fully expanded) */	    tt = (BitSet)temp_group.clone();	    hashC = tt.toString();	    	    if (lookup.containsKey(hashC) == false) {	      merit = ASEvaluator.evaluateSubset(temp_group);	      m_totalEvals++;	      	      // insert this one in the hashtable	      if (insertCount > m_cacheSize * m_numAttribs) {		lookup = new Hashtable(m_cacheSize * m_numAttribs);		insertCount = 0;	      }	      hashC = tt.toString();    	      lookup.put(hashC, new Double(merit));    	      insertCount++;	    } else {	      merit = ((Double)lookup.get(hashC)).doubleValue();	      cacheHits++;  	    }	    	    // insert this one in the list	    Object[] add = new Object[1];	    add[0] = tt.clone();	    bfList.addToList(add, merit);	    	    if (m_debug) {	      System.out.print("Group: ");	      printGroup(tt, m_numAttribs);	      System.out.println("Merit: " + merit);	    }	    // is this better than the best?	    if (sd == SELECTION_FORWARD) {	      z = ((merit - best_merit) > 0.00001);	    } else {	      if (merit == best_merit) {		z = (size < best_size);	      } else {		z = (merit >  best_merit);	      } 	    }	    if (z) {	      added = true;	      stale = 0;	      best_merit = merit;	      //		best_size = (size + best_size);	      best_size = size;	      best_group = (BitSet)(temp_group.clone());	    }	    // unset this addition(deletion)	    if (sd == SELECTION_FORWARD) {	      temp_group.clear(i);	      size--;	    } else {	      temp_group.set(i);	      size++;	    }	  }	}	if (done == 2) {	  sd = SELECTION_BACKWARD;	}	done--;      } while (done > 0);      /* if we haven't added a new attribute subset then full expansion 	 of this node hasen't resulted in anything better */      if (!added) {	stale++;      }    }    m_bestMerit = best_merit;    return  attributeList(best_group);  }  /**   * Reset options to default values   */  protected void resetOptions () {    m_maxStale = 5;    m_searchDirection = SELECTION_FORWARD;    m_starting = null;    m_startRange = new Range();    m_classIndex = -1;    m_totalEvals = 0;    m_cacheSize = 1;    m_debug = false;  }  /**   * converts a BitSet into a list of attribute indexes    * @param group the BitSet to convert   * @return an array of attribute indexes   **/  protected int[] attributeList (BitSet group) {    int count = 0;    // count how many were selected    for (int i = 0; i < m_numAttribs; i++) {      if (group.get(i)) {	count++;      }    }    int[] list = new int[count];    count = 0;    for (int i = 0; i < m_numAttribs; i++) {      if (group.get(i)) {	list[count++] = i;      }    }    return  list;  }}

⌨️ 快捷键说明

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