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

📄 gaussianprocesses.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. *//* *    LinearRegression.java *    Copyright (C) 1999 Eibe Frank,Len Trigg * */package weka.classifiers.functions;import weka.classifiers.Classifier;import weka.classifiers.Evaluation;import weka.classifiers.IntervalEstimator;import weka.classifiers.functions.supportVector.Kernel;import weka.classifiers.functions.supportVector.PolyKernel;import weka.classifiers.functions.supportVector.RBFKernel;import weka.core.Capabilities;import weka.core.Instance;import weka.core.Instances;import weka.core.Option;import weka.core.OptionHandler;import weka.core.SelectedTag;import weka.core.Statistics;import weka.core.Tag;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 weka.filters.Filter;import weka.filters.unsupervised.attribute.NominalToBinary;import weka.filters.unsupervised.attribute.Normalize;import weka.filters.unsupervised.attribute.ReplaceMissingValues;import weka.filters.unsupervised.attribute.Standardize;import java.util.Enumeration;import java.util.Vector;/** <!-- globalinfo-start --> * Implements Gaussian Processes for regression without hyperparameter-tuning. For more information see<br/> * <br/> * David J.C. Mackay (1998). Introduction to Gaussian Processes. Dept. of Physics, Cambridge University, UK. * <p/> <!-- globalinfo-end --> * <!-- technical-bibtex-start --> * BibTeX: * <pre> * &#64;misc{Mackay1998, *    address = {Dept. of Physics, Cambridge University, UK}, *    author = {David J.C. Mackay}, *    title = {Introduction to Gaussian Processes}, *    year = {1998}, *    PS = {http://wol.ra.phy.cam.ac.uk/mackay/gpB.ps.gz} * } * </pre> * <p/> <!-- technical-bibtex-end --> * <!-- options-start --> * Valid options are: <p/> *  * <pre> -D *  If set, classifier is run in debug mode and *  may output additional info to the console</pre> *  * <pre> -L &lt;double&gt; *  Level of Gaussian Noise. (default 0.1)</pre> *  * <pre> -N *  Whether to 0=normalize/1=standardize/2=neither. (default 0=normalize)</pre> *  * <pre> -K &lt;classname and parameters&gt; *  The Kernel to use. *  (default: weka.classifiers.functions.supportVector.PolyKernel)</pre> *  * <pre>  * Options specific to kernel weka.classifiers.functions.supportVector.RBFKernel: * </pre> *  * <pre> -D *  Enables debugging output (if available) to be printed. *  (default: off)</pre> *  * <pre> -no-checks *  Turns off all checks - use with caution! *  (default: checks on)</pre> *  * <pre> -C &lt;num&gt; *  The size of the cache (a prime number). *  (default: 250007)</pre> *  * <pre> -G &lt;num&gt; *  The Gamma parameter. *  (default: 0.01)</pre> *  <!-- options-end --> *  * @author Kurt Driessens (kurtd@cs.waikato.ac.nz) * @version $Revision: 1.4 $ */public class GaussianProcesses   extends Classifier   implements OptionHandler, IntervalEstimator, TechnicalInformationHandler {  /** for serialization */  static final long serialVersionUID = -8620066949967678545L;    /** The filter used to make attributes numeric. */  protected NominalToBinary m_NominalToBinary;    /** normalizes the data */  public static final int FILTER_NORMALIZE = 0;  /** standardizes the data */  public static final int FILTER_STANDARDIZE = 1;  /** no filter */  public static final int FILTER_NONE = 2;  /** The filter to apply to the training data */  public static final Tag [] TAGS_FILTER = {    new Tag(FILTER_NORMALIZE, "Normalize training data"),    new Tag(FILTER_STANDARDIZE, "Standardize training data"),    new Tag(FILTER_NONE, "No normalization/standardization"),  };      /** The filter used to standardize/normalize all values. */  protected Filter m_Filter = null;      /** Whether to normalize/standardize/neither */  protected int m_filterType = FILTER_NORMALIZE;    /** The filter used to get rid of missing values. */  protected ReplaceMissingValues m_Missing;      /** Turn off all checks and conversions? Turning them off assumes      that data is purely numeric, doesn't contain any missing values,      and has a numeric class. */  protected boolean m_checksTurnedOff = false;  /** Gaussian Noise Value. */  protected double m_delta = 1.0;  /** The class index from the training data */  protected int m_classIndex = -1;  /** The parameters of the linear transforamtion realized    * by the filter on the class attribute */  protected double m_Alin;  protected double m_Blin;  /** Kernel to use **/  protected Kernel m_kernel = null;  /** The training data. */  protected Instances m_data;      /** The training data. */  protected double m_avg_target;      /** The covariance matrix. */  protected weka.core.matrix.Matrix m_C;      /** The vector of target values. */  protected weka.core.matrix.Matrix m_t;    /** whether the kernel is a linear one */  protected boolean m_KernelIsLinear = false;  /**   * the default constructor   */  public GaussianProcesses() {    super();        m_kernel = new RBFKernel();    ((RBFKernel) m_kernel).setGamma(1.0);  }    /**   * Returns a string describing classifier   * @return a description suitable for   * displaying in the explorer/experimenter gui   */  public String globalInfo() {    return  "Implements Gaussian Processes for regression "	+ "without hyperparameter-tuning. "	+ "For more information see\n\n"	+ getTechnicalInformation().toString();  }  /**   * Returns an instance of a TechnicalInformation object, containing    * detailed information about the technical background of this class,   * e.g., paper reference or book this class is based on.   *    * @return the technical information about this class   */  public TechnicalInformation getTechnicalInformation() {    TechnicalInformation 	result;        result = new TechnicalInformation(Type.MISC);    result.setValue(Field.AUTHOR, "David J.C. Mackay");    result.setValue(Field.YEAR, "1998");    result.setValue(Field.TITLE, "Introduction to Gaussian Processes");    result.setValue(Field.ADDRESS, "Dept. of Physics, Cambridge University, UK");    result.setValue(Field.PS, "http://wol.ra.phy.cam.ac.uk/mackay/gpB.ps.gz");        return result;  }  /**   * Returns default capabilities of the classifier.   *   * @return      the capabilities of this classifier   */  public Capabilities getCapabilities() {    Capabilities result = getKernel().getCapabilities();    result.setOwner(this);    // attribute    result.enableAllAttributeDependencies();    // with NominalToBinary we can also handle nominal attributes, but only    // if the kernel can handle numeric attributes    if (result.handles(Capability.NUMERIC_ATTRIBUTES))      result.enable(Capability.NOMINAL_ATTRIBUTES);    result.enable(Capability.MISSING_VALUES);        // class    result.disableAllClasses();    result.disableAllClassDependencies();    result.enable(Capability.NUMERIC_CLASS);    result.enable(Capability.DATE_CLASS);    result.enable(Capability.MISSING_CLASS_VALUES);        return result;  }  /**   * Method for building the classifier.    *   * @param insts the set of training instances   * @throws Exception if the classifier can't be built successfully   */  public void buildClassifier(Instances insts) throws Exception {    /* check the set of training instances */    if (!m_checksTurnedOff) {      // can classifier handle the data?      getCapabilities().testWithFail(insts);      // remove instances with missing class      insts = new Instances(insts);      insts.deleteWithMissingClass();    }          if (!m_checksTurnedOff) {      m_Missing = new ReplaceMissingValues();      m_Missing.setInputFormat(insts);      insts = Filter.useFilter(insts, m_Missing);     } else {      m_Missing = null;    }    if (getCapabilities().handles(Capability.NUMERIC_ATTRIBUTES)) {      boolean onlyNumeric = true;      if (!m_checksTurnedOff) {	for (int i = 0; i < insts.numAttributes(); i++) {	  if (i != insts.classIndex()) {	    if (!insts.attribute(i).isNumeric()) {	      onlyNumeric = false;	      break;	    }	  }	}      }            if (!onlyNumeric) {	m_NominalToBinary = new NominalToBinary();	m_NominalToBinary.setInputFormat(insts);	insts = Filter.useFilter(insts, m_NominalToBinary);      } else {	m_NominalToBinary = null;      }    }    else {      m_NominalToBinary = null;    }    m_classIndex = insts.classIndex();    if (m_filterType == FILTER_STANDARDIZE) {      m_Filter = new Standardize();      //((Standardize)m_Filter).setIgnoreClass(true);      m_Filter.setInputFormat(insts);      insts = Filter.useFilter(insts, m_Filter);     } else if (m_filterType == FILTER_NORMALIZE) {      m_Filter = new Normalize();      //((Normalize)m_Filter).setIgnoreClass(true);      m_Filter.setInputFormat(insts);      insts = Filter.useFilter(insts, m_Filter);     } else {      m_Filter = null;    }    m_data = insts;    // determine which linear transformation has been     // applied to the class by the filter    if (m_Filter != null) {      Instance witness = (Instance)insts.instance(0).copy();      witness.setValue(m_classIndex, 0);      m_Filter.input(witness);      m_Filter.batchFinished();      Instance res = m_Filter.output();      m_Blin = res.value(m_classIndex);      witness.setValue(m_classIndex, 1);      m_Filter.input(witness);      m_Filter.batchFinished();      res = m_Filter.output();      m_Alin = res.value(m_classIndex) - m_Blin;    } else {      m_Alin = 1.0;      m_Blin = 0.0;    }    // Initialize kernel    m_kernel.buildKernel(m_data);    m_KernelIsLinear = (m_kernel instanceof PolyKernel) && (((PolyKernel) m_kernel).getExponent() == 1.0);    // Build Inverted Covariance Matrix    m_C = new weka.core.matrix.Matrix(m_data.numInstances(),m_data.numInstances());    double kv;    double sum = 0.0;    for (int i = 0; i < m_data.numInstances(); i++) {	sum += m_data.instance(i).classValue();      for (int j = 0; j < i; j++) {	kv = m_kernel.eval(i,j,m_data.instance(i));	m_C.set(i,j,kv);	m_C.set(j,i,kv);      }      kv = m_kernel.eval(i,i,m_data.instance(i));      m_C.set(i,i,kv+(m_delta*m_delta));    }    m_avg_target = sum/m_data.numInstances();    //weka.core.matrix.CholeskyDecomposition cd = new weka.core.matrix.CholeskyDecomposition(m_C);    //if (!cd.isSPD())    //throw new Exception("No semi-positive-definite kernel?!?");    weka.core.matrix.LUDecomposition lu = new weka.core.matrix.LUDecomposition(m_C);    if (!lu.isNonsingular())	throw new Exception("Singular Matrix?!?");    weka.core.matrix.Matrix iMat = weka.core.matrix.Matrix.identity(m_data.numInstances(),m_data.numInstances());    m_C = lu.solve(iMat);    m_t = new weka.core.matrix.Matrix(m_data.numInstances(),1);    for (int i = 0; i < m_data.numInstances(); i++) 	m_t.set(i,0,m_data.instance(i).classValue()-m_avg_target);    m_t = m_C.times(m_t);  }  /**   * Classifies a given instance.   *   * @param inst the instance to be classified   * @return the classification   * @throws Exception if instance could not be classified   * successfully   */  public double classifyInstance(Instance inst) throws Exception {    // Filter instance    if (!m_checksTurnedOff) {      m_Missing.input(inst);      m_Missing.batchFinished();      inst = m_Missing.output();    }    if (m_NominalToBinary != null) {      m_NominalToBinary.input(inst);      m_NominalToBinary.batchFinished();      inst = m_NominalToBinary.output();    }	    if (m_Filter != null) {

⌨️ 快捷键说明

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