📄 flr.java
字号:
/* * 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> * @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} * } * * @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 + -