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

📄 flr.java

📁 代码是一个分类器的实现,其中使用了部分weka的源代码。可以将项目导入eclipse运行
💻 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. *//* *    FLR.java *    Copyright (C) 2002 Ioannis N. Athanasiadis * */package weka.classifiers.misc;import weka.classifiers.Classifier;import weka.core.AdditionalMeasureProducer;import weka.core.AttributeStats;import weka.core.Capabilities;import weka.core.Instance;import weka.core.Instances;import weka.core.Option;import weka.core.Summarizable;import weka.core.TechnicalInformation;import weka.core.TechnicalInformationHandler;import weka.core.Utils;import weka.core.Capabilities.Capability;import weka.core.TechnicalInformation.Field;import weka.core.TechnicalInformation.Type;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.Serializable;import java.util.Enumeration;import java.util.Vector;/** <!-- globalinfo-start --> * Fuzzy Lattice Reasoning Classifier (FLR) v5.0<br/> * <br/> * The Fuzzy Lattice Reasoning Classifier uses the notion of Fuzzy Lattices for creating a Reasoning Environment.<br/> * The current version can be used for classification using numeric predictors.<br/> * <br/> * For more information see:<br/> * <br/> * I. N. Athanasiadis, V. G. Kaburlasos, P. A. Mitkas, V. Petridis: Applying Machine Learning Techniques on Air Quality Data for Real-Time Decision Support. In: 1st Intl. NAISO Symposium on Information Technologies in Environmental Engineering (ITEE-2003), Gdansk, Poland, 2003.<br/> * <br/> * V. G. Kaburlasos, I. N. Athanasiadis, P. A. Mitkas, V. Petridis (2003). Fuzzy Lattice Reasoning (FLR) Classifier and its Application on Improved Estimation of Ambient Ozone Concentration. * <p/> <!-- globalinfo-end --> * <!-- technical-bibtex-start --> * BibTeX: * <pre> * &#64;inproceedings{Athanasiadis2003, *    address = {Gdansk, Poland}, *    author = {I. N. Athanasiadis and V. G. Kaburlasos and P. A. Mitkas and V. Petridis}, *    booktitle = {1st Intl. NAISO Symposium on Information Technologies in Environmental Engineering (ITEE-2003)}, *    note = {Abstract in ICSC-NAISO Academic Press, Canada (ISBN:3906454339), pg.51}, *    publisher = {ICSC-NAISO Academic Press}, *    title = {Applying Machine Learning Techniques on Air Quality Data for Real-Time Decision Support}, *    year = {2003} * } *  * &#64;unpublished{Kaburlasos2003, *    author = {V. G. Kaburlasos and I. N. Athanasiadis and P. A. Mitkas and V. Petridis}, *    title = {Fuzzy Lattice Reasoning (FLR) Classifier and its Application on Improved Estimation of Ambient Ozone Concentration}, *    year = {2003} * } * </pre> * <p/> <!-- technical-bibtex-end --> * <!-- options-start --> * Valid options are: <p/> *  * <pre> -R *  Set vigilance parameter rhoa. *  (a float in range [0,1])</pre> *  * <pre> -B *  Set boundaries File *  Note:  The boundaries file is a simple text file containing  *  a row with a Fuzzy Lattice defining the metric space. *  For example, the boundaries file could contain the following  *  the metric space for the iris dataset: *  [ 4.3  7.9 ]  [ 2.0  4.4 ]  [ 1.0  6.9 ]  [ 0.1  2.5 ]  in Class:  -1 *  This lattice just contains the min and max value in each  *  dimension. *  In other kind of problems this may not be just a min-max  *  operation, but it could contain limits defined by the problem  *  itself. *  Thus, this option should be set by the user. *  If ommited, the metric space used contains the mins and maxs  *  of the training split.</pre> *  * <pre> -Y *  Show Rules</pre> *  <!-- options-end --> *  * For further information contact I.N.Athanasiadis (ionathan@iti.gr) * * @author Ioannis N. Athanasiadis (email: ionathan@iti.gr, alias: ionathan@ieee.org) * @version 5.0 * @version $Revision: 1.9 $ */public class FLR    extends Classifier    implements Serializable, Summarizable, AdditionalMeasureProducer,               TechnicalInformationHandler {  /** for serialization */  static final long serialVersionUID = 3337906540579569626L;    public static final float EPSILON = 0.000001f;    /** the RuleSet: a vector keeping the learned Fuzzy Lattices */  private Vector learnedCode;   /** a double keeping the vignilance parameter rhoa */  private double m_Rhoa = 0.5;   /** a Fuzzy Lattice keeping the metric space */  private FuzzyLattice bounds;   /** a File pointing to the boundaries file (bounds.txt) */  private File m_BoundsFile = new File("");   /** a flag indicating whether the RuleSet will be displayed */  private boolean m_showRules = true;   /** an index of the RuleSet (keeps how many rules are needed for each class) */  private int index[];   /** an array of the names of the classes */  private String classNames[];   /**   * Returns default capabilities of the classifier.   *   * @return      the capabilities of this classifier   */  public Capabilities getCapabilities() {    Capabilities result = super.getCapabilities();    // attributes    result.enable(Capability.NUMERIC_ATTRIBUTES);    result.enable(Capability.DATE_ATTRIBUTES);    result.enable(Capability.MISSING_VALUES);    // class    result.enable(Capability.NOMINAL_CLASS);    result.enable(Capability.MISSING_CLASS_VALUES);        return result;  }  /**   * Builds the FLR Classifier   *   * @param data the training dataset (Instances)       * @throws Exception if the training dataset is not supported or is erroneous   */  public void buildClassifier(Instances data) throws Exception {    // can classifier handle the data?    getCapabilities().testWithFail(data);    // remove instances with missing class    data = new Instances(data);    data.deleteWithMissingClass();    // Exceptions statements    for (int i = 0; i < data.numAttributes(); i++) {      if (i != data.classIndex()) {        AttributeStats stats = data.attributeStats(i);        if(data.numInstances()==stats.missingCount ||           Double.isNaN(stats.numericStats.min) ||           Double.isInfinite(stats.numericStats.min))          throw new Exception("All values are missing!" +              data.attribute(i).toString());      } //fi    } //for    if (!m_BoundsFile.canRead()) {      setBounds(data);    }    else      try {        BufferedReader in = new BufferedReader(new FileReader(m_BoundsFile));        String line = in.readLine();        bounds = new FuzzyLattice(line);      }      catch (Exception e) {        throw new Exception("Boundaries File structure error");      }    if (bounds.length() != data.numAttributes() - 1) {      throw new Exception("Incompatible bounds file!");    }    checkBounds();    // Variable Declerations and Initialization    index = new int[data.numClasses()];    classNames = new String[data.numClasses()];    for (int i = 0; i < data.numClasses(); i++) {      index[i] = 0;      classNames[i] = "missing Class Name";    }    double rhoa = m_Rhoa;    learnedCode = new Vector();    int searching;    FuzzyLattice inputBuffer;    // Build Classifier (Training phase)    if (data.firstInstance().classIsMissing())      throw new Exception("In first instance, class is missing!");    // set the first instance to be the first Rule in the model    FuzzyLattice Code = new FuzzyLattice(data.firstInstance(), bounds);    learnedCode.addElement(Code);    index[Code.getCateg()]++;    classNames[Code.getCateg()] = data.firstInstance().stringValue(data.        firstInstance().classIndex());    // training iteration    for (int i = 1; i < data.numInstances(); i++) { //for all instances      Instance inst = data.instance(i);      int flag =0;      for(int w=0;w<inst.numAttributes()-1;w++){        if(w!=inst.classIndex() && inst.isMissing(w))          flag=flag+1;      }      if (!inst.classIsMissing()&&flag!=inst.numAttributes()-1) {        inputBuffer = new FuzzyLattice( (Instance) data.instance(i), bounds);        double[] sigma = new double[ (learnedCode.size())];        for (int j = 0; j < learnedCode.size(); j++) {          FuzzyLattice num = (FuzzyLattice) learnedCode.get(j);          FuzzyLattice den = inputBuffer.join(num);          double numden = num.valuation(bounds) / den.valuation(bounds);          sigma[j] = numden;        } //for int j        do {          int winner = 0;          double winnerf = sigma[0];          for (int j = 1; j < learnedCode.size(); j++) {            if (winnerf < sigma[j]) {              winner = j;              winnerf = sigma[j];            } //if          } //for          FuzzyLattice num = inputBuffer;          FuzzyLattice winnerBox = (FuzzyLattice) learnedCode.get(winner);          FuzzyLattice den = winnerBox.join(num);          double numden = num.valuation(bounds) / den.valuation(bounds);          if ( (inputBuffer.getCateg() == winnerBox.getCateg()) &&              (rhoa < (numden))) {            learnedCode.setElementAt(winnerBox.join(inputBuffer), winner);            searching = 0;          }          else {            sigma[winner] = 0;            rhoa += EPSILON;            searching = 0;            for (int j = 0; j < learnedCode.size(); j++) {              if (sigma[j] != 0.0) {                searching = 1;              } //fi            } //for            if (searching == 0) {              learnedCode.addElement(inputBuffer);              index[inputBuffer.getCateg()]++;              classNames[inputBuffer.getCateg()] = data.instance(i).stringValue(                  data.instance(i).classIndex());            } //fi          } //else        }        while (searching == 1);      } //if Class is missing    } //for all instances  } //buildClassifier  /**   * Classifies a given instance using the FLR Classifier model   *   * @param instance the instance to be classified   * @return the class index into which the instance is classfied   */  public double classifyInstance(Instance instance) {    FuzzyLattice num, den, inputBuffer;    inputBuffer = new FuzzyLattice(instance, bounds); // transform instance to fuzzy lattice    // calculate excitations and winner    double[] sigma = new double[ (learnedCode.size())];    for (int j = 0; j < learnedCode.size(); j++) {      num = (FuzzyLattice) learnedCode.get(j);      den = inputBuffer.join(num);      sigma[j] = (num.valuation(bounds) / den.valuation(bounds));    } //for j    //find the winner Code (hyperbox)    int winner = 0;    double winnerf = sigma[0];    for (int j = 1; j < learnedCode.size(); j++) {      if (winnerf < sigma[j]) {        winner = j;        winnerf = sigma[j];      } //fi    } //for j    FuzzyLattice currentBox = (FuzzyLattice) learnedCode.get(winner);    return (double) currentBox.getCateg();  } //classifyInstance  /**   * Returns a description of the classifier.   *   * @return String describing the FLR model   */  public String toString() {    if (learnedCode != null) {      String output = "";      output = "FLR classifier\n=======================\n Rhoa = " + m_Rhoa;      if (m_showRules) {        output = output + "\n Extracted Rules (Fuzzy Lattices):\n\n";        output = output + showRules();        output = output + "\n\n Metric Space:\n" + bounds.toString();      }      output = output + "\n Total Number of Rules:    " + learnedCode.size() +          "\n";      for (int i = 0; i < index.length; i++) {        output = output + " Rules pointing in Class " + classNames[i] + " :" +            index[i] + "\n";      }      return output;    }    else {      String output = "FLR classifier\n=======================\n Rhoa = " +          m_Rhoa;      output = output + "No model built";      return output;    }  } //toString  /**   * Returns a superconcise version of the model   *   * @return String descibing the FLR model very shortly   */  public String toSummaryString() {    String output = "";    if (learnedCode == null) {      output += "No model built";    }    else {      output = output + "Total Number of Rules: " + learnedCode.size();    }    return output;  } //toSummaryString  /**   * Returns the induced set of Fuzzy Lattice Rules   *   * @return String containing the ruleset   *   */  public String showRules() {    String output = "";    for (int i = 0; i < learnedCode.size(); i++) {      FuzzyLattice Code = (FuzzyLattice) learnedCode.get(i);      output = output + "Rule: " + i + " " + Code.toString();    }    return output;  } //showRules  /**   * Returns an enumeration describing the available options. <p/>   *   <!-- options-start -->   * Valid options are: <p/>   *    * <pre> -R   *  Set vigilance parameter rhoa.   *  (a float in range [0,1])</pre>   *    * <pre> -B   *  Set boundaries File   *  Note:  The boundaries file is a simple text file containing    *  a row with a Fuzzy Lattice defining the metric space.   *  For example, the boundaries file could contain the following    *  the metric space for the iris dataset:   *  [ 4.3  7.9 ]  [ 2.0  4.4 ]  [ 1.0  6.9 ]  [ 0.1  2.5 ]  in Class:  -1   *  This lattice just contains the min and max value in each    *  dimension.   *  In other kind of problems this may not be just a min-max    *  operation, but it could contain limits defined by the problem    *  itself.   *  Thus, this option should be set by the user.   *  If ommited, the metric space used contains the mins and maxs    *  of the training split.</pre>   *    * <pre> -Y   *  Show Rules</pre>   *    <!-- options-end -->   *   * @return enumeration an enumeration of valid options   */  public Enumeration listOptions() {    Vector newVector = new Vector(3);    newVector.addElement(new Option(	"\tSet vigilance parameter rhoa.\n"	+ "\t(a float in range [0,1])", 	"R", 1, "-R"));        newVector.addElement(new Option(	"\tSet boundaries File\n"	+ "\tNote:  The boundaries file is a simple text file containing \n"	+ "\ta row with a Fuzzy Lattice defining the metric space.\n"	+ "\tFor example, the boundaries file could contain the following \n"	+ "\tthe metric space for the iris dataset:\n"	+ "\t[ 4.3  7.9 ]  [ 2.0  4.4 ]  [ 1.0  6.9 ]  [ 0.1  2.5 ]  in Class:  -1\n"	+ "\tThis lattice just contains the min and max value in each \n"	+ "\tdimension.\n"	+ "\tIn other kind of problems this may not be just a min-max \n"	+ "\toperation, but it could contain limits defined by the problem \n"	+ "\titself.\n"	+ "\tThus, this option should be set by the user.\n"	+ "\tIf ommited, the metric space used contains the mins and maxs \n"	+ "\tof the training split.", 	"B", 1, "-B"));    newVector.addElement(new Option(	"\tShow Rules", 	"Y", 0, "-Y"));        return newVector.elements();  } //listOptions  /**   * Parses a given list of options. <p/>   *    <!-- options-start -->   * Valid options are: <p/>   *    * <pre> -R   *  Set vigilance parameter rhoa.   *  (a float in range [0,1])</pre>   *    * <pre> -B   *  Set boundaries File   *  Note:  The boundaries file is a simple text file containing    *  a row with a Fuzzy Lattice defining the metric space.   *  For example, the boundaries file could contain the following 

⌨️ 快捷键说明

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