Uma biblioteca rápida e gratuita para o MT4, muito para o deleite de quem trabalha com redes neurais - página 9

 
Este é um comitê de 16 grelhas, você pode olhar os arquivos que são criados.
 
Henry_White >> :

Se tivermos uma grade com um neurônio de saída, como conseguimos 16 saídas...!? Ou é um comitê de 16 redes?

E é.

 

Olá a todos!

Passei a noite sentado a bisbilhotar em um pedaço de código

void ann_prepare_input () {
    int i;
    double res = 0;
	 for( i = 0; i < AnnInputs; i++) {
      res = (iRSI(Symbol(), 0, 30, PRICE_OPEN, i) - 50.0) / 50.0; 
      if (MathAbs( res) > 1) {
         if ( res > 0) {
            InputVector[ i] = 1.0;            
         } else {
            InputVector[ i] = -1.0;            
         }
      } else {
         InputVector[ i] = res;            
      }
    }
}

Não entendo que sentido há em

if (MathAbs( res) > 1) {
         if ( res > 0) {
            InputVector[ i] = 1.0;            
         } else {
            InputVector[ i] = -1.0;            
         }
      } else {
         InputVector[ i] = res;            
      }

se o valor do res não puder ser maior que um.

Por favor, explique este ponto, se não for segredo, é claro.

 
alex_r >> :

Olá a todos!

Já estou trabalhando neste pedaço de código há duas noites.

Não entendo que sentido há em

se o valor do res não puder ser maior que um.

Por favor, explique este ponto se não for um segredo.

Os valores normalizados (1;-1) devem ser alimentados com a entrada do NS. Caso contrário, o treinamento da NS pode levar a resultados indefinidos.

 

bem, como é calculado o res

condição

(MathAbs(res) > 1)
nunca será atendida e a entrada será
res = (iRSI(Symbol(), 0, 30, PRICE_OPEN, i) - 50.0) / 50.0
e aqui, em 99,99% dos casos, você receberá naturalmente tudo menos 1 e -1.
se assim for
for( i = 0; i < AnnInputs; i++) {
      res = (iRSI(Symbol(), 0, 30, PRICE_OPEN, i) - 50.0) / 50.0; 

         if ( res > 0) {                 
            InputVector[ i] = 1.0;            
         } else {
            InputVector[ i] = -1.0;            
         }        

    }

então apenas 1 e -1

ou eu estou errado?

 
alex_r >> :

>> ou eu estou errado?

Errado. Aqui tudo funciona corretamente. Você deve estudar o código mais de perto. É muito simples e óbvio. Não entendo o sentido do seu "//" - "mata" completamente o significado.

iRSI basicamente dá valores de 0 a 100 com raros outliers fora da faixa (por isso é (MathAbs(res) > 1) ), portanto, a res resiliência estará em 99,9% dos casos dentro de 1 e -1, enquanto a InputVector estará dentro de 100%.

Se você estiver esperando por uma falha de cada operador, não acho que ninguém aqui tenha a capacidade de dar aulas de programação. E para esta seção será offtopic. Talvez com isto você deva se candidatar a outra seção do fórum ou me soltar uma linha.

PS. Não "comente" sobre o código de outra pessoa (é melhor comentar). Pode enganar os outros e apenas um mau tom imho. Se você não concorda com o autor - escreva sua variante.

 

Removido o comentado.

Agora eu explico, em res>0, aqui 0 corresponde ao nível 50 do indicador RSI, nós atribuímos 1, caso contrário atribuímos -1

O que não está claro? Um mínimo de código e nada mais.

Como está escrito no código fonte, a condição principal de normalização dos dados NÃO é cumprida.

A única coisa é filtrar outro zero, mas neste caso não é tão importante assim.

 
Sua variante dará ou -1 ou 1. E para que serve tudo isso? E como você vai treinar uma rede com ISTO? Ou melhor, por quê? Qual é a utilidade desta "binaridade" dos Estados? Como você constrói um padrão a partir disso para treinar a rede?
 
Henry_White >> :

Os valores normalizados (1;-1) devem ser alimentados com a entrada NS. Caso contrário, o treinamento da NS pode levar a resultados incertos.

Talvez você tenha ficado confuso com este posto. Aqui eu quis dizer alcance, não estados binários.

 
alex_r >> :

Como escrito no código fonte, a condição principal para a normalização dos dados NÃO é cumprida.

Você está enganado porque as entradas da grade (camada 1) são sigmóides definidos para o intervalo: -1;1. Portanto, qualquer valor sobre as entradas na faixa de -1 a 1 é uma condição necessária e suficiente para a normalização.


O que você tenta construir é substituir a função sigmóide por uma função Signum(input) personalizada que subestima a discrição dos dados de input e cria situações nas quais o conjunto de treinamento contém um grande número de dados mutuamente contraditórios.

Razão: