sumconditionalobjectivefunction.java

来自「Standord Classifier实现了一个基于Java的最大熵分类器。用于」· Java 代码 · 共 66 行

JAVA
66
字号
package edu.stanford.nlp.classify;import java.util.*;import edu.stanford.nlp.optimization.*;/** @author Dan Klein */public class SumConditionalObjectiveFunction extends LogConditionalObjectiveFunction {  protected void calculate(double[] x) {    //System.out.println("Checking at: "+x[0]+" "+x[1]+" "+x[2]);    value = 0.0;    Arrays.fill(derivative, 0.0);    double[] sums = new double[numClasses];    double[] probs = new double[numClasses];    double[] counts = new double[numClasses];    Arrays.fill(counts, 0.0);    for (int d=0; d<data.length; d++) {      int[] features = data[d];      // activation      Arrays.fill(sums, 0.0);      for (int c=0; c<numClasses; c++) {	for (int f=0; f<features.length; f++) {	  int i = indexOf(features[f], c);	  sums[c] += x[i];	}      }      // expectation      double total = Double.NEGATIVE_INFINITY;      for (int c=0; c<numClasses; c++) {	total = addLPs(total, sums[c]);      }      int ld = labels[d];      for (int c=0; c<numClasses; c++) {	probs[c] = Math.exp(sums[c]-total);	for (int f=0; f<features.length; f++) {	  int i = indexOf(features[f], c);	  derivative[i] += probs[ld]*probs[c];	}      }      // observed      for (int f=0; f<features.length; f++) {	int i = indexOf(features[f], labels[d]);	derivative[i] -= probs[ld];      }      value -= probs[ld];    }    // priors    if (true) {      for (int i=0; i<x.length; i++) {	double k = 1.0;	double w = x[i];	value += k*w*w/2.0;	derivative[i] += k*w;      }    }  }  public SumConditionalObjectiveFunction(int numFeatures, int numClasses, int[][] data, int[] labels) {    super(numFeatures, numClasses, data, labels);  }}

⌨️ 快捷键说明

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