Redes neurais. Perguntas dos especialistas. - página 16

 
joo:

Mas, aparentemente, o laço está treinando sua rede biológica para trabalhar com as redes artificiais desta forma.

Engraçado :)))) Cara, Nsh é tão viciante a este respeito, às vezes é extremamente difícil de se arrancar.....
 
lasso:

Olá.


As classes são muito mistas, ainda mais do que na fig..,


mas ainda distinguíveis.

Sou capaz de dividir até mesmo por métodos lineares não astutos, mas não consigo que os NS produzam um resultado melhor (ou pelo menos comparável em qualidade).

Espero obter respostas adequadas e que elas sejam úteis também para outros forasteiros!

Há algum tempo que estão privados de comunicação com vocês... Vamos continuar com isso.

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

O problema apresentado na página 14 é de fato resolvido de forma elementar por uma rede neural.

Na imagem da tela está uma das configurações possíveis. Você pode reduzir com segurança o número de neurônios em uma camada oculta para 7, por exemplo.



E o que foi agradável e surpreendente, é que a NS encontra suas próprias soluções, ao contrário dos métodos lineares óbvios (em relação a este simples problema),

e estas soluções são, a princípio, intrigantes, mas depois de uma análise extensiva, verifica-se que as soluções NS são ainda um pouco mais eficientes do que as lineares. O-o-o-o-o!

Seguindo em.... ;-)

 
lasso:

O problema apresentado na página 14 é de fato resolvido de forma elementar com uma rede neural.

A captura de tela é uma das configurações possíveis. O número de neurônios na camada oculta pode ser reduzido sem dor para 7, por exemplo.



E o que foi surpreendente e agradável foi o fato de a NS encontrar suas próprias soluções, ao contrário dos métodos lineares óbvios (para este simples problema),

e estas soluções são, a princípio, intrigantes, mas após uma análise abrangente, verifica-se que as soluções NS são ainda um pouco mais eficientes do que as lineares. O-o-o-o-o!

Seguindo em.... ;-)


É um problema de cruzamento estocástico? Não entendo o que você quer alcançar resolvendo este problema, obviamente a escassez da descrição da situação não permitirá que a NS resolva este problema de nenhuma maneira "significativa". Tal rede será extremamente instável e absolutamente inútil fora do OV. Mas servirá para uma tarefa de treinamento, é claro...

Para onde vamos a partir daqui? Talvez devêssemos nos aproximar da previsão da série cronológica?

 
Figar0:

É um problema de cruzamento estocástico? Não entendo o que você queria alcançar resolvendo este problema, obviamente a descrição esparsa da situação não permitirá que a NS resolva este problema de forma "significativa". Tal rede será extremamente instável e absolutamente inútil fora do OV. Mas servirá para uma tarefa de treinamento, é claro...

Para onde vamos a partir daqui? Talvez um pouco mais perto de nossos cordeiros - previsão de séries cronológicas?

Quero aprender como aplicar os aparelhos NS em blocos analíticos do meu TS, e fazê-lo visualmente e com exemplos, em benefício de outros.

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

Portanto, a tarefa de classificação em Statistics 6 -- resolvida.

Mas é um programa de terceiros, que não está diretamente relacionado ao comércio.

Sim, ele permite construir muitos gráficos, relatórios, salvar a rede encontrada em um arquivo, gerar código em C e VB, etc. Ótimo!

Mas aqui enfrentamos um novo problema!

Como transferir toda essa riqueza corretamente e fazê-la funcionar em MQL?

 
lasso:

Sim, ele permite construir muitos gráficos e relatórios, salvar a rede encontrada em um arquivo, gerar código em C e em VB, etc. Ótimo!

Mas aqui enfrentamos um novo problema!

Como transferir corretamente toda essa riqueza e fazê-la funcionar em MQL?



Bem, não é um problema anexar um dll ao Expert Advisor de forma alguma. O próprio Terminal na pasta Experts/Samples tem um bom exemplo, mais uma busca no fórum usando a frase "connect dll" ajudará você a fazer isso em pouco tempo. Sim, acho que houve um artigo sobre este assunto... Não é um tropeço quando se trabalha com redes neurais.

Perguntas muito mais interessantes:

O que deve fazer uma rede neural? Quais são as entradas? Qual é a melhor maneira de prepará-los? Escolha o tipo e a arquitetura do NS, etc. Tudo isso é mais fácil e mais interessante de fazer em algumas tarefas práticas, como o comércio de novembro e, se possível, dezembro de 2010 em lucro como novos dados NS. Embora, talvez fosse melhor colocá-lo em um ramo separado, como "Iniciantes e além da prática NS".

 
Figar0:

Bem, não é um problema anexar um dll ao Expert Advisor de forma alguma. O próprio Terminal na pasta Experts/Samples tem um bom exemplo, mais uma busca no fórum usando a frase "connect dll" ajudará você a fazer isso em pouco tempo. Sim, acho que houve um artigo sobre este assunto... Não é um tropeço quando se trabalha com redes neurais.

Perguntas muito mais interessantes:

O que deve fazer uma rede neural? Quais são as entradas? Qual é a melhor maneira de prepará-los? Escolha o tipo e a arquitetura do NS, etc. Tudo isso é mais fácil e mais interessante de fazer em algumas tarefas práticas, como o comércio de novembro e, se possível, dezembro de 2010 em lucro como novos dados NS. Embora, provavelmente seria mais correto colocá-lo em um ramo separado, como "Iniciantes e não apenas a prática NS".

Concordo que as perguntas são interessantes. E para ter respostas a elas você precisa de funcionalidade trabalhando em ambiente MT.

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

A questão não é como anexar a dll, mas onde obter esta dll?

O Statistics 6 gera uma dll?

Ou você está sugerindo que um pesquisador de redes neurais novato escreva seu próprio NS e o faça como uma DLL? Eu não entendo você....

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

Existe uma variante da biblioteca FANN.

Existem outras variantes?

 
lasso:

A questão não é como anexar a dll, mas onde eu consigo a dll?

O Statistics 6 gera uma dll?

Ou você está sugerindo que um pesquisador de redes neurais novato escreva ele mesmo o NS e o transforme em uma DLL? Eu não entendo você....

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

Existe uma variante da biblioteca FANN.

Statistica, assim como muitos outros programas NS (neuroshell, neurosolutions), gera código C até onde eu me lembro. Provavelmente, é a saída mais fácil para um novato. Você pode escrever redes diretamente em MQL, mas isso levanta uma questão de treinamento... Acho a FANN muito pesada e não muito fácil de usar.

 
Statistica gera fonte C de console de aplicação de rede neural treinada (se você compilar tal fonte você obtém um arquivo exe-executable). O código pode ser portado para MQL4/5 como dois dedos no pavimento, com ligeiras modificações. Foi assim que eu comecei a estudar as redes neurais.
 
lasso:


Existe uma versão da biblioteca FANN.

Existem outras opções?


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

 
Figar0:

A estatística, como muitos outros programas NS (neuroshell, neurosolutions), gera código C, até onde me lembro. Esta é provavelmente a saída mais fácil para um iniciante. Você pode escrever redes diretamente em MQL, mas isso levanta uma questão de treinamento... Acho a FANN muito pesada e não muito fácil de usar.


joo:
Statistica gera código fonte C para aplicação de console de rede neural treinada (se você compilar tal código fonte você obtém um arquivo exe-executable). O código poderia ser portado para MQL4/5 como dois dedos no pavimento, com ligeiras modificações. Foi assim que eu comecei a estudar as redes neurais.

Aqui está o que minha estatística 6 gera ))

Qual é a alegria?

A única alegria é ver a tendência do sinal de entrada para saída no depurador.

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


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

Ou eu estou gerando no lugar errado?

Razão: