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

📄 utils.java

📁 wekaUT是 university texas austin 开发的基于weka的半指导学习(semi supervised learning)的分类器
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
   * Converts an array containing the natural logarithms of   * probabilities stored in a vector back into probabilities.   * The probabilities are assumed to sum to one.   *   * @param a an array holding the natural logarithms of the probabilities   * @return the converted array    */  static public double[] logs2probs(double[] a) {    double max = a[maxIndex(a)];    double sum = 0.0;    for(int i = 0; i < a.length; i++) {      a[i] = Math.exp(a[i] - max);      sum += a[i];    }    normalize(a, sum);    return a;  }   /**   * Rounds a double to the next nearest integer value. The JDK version   * of it doesn't work properly.   *   * @param value the double value   * @return the resulting integer value   */  public static int round(double value) {    int roundedValue = value > 0      ? (int)(value + 0.5)      : -(int)(Math.abs(value) + 0.5);        return roundedValue;  }  /**   * Rounds a double to the given number of decimal places.   *   * @param value the double value   * @param afterDecimalPoint the number of digits after the decimal point   * @return the double rounded to the given precision   */  public static double roundDouble(double value,int afterDecimalPoint) {    double mask = Math.pow(10.0, (double)afterDecimalPoint);    return (double)(Math.round(value * mask)) / mask;  }  /**   * Sorts a given array of integers in ascending order and returns an    * array of integers with the positions of the elements of the original    * array in the sorted array. The sort is stable. (Equal elements remain   * in their original order.)   *   * @param array this array is not changed by the method!   * @return an array of integers with the positions in the sorted   * array.   */  public static int[] sort(int [] array) {    int [] index = new int[array.length];    int [] newIndex = new int[array.length];    int [] helpIndex;    int numEqual;        for (int i = 0; i < index.length; i++) {      index[i] = i;    }    quickSort(array, index, 0, array.length - 1);    // Make sort stable    int i = 0;    while (i < index.length) {      numEqual = 1;      for (int j = i + 1; ((j < index.length)			   && (array[index[i]] == array[index[j]]));	   j++) {	numEqual++;      }      if (numEqual > 1) {	helpIndex = new int[numEqual];	for (int j = 0; j < numEqual; j++) {	  helpIndex[j] = i + j;	}	quickSort(index, helpIndex, 0, numEqual - 1);	for (int j = 0; j < numEqual; j++) {	  newIndex[i + j] = index[helpIndex[j]];	}	i += numEqual;      } else {	newIndex[i] = index[i];	i++;      }    }    return newIndex;  }  /**   * Sorts a given array of doubles in ascending order and returns an   * array of integers with the positions of the elements of the   * original array in the sorted array. NOTE THESE CHANGES: the sort   * is no longer stable and it doesn't use safe floating-point   * comparisons anymore. Occurrences of Double.NaN are treated as    * Double.MAX_VALUE   *   * @param array this array is not changed by the method!   * @return an array of integers with the positions in the sorted   * array.     */  public static int[] sort(double [] array) {    int [] index = new int[array.length];    array = (double [])array.clone();    for (int i = 0; i < index.length; i++) {      index[i] = i;      if (Double.isNaN(array[i])) {        array[i] = Double.MAX_VALUE;      }    }    quickSort(array, index, 0, array.length - 1);    return index;  }  /**   * Sorts a given array of doubles in ascending order and returns an    * array of integers with the positions of the elements of the original    * array in the sorted array. The sort is stable (Equal elements remain   * in their original order.) Occurrences of Double.NaN are treated as    * Double.MAX_VALUE   *   * @param array this array is not changed by the method!   * @return an array of integers with the positions in the sorted   * array.   */  public static int[] stableSort(double [] array){    int [] index = new int[array.length];    int [] newIndex = new int[array.length];    int [] helpIndex;    int numEqual;        array = (double [])array.clone();    for (int i = 0; i < index.length; i++) {      index[i] = i;      if (Double.isNaN(array[i])) {        array[i] = Double.MAX_VALUE;      }    }    quickSort(array,index,0,array.length-1);    // Make sort stable    int i = 0;    while (i < index.length) {      numEqual = 1;      for (int j = i+1; ((j < index.length) && Utils.eq(array[index[i]],							array[index[j]])); j++)	numEqual++;      if (numEqual > 1) {	helpIndex = new int[numEqual];	for (int j = 0; j < numEqual; j++)	  helpIndex[j] = i+j;	quickSort(index, helpIndex, 0, numEqual-1);	for (int j = 0; j < numEqual; j++) 	  newIndex[i+j] = index[helpIndex[j]];	i += numEqual;      } else {	newIndex[i] = index[i];	i++;      }    }    return newIndex;  }  /**   * Computes the variance for an array of doubles.   *   * @param vector the array   * @return the variance   */  public static double variance(double[] vector) {      double sum = 0, sumSquared = 0;    if (vector.length <= 1) {      return 0;    }    for (int i = 0; i < vector.length; i++) {      sum += vector[i];      sumSquared += (vector[i] * vector[i]);    }    double result = (sumSquared - (sum * sum / (double) vector.length)) /       (double) (vector.length - 1);    // We don't like negative variance    if (result < 0) {      return 0;    } else {      return result;    }  }  /**   * Computes the sum of the elements of an array of doubles.   *   * @param doubles the array of double   * @return the sum of the elements   */  public static double sum(double[] doubles) {    double sum = 0;    for (int i = 0; i < doubles.length; i++) {      sum += doubles[i];    }    return sum;  }  /**   * Computes the sum of the elements of an array of integers.   *   * @param ints the array of integers   * @return the sum of the elements   */  public static int sum(int[] ints) {    int sum = 0;    for (int i = 0; i < ints.length; i++) {      sum += ints[i];    }    return sum;  }  /**   * Returns c*log2(c) for a given integer value c.   *   * @param c an integer value   * @return c*log2(c) (but is careful to return 0 if c is 0)   */  public static double xlogx(int c) {        if (c == 0) {      return 0.0;    }    return c * Utils.log2((double) c);  }  /**   * Implements quicksort for an array of indices.   *   * @param array the array of integers to be sorted   * @param index the index which should contain the positions in the   * sorted array   * @param lo0 the first index of the subset to be sorted   * @param hi0 the last index of the subset to be sorted   */  private static void quickSort(int [] array, int [] index,				int lo0, int hi0) {    int lo = lo0;    int hi = hi0;    int mid;    int help;        if (hi0 > lo0) {            // Arbitrarily establishing partition element as the midpoint of      // the array.      mid = array[index[(lo0 + hi0) / 2]];      // loop through the array until indices cross      while (lo <= hi) {		// find the first element that is greater than or equal to  	// the partition element starting from the left Index.	while ((array[index[lo]] < mid) && (lo < hi0)) {	  ++lo;	}		// find an element that is smaller than or equal to 	// the partition element starting from the right Index.	while ((array[index[hi]] > mid) && (hi > lo0)) {	  --hi;	}		// if the indexes have not crossed, swap	if (lo <= hi) {	  help = index[lo];	  index[lo] = index[hi];	  index[hi] = help;	  ++lo;	  --hi;	}      }            // If the right index has not reached the left side of array      // must now sort the left partition.      if (lo0 < hi) {	quickSort(array, index, lo0, hi);      }            // If the left index has not reached the right side of array      // must now sort the right partition.      if (lo < hi0) {	quickSort(array, index, lo, hi0);      }    }  }  /**   * Implements unsafe quicksort for an array of indices.   *   * @param array the array of doubles to be sorted   * @param index the index which should contain the positions in the   * sorted array   * @param lo0 the first index of the subset to be sorted   * @param hi0 the last index of the subset to be sorted   */  private static void quickSort(double [] array, int [] index, int lo0, int hi0) {    int lo = lo0;    int hi = hi0;    double mid;    int help;        if (hi0 > lo0) {            // Arbitrarily establishing partition element as the midpoint of      // the array.      mid = array[index[(lo0 + hi0) / 2]];      // loop through the array until indices cross      while (lo <= hi) {		// find the first element that is greater than or equal to  	// the partition element starting from the left Index.	while ((array[index[lo]] < mid) && (lo < hi0)) {	  ++lo;	}		// find an element that is smaller than or equal to 	// the partition element starting from the right Index.	while ((array[index[hi]] > mid) && (hi > lo0)) {	  --hi;	}		// if the indexes have not crossed, swap	if (lo <= hi) {	  help = index[lo];	  index[lo] = index[hi];	  index[hi] = help;	  ++lo;	  --hi;	}      }            // If the right index has not reached the left side of array      // must now sort the left partition.      if (lo0 < hi) {	quickSort(array, index, lo0, hi);      }            // If the left index has not reached the right side of array      // must now sort the right partition.      if (lo < hi0) {	quickSort(array, index, lo, hi0);      }    }  }  /**   * Main method for testing this class.   *   * @param ops some dummy options   */  public static void main(String[] ops) {    double[] doubles = {4.5, 6.7, Double.NaN, 3.4, 4.8, 1.2, 3.4};    int[] ints = {12, 6, 2, 18, 16, 6, 7, 5};    try {      // Option handling      System.out.println("First option split up:");      if (ops.length > 0) {	String[] firstOptionSplitUp = Utils.splitOptions(ops[0]);	for (int i = 0; i < firstOptionSplitUp.length; i ++) {	  System.out.println(firstOptionSplitUp[i]);	}      }					             System.out.println("Partitioned options: ");      String[] partitionedOptions = Utils.partitionOptions(ops);      for (int i  = 0; i < partitionedOptions.length; i++) {	System.out.println(partitionedOptions[i]);      }      System.out.println("Get flag -f: " + Utils.getFlag('f', ops));      System.out.println("Get option -o: " + Utils.getOption('o', ops));      System.out.println("Checking for remaining options... ");      Utils.checkForRemainingOptions(ops);            // Statistics      System.out.println("Original array (doubles): ");      for (int i = 0; i < doubles.length; i++) {	System.out.print(doubles[i] + " ");      }      System.out.println();      System.out.println("Original array (ints): ");      for (int i = 0; i < ints.length; i++) {	System.out.print(ints[i] + " ");      }      System.out.println();      System.out.println("Correlation: " + Utils.correlation(doubles, doubles, 							     doubles.length));      System.out.println("Mean: " + Utils.mean(doubles));      System.out.println("Variance: " + Utils.variance(doubles));      System.out.println("Sum (doubles): " + Utils.sum(doubles));      System.out.println("Sum (ints): " + Utils.sum(ints));      System.out.println("Max index (doubles): " + Utils.maxIndex(doubles));      System.out.println("Max index (ints): " + Utils.maxIndex(ints));      System.out.println("Min index (doubles): " + Utils.minIndex(doubles));      System.out.println("Min index (ints): " + Utils.minIndex(ints));            // Sorting and normalizing      System.out.println("Sorted array (doubles): ");      int[] sorted = Utils.sort(doubles);      for (int i = 0; i < doubles.length; i++) {	System.out.print(doubles[sorted[i]] + " ");      }      System.out.println();      System.out.println("Normalized array (doubles): ");      Utils.normalize(doubles);      for (int i = 0; i < doubles.length; i++) {	System.out.print(doubles[i] + " ");      }      System.out.println();      System.out.println("Normalized again (doubles): ");      Utils.normalize(doubles, Utils.sum(doubles));      for (int i = 0; i < doubles.length; i++) {	System.out.print(doubles[i] + " ");      }      System.out.println();            // Pretty-printing      System.out.println("-4.58: " + Utils.doubleToString(-4.57826535, 2));      System.out.println("-6.78: " + Utils.doubleToString(-6.78214234, 6,2));            // Comparisons      System.out.println("5.70001 == 5.7 ? " + Utils.eq(5.70001, 5.7));      System.out.println("5.70001 > 5.7 ? " + Utils.gr(5.70001, 5.7));      System.out.println("5.70001 >= 5.7 ? " + Utils.grOrEq(5.70001, 5.7));      System.out.println("5.7 < 5.70001 ? " + Utils.sm(5.7, 5.70001));      System.out.println("5.7 <= 5.70001 ? " + Utils.smOrEq(5.7, 5.70001));            // Math      System.out.println("Info (ints): " + Utils.info(ints));      System.out.println("log2(4.6): " + Utils.log2(4.6));      System.out.println("5 * log(5): " + Utils.xlogx(5));      System.out.println("5.5 rounded: " + Utils.round(5.5));      System.out.println("5.55555 rounded to 2 decimal places: " + 			 Utils.roundDouble(5.55555, 2));    } catch (Exception e) {      e.printStackTrace();    }  }}  

⌨️ 快捷键说明

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