Нейронные сети. Вопросы экспертам. - страница 16

 
joo:

Но, видимо, lasso тренирует таким образом свою биологическую сеть для работы с искусственными.

Прикол :))) Блин Нш в этом плане так затягивает, порой оторваться крайне тяжело.....
 
lasso:

Здравствуйте.


Отмечу сразу классы сильно перемешаны, даже сильнее чем на рис.,


но все равно различимы.

Разделить удается даже не хитрыми линейными методами, но заставить НС выдавать лучший (или хотя бы сравнимый по качеству) результат у меня не получается.

Надеюсь на адекватные ответы и на то, что они пригодятся и остальным форумянам!

Некоторое время был лишен возможности общения с вами... Продолжим.

..............

Задача поставленная на стр.14 действительно нейросетью решается элементарно.

На скрине одна из возможных конфигураций. Колво нейронов в скрытом слое можно безболезненно уменьшить до 7, например.



И что удивило и порадовало, так это то - что НС находит свои решения в отличии от очевидных линейных методов (применительно к этой простой задаче),

и эти решения сначала вызывают недоумение, но после разностороннего анализа, выходит, что решения НС даже немного эффективнее линейных. O-o-o-o!

Идем дальше.... ;-)

 
lasso:

Задача поставленная на стр.14 действительно нейросетью решается элементарно.

На скрине одна из возможных конфигураций. Колво нейронов в скрытом слое можно безболезненно уменьшить до 7, например.



И что удивило и порадовало, так это то - что НС находит свои решения в отличии от очевидных линейных методов (применительно к этой простой задаче),

и эти решения сначала вызывают недоумение, но после разностороннего анализа, выходит, что решения НС даже немного эффективнее линейных. O-o-o-o!

Идем дальше.... ;-)


Это задача о пересечении стохастиков? Не понял что Вы хотели добиться решая эту задачу, очевидно что скудность описания ситуации не позволит НС решить эту задачу сколько нибудь "осмысленно". Такая сеть будет крайне неустойчива, и абсолютно бесполезна за пределами ОВ. Но да для учебной задачи сойдет конечно...

Куда идем дальше? Может поближе к нашим баранам? предсказанию временных рядов?

 
Figar0:

Это задача о пересечении стохастиков? Не понял что Вы хотели добиться решая эту задачу, очевидно что скудность описания ситуации не позволит НС решить эту задачу сколько нибудь "осмысленно". Такая сеть будет крайне неустойчива, и абсолютно бесполезна за пределами ОВ. Но да для учебной задачи сойдет конечно...

Куда идем дальше? Может поближе к нашим баранам? предсказанию временных рядов?

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

..................................

Итак, задача классификации в Статистика 6 -- решена.

Но это сторонняя программа, которая не имеет к трейдингу прямого отношения.

Да, она позволяет построит множество графиков, отчетов, сохранить найденую сеть в файл, сгенерировать код на С и на VB, и т.д. Здорово!

Но тут выявляется новая проблема!

А как все это богатство корректно перенести и заставить работать в MQL?

 
lasso:

Да, она позволяет построит множество графиков, отчетов, сохранить найденую сеть в файл, сгенерировать код на С и на VB, и т.д. Здорово!

Но тут выявляется новая проблема!

А как все это богатство корректно перенести и заставить работать в MQL?



Ну приципить dll к советнику вообще не проблема. Есть наглядный пример в самом Терминале в папке Experts/Samples, плюс поиск по форуму по фразе "подключить dll" помогут это сделать запросто. Да, кажется статья была на это тему... Это не есть камень преткновения при работе с нейро сетями.

Гораздо интереснее вопросы:

Что должна делать нейросеть? Что будет входами? Как их лучше подготовить? Выбрать тип и архитектуру НС и т.д. Все это проще и интереснее сделать на какой-нибудь практической задаче, типа отторговать в прибыль ноябрь, а по возможности и декабрь 2010 года в качестве новых данных НС. Хотя, наверно это правильнее уже вынести в отдельную ветку типа "Практикум НС для начинающих и не только".

 
Figar0:

Ну приципить dll к советнику вообще не проблема. Есть наглядный пример в самом Терминале в папке Experts/Samples, плюс поиск по форуму по фразе "подключить dll" помогут это сделать запросто. Да, кажется статья была на это тему... Это не есть камень преткновения при работе с нейро сетями.

Гораздо интереснее вопросы:

Что должна делать нейросеть? Что будет входами? Как их лучше подготовить? Выбрать тип и архитектуру НС и т.д. Все это проще и интереснее сделать на какой-нибудь практической задаче, типа отторговать в прибыль ноябрь, а по возможности и декабрь 2010 года в качестве новых данных НС. Хотя, наверно это правильнее уже вынести в отдельную ветку типа "Практикум НС для начинающих и не только".

Согласен, что вопросы интересные. А что бы на них получить ответы -- нужен работающий в среде MT функционал.

......................

Вопрос, не как прицепить dll, а где взять эту dll?

Разве Статистика 6 генерит dll?

Или вы предлагаете начинающему исследователю нейросетей самому написать НС и оформить в виде DLL? Я что то не пойму Вас....

.......................

Есть вариант библиотеки FANN.

А ещё есть варианты?

 
lasso:

Вопрос, не как прицепить dll, а где взять эту dll?

Разве Статистика 6 генерит dll?

Или вы предлагаете начинающему исследователю нейросетей самому написать НС и оформить в виде DLL? Я что то не пойму Вас....

.......................

Есть вариант библиотеки FANN.

Statistica, как и многие другие НС программы (neuroshell, neurosolutions) - генерит С-шный код насколько помню. От исходника до dll шаг небольшой) Наверно это самый простой выход для новичка. Можно писать сети непосредственно на MQL, но тут встает вопрос ее обучения... FANN мне показалась слишком громоздкой, и не очень удобной в использовании.

 
Statistica генерит С-шный исходник консольного приложения обученной нейронной сети (если скомпилировать такой исходник получится exe-исполняемый файл). Код можно перенести на MQL4/5 как два пальца об асфальт, с небольшой переделкой. Я именно так и начинал изучение нейронных сетей.
 
lasso:


Есть вариант библиотеки FANN.

А ещё есть варианты?


SVM .... http://www.csie.ntu.edu.tw/~cjlin/libsvm/

 
Figar0:

Statistica, как и многие другие НС программы (neuroshell, neurosolutions) - генерит С-шный код насколько помню. От исходника до dll шаг небольшой) Наверно это самый простой выход для новичка. Можно писать сети непосредственно на MQL, но тут встает вопрос ее обучения... FANN мне показалась слишком громоздкой, и не очень удобной в использовании.


joo:
Statistica генерит С-шный исходник консольного приложения обученной нейронной сети (если скомпилировать такой исходник получится exe-исполняемый файл). Код можно перенести на MQL4/5 как два пальца об асфальт, с небольшой переделкой. Я именно так и начинал изучение нейронных сетей.

Вот что генерит моя Статистика 6 ))

В чем радость?

Радость только в том, что бы поглядеть в отладчике похождение сигнала от входа до выхода.

/* ------------------------------------------------------------------------- */


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif

#define MENUCODE -999


static double NNCode38Thresholds[] =
{

/* layer 1 */
-0.78576109762088242, -0.23216582173469763, -1.6708808507320108, -1.525614113040888,
1.4153558659332133, -0.77276960668316319, 2.3600992937381298, 2.473963708568014,
-0.43422405325901231, 0.68546943611132893, 0.19836417975077064, 0.26461366779934564,
-0.19131682804149783, 0.24687125804149584, -0.95588612620053504, 0.25329560565058901,
-1.0054817062488075, 1.3224622867600988, 0.88115523574528376, 0.32309684489223067,
0.52538428519764313,

/* layer 2 */
-1.8292886608617505

};

static double NNCode38Weights[] =
{

/* layer 1 */
1.8660729426318707,
1.3727568288578245,
3.1175074758006374,
3.356836518157698,
3.2574311486418068,
3.2774957848884769,
1.4284147042568165,
3.534875314491805,
2.4874577673065557,
2.1516346524000403,
1.9692127720516106,
4.3440737376517129,
2.7850179803408932,
-12.654434243399631,
2.4850018642785399,
2.1683631515554227,
1.77850226182071,
2.1342779960924272,
2.8753050022428206,
3.9464397902669828,
2.5227540467556553,

/* layer 2 */
-0.041641949353302246, -0.099151657230575702, 0.19915689162090328, -0.48586373846026099,
-0.091916813099494746, -0.16863091580772138, -0.11592356639654273, -0.55874391921850786,
0.12335845466035589, -0.022300206392803789, -0.083342117374385544, 1.550222748978116,
0.10305706982775611, 3.9280003726494575, 0.12771097131123971, -0.12144621860368633,
-0.40427171889553365, -0.072652508364580259, 0.20641498115269669, 0.1519896468808962,
0.69632055946019444

};

