Les réseaux neuronaux. Questions des experts. - page 16

 
joo:

Mais apparemment, Lasso entraîne son bio-réseau à travailler avec les réseaux artificiels de cette façon.

C'est drôle : )))) Mec, Nsh est tellement addictif à cet égard, parfois c'est extrêmement difficile de s'en détacher......
 
lasso:

Bonjour.


Les classes sont très mélangées, encore plus qu'en fig..,


mais toujours distinguable.

Je suis capable de diviser même par des méthodes linéaires non astucieuses, mais je n'arrive pas à faire en sorte que le NS produise un meilleur résultat (ou au moins de qualité comparable).

J'espère des réponses adéquates et qu'elles seront utiles à d'autres forumers aussi !

J'ai été privé de communication avec vous pendant un certain temps... Allons-y.

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

Le problème posé à la page 14 est en effet résolu de manière élémentaire par un réseau de neurones.

La capture d'écran montre une des configurations possibles. Vous pouvez sans risque réduire le nombre de neurones d'une couche cachée à 7, par exemple.



Et ce qui était agréable et surprenant, c'est que NS trouve ses propres solutions, contrairement aux méthodes linéaires évidentes (par rapport à ce problème simple),

et ces solutions sont déroutantes au premier abord, mais après une analyse approfondie, il s'avère que les solutions NS sont même légèrement plus efficaces que les solutions linéaires. O-o-o-o-o !

Aller de l'avant.... ;-)

 
lasso:

Le problème posé à la page 14 est en effet résolu de manière élémentaire avec un réseau de neurones.

La capture d'écran représente l'une des configurations possibles. Le nombre de neurones de la couche cachée peut être réduit sans peine à 7, par exemple.



Et ce qui était surprenant et agréable, c'est le fait que NS trouve ses propres solutions, contrairement aux méthodes linéaires évidentes (pour ce problème simple),

et ces solutions sont déroutantes au premier abord, mais après une analyse approfondie, il s'avère que les solutions NS sont même légèrement plus efficaces que les solutions linéaires. O-o-o-o-o !

Aller de l'avant.... ;-)


S'agit-il d'un problème de croisement stochastique ? Je ne comprends pas ce que vous voulez obtenir en résolvant ce problème, de toute évidence, l'indigence de la description de la situation ne permettra pas à NS de résoudre ce problème de manière "significative". Un tel réseau sera extrêmement instable et absolument inutile en dehors du VO. Mais ça fera l'affaire pour une tâche d'entraînement, bien sûr...

Où allons-nous à partir d'ici ? Peut-être devrions-nous nous rapprocher de la prédiction de la série chronologique?

 
Figar0:

S'agit-il d'un problème de croisement stochastique ? Je ne comprends pas ce que vous vouliez obtenir en résolvant ce problème, de toute évidence la description éparse de la situation ne permettra pas à NS de résoudre ce problème de manière "significative". Un tel réseau sera extrêmement instable et absolument inutile en dehors du VO. Mais ça fera l'affaire pour une tâche d'entraînement, bien sûr...

Où allons-nous à partir d'ici ? Peut-être un peu plus proche de nos agneaux - prédiction de séries temporelles ?

Je veux apprendre à appliquer l'appareil NS dans les blocs analytiques de mon TS, et le faire de manière visuelle et avec des exemples, au profit des autres.

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

Ainsi, la tâche de classification dans Statistique 6 -- résolue.

Mais il s'agit d'un programme tiers, qui n'est pas directement lié au commerce.

Oui, il permet de construire un grand nombre de graphiques, de rapports, de sauvegarder le réseau trouvé dans un fichier, de générer du code en C et VB, etc. Super !

Mais ici, nous sommes confrontés à un nouveau problème !

Comment transférer correctement toute cette richesse et la faire fonctionner dans MQL ?

 
lasso:

Oui, il permet de construire de nombreux graphiques et rapports, de sauvegarder le réseau trouvé dans un fichier, de générer du code en C et VB, etc. Super !

Mais ici, nous sommes confrontés à un nouveau problème !

Comment transférer correctement toute cette richesse et la faire fonctionner dans MQL ?



Eh bien, ce n'est pas du tout un problème d'attacher une dll à l'Expert Advisor. Le terminal lui-même, dans le dossier Experts/Samples, contient un bon exemple, et une recherche sur le forum à l'aide de la phrase "connect dll" vous aidera à le faire en un rien de temps. Oui, je crois qu'il y a eu un article sur ce sujet... Ce n'est pas une pierre d'achoppement lorsqu'on travaille avec des réseaux neuronaux.

Des questions bien plus intéressantes :

Que doit faire un réseau neuronal ? Quelles sont les entrées ? Quelle est la meilleure façon de les préparer ? Choisissez le type et l'architecture de la SN, etc. Tout cela est plus facile et plus intéressant à faire sur une tâche pratique, comme le trading de novembre, et si possible décembre 2010 en profit comme nouvelles données NS. Cependant, il serait peut-être préférable de le placer dans une branche distincte telle que "Débutants et au-delà de la pratique des NS".

 
Figar0:

Eh bien, ce n'est pas du tout un problème d'attacher une dll à l'Expert Advisor. Le terminal lui-même, dans le dossier Experts/Samples, contient un bon exemple, et une recherche sur le forum à l'aide de la phrase "connect dll" vous aidera à le faire facilement. Oui, je crois qu'il y a eu un article sur ce sujet... Ce n'est pas une pierre d'achoppement lorsqu'on travaille avec des réseaux neuronaux.

Des questions bien plus intéressantes :

Que doit faire un réseau neuronal ? Quelles sont les entrées ? Quelle est la meilleure façon de les préparer ? Choisissez le type et l'architecture de la SN, etc. Tout cela est plus facile et plus intéressant à faire sur une tâche pratique, comme le trading de novembre, et si possible décembre 2010 en profit comme nouvelles données NS. Bien que, probablement, il serait plus correct de le mettre dans une branche séparée telle que "Débutants et non seulement pratique NS".

Je reconnais que les questions sont intéressantes. Et pour avoir des réponses à ces questions, vous avez besoin de fonctionnalités travaillant dans l'environnement MT.

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

La question n'est pas de savoir comment joindre la dll, mais où obtenir cette dll ?

Statistics 6 génère-t-il une dll ?

Ou bien suggérez-vous à un chercheur novice en réseaux neuronaux d'écrire son propre NS et de le transformer en DLL ? Je ne te comprends pas....

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

Il existe une variante de la bibliothèque FANN.

Existe-t-il d'autres variantes ?

 
lasso:

La question n'est pas de savoir comment joindre la dll, mais où trouver la dll ?

Est-ce que Statistic 6 génère une dll ?

Ou bien suggérez-vous à un chercheur novice en réseaux neuronaux d'écrire lui-même le NS et de le transformer en DLL ? Je ne te comprends pas....

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

Il existe une variante de la bibliothèque FANN.

Statistica, ainsi que de nombreux autres programmes NS (neuroshell, neurosolutions), génère du code C pour autant que je me souvienne. C'est probablement la solution la plus simple pour un débutant. Vous pouvez écrire des réseaux directement dans MQL mais cela soulève une question de formation... Je trouve FANN trop lourd et pas très facile à utiliser.

 
Statistica génère le source C de l'application console du réseau neuronal formé (si vous compilez ce source vous obtenez un fichier exe-exécutable). Le code peut être porté sur MQL4/5 comme deux doigts sur la chaussée, avec une légère modification. C'est ainsi que j'ai commencé à étudier les réseaux neuronaux.
 
lasso:


Il existe une version de la bibliothèque FANN.

Y a-t-il d'autres options ?


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

 
Figar0:

Statistica, comme beaucoup d'autres programmes NS (neuroshell, neurosolutions), génère du code C pour autant que je me souvienne. C'est probablement la solution la plus simple pour un débutant. Vous pouvez écrire des réseaux directement dans MQL mais cela soulève une question de formation... Je trouve FANN trop lourd et pas très facile à utiliser.


joo:
Statistica génère un code source en C pour l'application en console du réseau neuronal formé (si vous compilez ce code source, vous obtenez un fichier exécutable exe). Le code pourrait être porté sur MQL4/5 comme deux doigts sur le trottoir, avec une légère modification. C'est ainsi que j'ai commencé à étudier les réseaux neuronaux.

Voici ce que génère mon Statistics 6 :))

Quelle est la joie ?

La seule joie est de voir l'évolution du signal de l'entrée à la sortie dans le débogueur.

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


#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 est-ce que je génère au mauvais endroit ?

Raison: