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;
 }

}


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

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


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

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


Основное предназначение ядерных преобразований (kernel trick) в нейрокомпьютинге — это расширение количества входных данных искусственного нейрона за счет различных нелинейных функций от комбинаций входных данных.

Нормируем входные данные


Нормировка входных данных в нерокомпьютинге применяется давно. Основная её цель — это привести все разнородные (различные единицы измерений) входные сигналы к единому формату. Но если в отдельных случаях для обучения искусственного нейрона можно обойтись и без нормирования, то в случае VMR, этот фокус не пройдёт. Дело в том, что предварительное нормирование входных данных к диапазоно от -1 до 1 включительно является обязательной подготовкой к последующей инвариантности.

Создадим сепаратор

В прошлый раз мы создали парсер, который читает файлы в формате CSV и преобразует их в двумерные массивы данных.

Но сырые данные для машинного обучения необходимо предварительно разделить на две части:

  1. Обучающая выборка, на которой векторная машина - VMR будет создавать математическую модель бинарного классификатора
  2. Тестовая выборка, на которой будет проверяться полученная модель бинарного классификатора для проверки обобщающей способности машинного обучения

Создаём парсер

Поскольку для алгоритма машинного обучения необходимы данные, то эти данные нужно откуда-то загружать. Чаще всего для хранения и передачи данных используется наиболее распространенный формат файлов CSV. Данный формат был разработан вовсе не для машинного обучения, а для обмена данными между различными электронными таблицами. Но пригодился и в искусственном интеллекте, поскольку обучающие выборки также являются табличными данными. Более того, зачастую информацию, например, в научных исследованиях, сначала заносят в электронные таблицы, а потом уже с помощью машинного обучения пытаются найти закономерности.

среда, 19 ноября 2014 г.

Прогнозируем банкротства

Ещё одна задачка, решённая с помощью LibVMR

В репозитории uci.edu есть выборка для предсказания банкротств. См. http://archive.ics.uci.edu/ml/datasets/Qualitative_Bankruptcy

Авторы: Myoung-Jong Kim, Ingoo Han опубликовали статью под названием: «The discovery of experts decision rules from qualitative bankruptcy data using genetic algorithms».

См. http://koasas.kaist.ac.kr/handle/10203/3685

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

Однако, вынужден развеять сомнения авторов относительно нейросетевых способностей.