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

📄 regoptimizer.java

📁 代码是一个分类器的实现,其中使用了部分weka的源代码。可以将项目导入eclipse运行
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
   */  protected void init(Instances data) throws Exception {    if (m_SVM == null) {      throw new Exception ("SVM not initialized in optimizer. Use RegOptimizer.setSVMReg()");    }    m_C = m_SVM.getC();    m_data = data;    m_classIndex = data.classIndex();    m_nInstances = data.numInstances();        // Initialize kernel    m_kernel = Kernel.makeCopy(m_SVM.getKernel());    m_kernel.buildKernel(data);        //init m_target    m_target = new double[m_nInstances];    for (int i = 0; i < m_nInstances; i++) {      m_target[i] = data.instance(i).classValue();    }        m_random = new Random(m_nSeed);        //		initialize alpha and alpha* array to all zero     m_alpha = new double[m_target.length];    m_alphaStar = new double[m_target.length];        m_supportVectors = new SMOset(m_nInstances);        m_b = 0.0;    m_nEvals = 0;    m_nCacheHits = -1;  }    /**    * wrap up various variables to save memeory and do some housekeeping after optimization   * has finished.   *   * @throws Exception	if something goes wrong   */  protected void wrapUp() throws Exception {    m_target = null;        m_nEvals = m_kernel.numEvals();    m_nCacheHits = m_kernel.numCacheHits();        if ((m_SVM.getKernel() instanceof PolyKernel) && ((PolyKernel) m_SVM.getKernel()).getExponent() == 1.0) {      // convert alpha's to weights      double [] weights = new double[m_data.numAttributes()];      for (int k = m_supportVectors.getNext(-1); k != -1; k = m_supportVectors.getNext(k)) {	for (int j = 0; j < weights.length; j++) {	  if (j != m_classIndex) {	    weights[j] += (m_alpha[k] - m_alphaStar[k]) * m_data.instance(k).value(j);	  }	}      }      m_weights = weights;            // release memory      m_alpha = null;      m_alphaStar = null;      m_kernel = null;          }    m_bModelBuilt = true;  }    /**   * Compute the value of the objective function.   *    * @return		the score   * @throws Exception	if something goes wrong   */  protected double getScore() throws Exception {    double res = 0;    double t = 0, t2 = 0;    double sumAlpha = 0.0;    for (int i = 0; i < m_nInstances; i++) {      sumAlpha += (m_alpha[i] - m_alphaStar[i]);      for (int j = 0; j < m_nInstances; j++) {	t += (m_alpha[i] - m_alphaStar[i]) * (m_alpha[j] - m_alphaStar[j]) * m_kernel.eval(i, j, m_data.instance(i));      }//    switch(m_nLossType) {//    case L1://    t2 += m_data.instance(i).classValue() * (m_alpha[i] - m_alpha_[i]);//    break;//    case L2://    t2 += m_data.instance(i).classValue() * (m_alpha[i] - m_alpha_[i]) - (0.5/m_SVM.getC()) * (m_alpha[i]*m_alpha[i] + m_alpha_[i]*m_alpha_[i]);//    break;//    case HUBER://    t2 += m_data.instance(i).classValue() * (m_alpha[i] - m_alpha_[i]) - (0.5*m_SVM.getEpsilon()/m_SVM.getC()) * (m_alpha[i]*m_alpha[i] + m_alpha_[i]*m_alpha_[i]);//    break;//    case EPSILON:      //t2 += m_data.instance(i).classValue() * (m_alpha[i] - m_alphaStar[i]) - m_epsilon * (m_alpha[i] + m_alphaStar[i]);      t2 += m_target[i] * (m_alpha[i] - m_alphaStar[i]) - m_epsilon * (m_alpha[i] + m_alphaStar[i]);//    break;//    }    }    res += -0.5 * t + t2;    return res;  }    /**    * learn SVM parameters from data.   * Subclasses should implement something more interesting.   *    * @param data	the data to work with   * @throws Exception	always an Exceoption since subclasses must override it   */  public void buildClassifier(Instances data) throws Exception {    throw new Exception("Don't call this directly, use subclass instead");  }    /**   * sets the loss type type to use   *    * @param newLossType	the loss type to use   */  //public void setLossType(SelectedTag newLossType) {  //  if (newLossType.getTags() == TAGS_LOSS_TYPE) {  //    m_nLossType = newLossType.getSelectedTag().getID();  //   }  //}     /**   * returns the current loss type   *    * @return		the loss type   */  //public SelectedTag getLossType() {  //  return new SelectedTag(m_nLossType, TAGS_LOSS_TYPE);  //}    /**    * SVMOutput of an instance in the training set, m_data   * This uses the cache, unlike SVMOutput(Instance)   *    * @param index 	index of the training instance in m_data   * @return		the SVM output   * @throws Exception	if something goes wrong   */  protected double SVMOutput(int index) throws Exception {    double result = -m_b;    for (int i = m_supportVectors.getNext(-1); i != -1; i = m_supportVectors.getNext(i)) {      result += (m_alpha[i] - m_alphaStar[i]) * m_kernel.eval(index, i, m_data.instance(index));    }    return result;  }    /**   *    * @param inst   * @return   * @throws Exception   */  public double SVMOutput(Instance inst) throws Exception {        double result = -m_b;    // Is the machine linear?    if (m_weights != null) {      // Is weight vector stored in sparse format?      for (int i = 0; i < m_weights.length; i++) {	if (inst.index(i) != m_classIndex) {	  result += m_weights[inst.index(i)] * inst.valueSparse(i);	}      }    } else {      for (int i = m_supportVectors.getNext(-1); i != -1; i = m_supportVectors.getNext(i)) {	result += (m_alpha[i] - m_alphaStar[i]) * m_kernel.eval(-1, i, inst);      }    }    return result;  }    /**   * Returns the tip text for this property   *    * @return 		tip text for this property suitable for   * 			displaying in the explorer/experimenter gui   */  public String seedTipText() {    return "Seed for random number generator.";  }    /**   * Gets the current seed value for the random number generator   *    * @return		the seed value   */  public int getSeed() {    return m_nSeed;  }    /**   * Sets the seed value for the random number generator   *    * @param value	the seed value   */  public void setSeed(int value) {    m_nSeed = value;  }    /**   * Returns the tip text for this property   *    * @return 		tip text for this property suitable for   * 			displaying in the explorer/experimenter gui   */  public String epsilonParameterTipText() {    return "The epsilon parameter of the epsilon insensitive loss function.(default 0.001).";  }    /**   * Get the value of epsilon parameter of the epsilon insensitive loss function.   *    * @return 		Value of epsilon parameter.   */  public double getEpsilonParameter() {    return m_epsilon;  }    /**   * Set the value of epsilon parameter of the epsilon insensitive loss function.   *    * @param v  		Value to assign to epsilon parameter.   */  public void setEpsilonParameter(double v) {    m_epsilon = v;  }    /**   * Prints out the classifier.   *   * @return 		a description of the classifier as a string   */  public String toString() {    StringBuffer text = new StringBuffer();    text.append("SVMreg\n\n");    if (m_weights != null) {      text.append("weights (not support vectors):\n");      // it's a linear machine      for (int i = 0; i < m_data.numAttributes(); i++) {	if (i != m_classIndex) {	  text.append((m_weights[i] >= 0 ? " + " : " - ") + Utils.doubleToString(Math.abs(m_weights[i]), 12, 4) + " * ");	  if (m_SVM.getFilterType().getSelectedTag().getID() == SVMreg.FILTER_STANDARDIZE) {	    text.append("(standardized) ");	  } else if (m_SVM.getFilterType().getSelectedTag().getID() == SVMreg.FILTER_NORMALIZE) {	    text.append("(normalized) ");	  }	  text.append(m_data.attribute(i).name() + "\n");	}      }    } else {      // non linear, print out all supportvectors      text.append("Support vectors:\n");      for (int i = 0; i < m_nInstances; i++) {	if (m_alpha[i] > 0) {	  text.append("+" + m_alpha[i] + " * k[" + i + "]\n");	}	if (m_alphaStar[i] > 0) {	  text.append("-" + m_alphaStar[i] + " * k[" + i + "]\n");	}      }    }        text.append((m_b<=0?" + ":" - ") + Utils.doubleToString(Math.abs(m_b), 12, 4) + "\n\n");        text.append("\n\nNumber of kernel evaluations: " + m_nEvals);    if (m_nCacheHits >= 0 && m_nEvals > 0) {      double hitRatio = 1 - m_nEvals * 1.0 / (m_nCacheHits + m_nEvals);      text.append(" (" + Utils.doubleToString(hitRatio * 100, 7, 3).trim() + "% cached)");    }        return text.toString();		  }}

⌨️ 快捷键说明

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