Translate

суббота, 6 декабря 2014 г.

Парное ядерное преобразование


Парное ядерное преобразование расширяет простое ядерное преобразование добавляя произведения пар входных значений. Т.е. добавлены квадраты входных значений, а также различные попарные комбинации их произведений.

Код парного ядерного преобразования на Java:

package libvmr;

/**
 * Парное ядерное преобразование
 * @author Yury V. Reshetov
 * @version 1.0
 */

public class PairKernelTrick implements KernelTrick {


 private String[] variables = null;

 /**
  * Возвращает идентификаторы используемых переменных
  * 
  * @return идентификаторы переменных
  */
 public String[] getVariables() {
  return this.variables;
 }

 /**
  * Преобразовать двумерный массив данных
  * 
  * @return преобразованный массив
  */
 public double[][] getTransformData(double[][] samples, double[] results) {
  String[] tempvariables = new String[samples[0].length + 1];
  tempvariables[0] = "";
  for (int i = 0; i < samples[0].length; i++) {
   tempvariables[i + 1] = " * x" + i;
  }

  double tempresult[][] = new double[samples.length][samples[0].length + 1];
   for (int i = 0; i < samples.length; i++) {
    tempresult[i][0] = 1d;
    for (int j = 0; j < samples[0].length; j++) {
     tempresult[i][j + 1] = samples[i][j];
    }
   }

  this.variables = new String[(samples[0].length + 1) * (samples[0].length + 2) / 2];
  int n = 0;
  for (int i = 0; i < (samples[0].length + 1); i++) {
   for (int j = 0; j < (samples[0].length + 1); j++) {
    if (j >= i) {
     this.variables[n] = tempvariables[i] + tempvariables[j];
     n++;
    }
   }
  }

  double result[][] = new double[samples.length][this.variables.length];
  for (int k = 0; k < samples.length; k++) {
   n = 0;
   for (int i = 0; i < (samples[0].length + 1); i++) {
    for (int j = 0; j < (samples[0].length + 1); j++) {
     // Проверка наличия дубликатов
     if (j >= i) {
      result[k][n] = tempresult[k][i] * tempresult[k][j];
      n++;
     }
    }
   }
  }
  return result;
 }

 /**
  * Преобразовать одномерный массив
  * 
  * @return одномерный массив
  */
 public double[] getTransformData(double[] sample) {

  double tempresult[] = new double[sample.length + 1];
  for (int i = 0; i < sample.length; i++) {
   tempresult[0] = 1d;
   for (int j = 0; j < sample.length; j++) {
    tempresult[j + 1] = sample[j];
   }
  }
  double result[] = new double[(sample.length + 1) * (sample.length + 2) / 2];
  int n = 0;
  for (int i = 0; i < (sample.length + 1); i++) {
   for (int j = 0; j < (sample.length + 1); j++) {
    // Проверка наличия дубликатов
    if (j >= i) {
     result[n] = tempresult[i] * tempresult[j];
     n++;
    }
   }
  }
  return result;
 }

}


Комментариев нет:

Отправить комментарий