Translate

пятница, 5 декабря 2014 г.

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


Данное ядерное преобразование практически ничего не делает, если не считать, что добавляет пороговое значение. Все остальные данные попросту передаются на входы искусственного нейрона без изменений.


Такое ядро необходимо когда у в выборке имеется большое количество объясняющих переменных, которые проблематично преобразовать с помощью нелинейных ядерных преобразований, т. к. может не хватить памяти компьютера. В этом случае, после автоматического понижения размерности входов, можно будет узнать, какие объясняющие переменные являются значимыми. Впрочем, если применять нелинейные ядерные преобразования, то значимость тех или иных предикторов может кардинально измениться за счёт того, что степени свободы для поиска минимакса эмпирического риска значительно возрастут.

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

/**
 * 
 */
package libvmr;

/**
 * Простое ядерное преобразование
 * @author Yury V. Reshetov
 * @version 1.0
 */
public class SimpleKernelTrick implements KernelTrick {
 
 private String[] variables = null;
 
 /**
  * Возвращает идентификаторы используемых переменных
  * @return идентификаторы переменных
  */
 public String[] getVariables() {
  return this.variables;
 }
 
 /**
  * Преобразовать двумерный массив данных
  * @return преобразованный массив
  */
    public double[][] getTransformData(double[][] samples, double[] results) {
     this.variables = new String[samples[0].length + 1];
     variables[0] = "";
     for (int i = 0; i < samples[0].length; i++) {
      this.variables[i + 1] = " * x" + i;
     }
     double result[][] = new double[samples.length][samples[0].length + 1];
     for (int i = 0; i < samples.length; i++) {
      result[i][0] = 1d;
      for (int j = 0; j < samples[0].length; j++) {
       result[i][j + 1] = samples[i][j];
      }
     }
     return result;
    }

 /**
  * Преобразовать одномерный массив
  * @return одномерный массив
  */
    public double[] getTransformData(double[] sample) {
     
     double result[] = new double[sample.length + 1];
     for (int i = 0; i < sample.length; i++) {
      result[0] = 1d;
      for (int j = 0; j < sample.length; j++) {
       result[j + 1] = sample[j];
      }
     }
     return result;     
    }

}

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

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