static double NNCode38Acts[46];

/* ---------------------------------------------------------- */
/*
  NNCode38Run - run neural network NNCode38

  Input and Output variables.
  Variable names are listed below in order, together with each
  variable's offset in the data set at the time code was
  generated (if the variable is then available).
  For nominal variables, the numeric code - class name
  conversion is shown indented below the variable name.
  To provide nominal inputs, use the corresponding numeric code.
  Input variables (Offset):
  stoch

  Выход:
  res
    1=1
    2=-1

*/
/* ---------------------------------------------------------- */

void NNCode38Run( double inputs[], double outputs[], int outputType )
{
  int i, j, k, u;
  double *w = NNCode38Weights, *t = NNCode38Thresholds;

  /* Process inputs - apply pre-processing to each input in turn,
   * storing results in the neuron activations array.
   */

  /* Input 0: standard numeric pre-processing: linear shift and scale. */
  if ( inputs[0] == -9999 )
    NNCode38Acts[0] = 0.48882189239332069;
  else
    NNCode38Acts[0] = inputs[0] * 1.0204081632653061 + 0;

  /*
   * Process layer 1.
   */

  /* For each unit in turn */
  for ( u=0; u < 21; ++u )
  {
    /*
     * First, calculate post-synaptic potentials, storing
     * these in the NNCode38Acts array.
     */

    /* Initialise hidden unit activation to zero */
    NNCode38Acts[1+u] = 0.0;

    /* Accumulate weighted sum from inputs */
    for ( i=0; i < 1; ++i )
      NNCode38Acts[1+u] += *w++ * NNCode38Acts[0+i];

    /* Subtract threshold */
    NNCode38Acts[1+u] -= *t++;

    /* Now apply the logistic activation function, 1 / ( 1 + e^-x ).
     * Deal with overflow and underflow
     */
    if ( NNCode38Acts[1+u] > 100.0 )
       NNCode38Acts[1+u] = 1.0;
    else if ( NNCode38Acts[1+u] < -100.0 )
      NNCode38Acts[1+u] = 0.0;
    else
      NNCode38Acts[1+u] = 1.0 / ( 1.0 + exp( - NNCode38Acts[1+u] ) );
  }

  /*
   * Process layer 2.
   */

  /* For each unit in turn */
  for ( u=0; u < 1; ++u )
  {
    /*
     * First, calculate post-synaptic potentials, storing
     * these in the NNCode38Acts array.
     */

    /* Initialise hidden unit activation to zero */
    NNCode38Acts[22+u] = 0.0;

    /* Accumulate weighted sum from inputs */
    for ( i=0; i < 21; ++i )
      NNCode38Acts[22+u] += *w++ * NNCode38Acts[1+i];

    /* Subtract threshold */
    NNCode38Acts[22+u] -= *t++;

    /* Now calculate negative exponential of PSP
     */
    if ( NNCode38Acts[22+u] > 100.0 )
       NNCode38Acts[22+u] = 0.0;
    else
      NNCode38Acts[22+u] = exp( -NNCode38Acts[22+u] );
  }

  /* Type of output required - selected by outputType parameter */
  switch ( outputType )
  {
    /* The usual type is to generate the output variables */
    case 0:


      /* Post-process output 0, two-state nominal output */
      if ( NNCode38Acts[22] >= 0.05449452669633785 )
        outputs[0] = 2.0;
      else
        outputs[0] = 1.0;
      break;

    /* type 1 is activation of output neurons */
    case 1:
      for ( i=0; i < 1; ++i )
        outputs[i] = NNCode38Acts[22+i];
      break;

    /* type 2 is codebook vector of winning node (lowest actn) 1st hidden layer */
    case 2:
      {
        int winner=0;
        for ( i=1; i < 21; ++i )
          if ( NNCode38Acts[1+i] < NNCode38Acts[1+winner] )
            winner=i;

        for ( i=0; i < 1; ++i )
          outputs[i] = NNCode38Weights[1*winner+i];
      }
      break;

    /* type 3 indicates winning node (lowest actn) in 1st hidden layer */
    case 3:
      {
        int winner=0;
        for ( i=1; i < 21; ++i )
          if ( NNCode38Acts[1+i] < NNCode38Acts[1+winner] )
            winner=i;

        outputs[0] = winner;
      }
      break;
  }
}

Или я не там и не то генерирую???

Причина обращения: