"Nöral Ağlar: Teoriden Pratiğe" makalesi için tartışma - sayfa 6

 
fyords: Elbette bu başlıkta sinir ağlarının inceliklerinin tartışılmasına karşı değilim, ancak makale başlangıçta yeni başlayanlar için planlanmıştı. Bazı detayları atlıyor, çünkü bu detaylar acemi bir sinir ağı uzmanının kafasını karıştır abilir. Elbette, makale sinir ağlarını eğitmenin (uydurmanın) çeşitli yöntemlerini belirtmiyor, ancak ilk aşamada gerekli değil. Sinir ağlarının o kadar da zor olmadığını fark ederseniz, bu size geri dönüp "bu çok zor ve bana göre değil" demek için bir bahane vermez. Daha fazlasını biliyorsanız, bu harika, o zaman bu makale muhtemelen size göre değil.

Şimdiye kadar, yukarıda sorduğum ayrıntıların yokluğu, sıradan bir aptal olarak beni sersemletti. Makaleyi üç kez tekrar okudum, ancak gerekli cevapları sadece forumda buldum.

fyords: Şu anda ikinci bölüm çok katmanlı sinir ağları ile çalışmayı kapsayacak. İçeriği hakkında herhangi bir isteğiniz varsa - lütfen bunları kısaca yazın.
İlgilendiğim tek bir soru var: "harici" bir optimize edici kullanmadan kendi kendine öğrenebilen bir programın nasıl oluşturulacağı. Tabii bu aşamada böyle bir şey mümkünse.
 
fyords:

Biraz düşündükten sonra makalenin ikinci bölümünün yazılmasına karar verildi.

Şu anda, ikinci bölüm çok katmanlı sinir ağları ile çalışmayı kapsayacaktır.
İçeriği hakkında herhangi bir isteğiniz varsa - lütfen, kısaca, bunları yazın.
Parmaklarımla aktarabileceğim fikirler makalede açıklanacaktır.

Teşekkür ederim.

Gradyan öğrenme yönteminin parmaklar üzerinde anlatıldığını görmek isterim.
 
Yedelkin:

Anadili Rusça olanlar arasında bağımsız öğrenme sürecine "parametre uydurma" demenin alışılagelmiş bir şey olmadığını "safça varsayıyorum". Aynı şekilde herhangi bir sistem için parametre seçimini (dış süreçlerin yardımıyla) öğrenme olarak adlandırmak da kabul görmez.

Uydurma işlemini nasıl adlandırırsanız adlandırın, bu işlem uydurma olmaktan çıkmayacaktır.

Durağan olmayan verilerle çalışan sinir ağları için optimizasyon, uydurma ve öğrenme eşanlamlıdır. Çünkü her üç terim de aynı anlama gelir: sinir ağı çıktısındaki hataları en aza indirmek için geçmiş tarihsel veriler (eğitim örneği) için ağırlık katsayılarının seçilmesi. Şebekeyi gelecekteki verilerle beslemek mümkün olsaydı, o zaman farklı bir mesele olurdu. Ancak ofis malzemeleri satan dükkanlarda henüz zaman makineleri satılmıyor, bu yüzden geçmişe uymak zorundayız.

 
Reshetov:

Bir uydurmaya ne derseniz deyin, o bir uydurma olmaktan çıkmayacaktır.

Yeniden eğitim temel bir şekilde tanımlanmıştır. Dolayısıyla aynayı suçlayacak bir şey yok.
 
Yedelkin:

İlgimi çeken tek bir soru var: "harici" bir optimize edici kullanmadan kendi kendine öğrenebilen bir programın nasıl oluşturulacağı. Tabii bu aşamada böyle bir şey mümkünse.

Çok basit. EA kodu, ağın kendisini ve yeni veriler geldiğinde otomatik olarak başlatılabilen ağırlık optimize edicisini içerebilir. Sinir ağları altında çoğu durumda bu tür kendi kendine öğrenen ağları kastediyoruz. Harici olarak, örneğin test cihazı optimize edicisi tarafından eğitilen ağlar oyuncaktır.

 
Çocuklar, bana yardım edin! Giriş verilerinin normalizasyonunun ağın tüm eğitim dönemi için yapılması gerektiğini doğru anladım mı? Yani xi'nin maksimum ve minimum değerleri tüm dönemden mi alınmalı?
 
net:
Çocuklar, bana yardım edin! Giriş verilerinin normalizasyonunun ağın tüm eğitim dönemi için yapılması gerektiğini doğru anladım mı? Yani xi'nin maksimum ve minimum değerleri tüm dönemden mi alınmalı?
Tüm eğitim örneği üzerinde gereklidir.
 
//+------------------------------------------------------------------+
//|macd-nöro-örnek.mq5 |
//| Telif Hakkı 2012, MetaQuotes Software Corp. | |
//|http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Uzman başlatma işlevi|
//+------------------------------------------------------------------+

#define SIZE 1000

#include <Trade\Trade.mqh>        //ticaret işlemlerini gerçekleştirmek için kütüphaneyi bağlayın
#include <Trade\PositionInfo.mqh> //pozisyonlar hakkında bilgi almak için kütüphaneyi bağlayın
#include <Indicators/TimeSeries.mqh>

//--- ağırlık katsayılarının değerleri 
input double w0=0.5;
input double w1=0.5;
input double w2=0.5;
input double w3=0.5;
input double w4=0.5;
input double w5=0.5;
input double w6=0.5;
input double w7=0.5;
input double w8=0.5;
input double w9=0.5;
input double w10=0.5;
input double w11=0.5;
input double w12=0.5;

string            my_symbol;         // karakteri saklamak için değişken
double            inputsH[13];        // giriş sinyallerini saklamak için dizi
double            inputsL[13];        // giriş sinyallerini saklamak için dizi
int               periods[13]={2,3,5,8,13,21,34,55,89,144,233,377,610};
int B,Ba;
double            weight[13];        // ağırlık katsayılarını saklamak için dizi
double High[SIZE],Low[SIZE];

CTrade            m_Trade;           // ticaret işlemlerini gerçekleştirmek için nesne
CPositionInfo     m_Position;        // konum bilgisi için nesne
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int OnInit()
  {

   weight[0]=w0;
   weight[1]=w1;
   weight[2]=w2;
   weight[3]=w3;
   weight[4]=w4;
   weight[5]=w5;
   weight[6]=w6;
   weight[7]=w7;
   weight[8]=w8;
   weight[9]=w9;
   weight[10]=w10;
   weight[11]=w11;
   weight[12]=w12;

   my_symbol=Symbol();
   B=Bars(my_symbol,0);

//--- return 0, başlatma tamamlandı
   return(0);
  }
//+------------------------------------------------------------------+
//| Uzman başlangıçtan kaldırma işlevi|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Uzman tik fonksiyonu|
//+------------------------------------------------------------------+
void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);                   // satın almak için en iyi teklif
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);                   // satış için en iyi teklif

   B=Bars(my_symbol,0);
   if(B!=Ba)
     {
      CiHigh hi;
      CiLow li;
      hi.Create(_Symbol,_Period);
      li.Create(_Symbol,_Period);
      hi.GetData(0,SIZE,High);
      li.GetData(0,SIZE,Low);
     }
   Ba=B;

     {
      for(int i=0; i<13; i++)
        {
         int HB = ArrayMaximum(High,SIZE-periods[i],periods[i]);
         int LB = ArrayMinimum(Low, SIZE-periods[i],periods[i]);
         if(Bid>=High[HB]) inputsH[i] =1;
         else inputsH[i]=0;
         if(Bid<=Low[LB]) inputsL[i]=1;
         else inputsL[i]=0;
        }

      double outH=CalculateNeuron(inputsH,weight);
      double outL=CalculateNeuron(inputsL,weight);

      //--- nöron çıkış değeri 0'dan küçükse
      if(outL>0)
        {
         //--- eğer bu karakter için zaten bir pozisyon varsa
         if(m_Position.Select(my_symbol))
           {
            //--- ve bu pozisyonun türü Sell ise, o zaman kapatın
            if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);
            //--- ve bu pozisyonun türü Alış ise, o zaman çıkın.
            if(m_Position.PositionType()==POSITION_TYPE_BUY) return;
           }
         //--- eğer buraya geldiyseniz, pozisyon yok, açın.
         m_Trade.Buy(0.1,my_symbol);
        }
      //--- nöron çıkış değeri 0'dan büyük veya eşitse
      if(outH>0)
        {
         //--- eğer bu karakter için zaten bir pozisyon varsa
         if(m_Position.Select(my_symbol))
           {
            //--- ve bu pozisyonun türü Alış ise, o zaman kapatın
            if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);
            //--- ve bu pozisyonun türü Satış ise, o zaman çıkın.
            if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
           }
         //--- eğer buraya geldiyseniz, pozisyon yok, açın.
         m_Trade.Sell(0.1,my_symbol);
        }

      if(outH>0.0 || outL>0) Print(outH,"    ",outL);
     }

  }
//+------------------------------------------------------------------+
//|| Nöron hesaplama fonksiyonu|
//+------------------------------------------------------------------+
double CalculateNeuron(double &inputs[],double &w[])
  {
//--- giriş sinyallerinin ağırlıklı toplamını saklamak için değişken
   double NET=0.0;
//--- döngü içinde girdi sayısına göre girdilerin ağırlıklı ortalama toplamını elde edin
   for(int n=0;n<ArraySize(inputs);n++)
     {
      NET+=inputs[n]*w[n];
     }
//--- girdilerin ağırlıklı ortalama toplamını katkı faktörü ile çarpın
   return(ActivateNeuron(NET));
  }
//+------------------------------------------------------------------+
//|| Nöron aktivasyon fonksiyonu|
//+------------------------------------------------------------------+
double ActivateNeuron(double x)
  {
//--- aktivasyon fonksiyonunun sonucunu saklamak için değişken
   double Out;
//--- hiperbolik tanjant fonksiyonu
   Out=(exp(x)-exp(-x))/(exp(x)+exp(-x));
//--- aktivasyon fonksiyonunun değerini döndürür
   return(Out);
  }
//+------------------------------------------------------------------+

Bu baykuşu ben yazdım. Bunun bir sinir ağı olduğunu söyleyebilir miyiz, çünkü şüphelerim var.

Kanalda işlem yapmak için baykuş.

Algoritma aşağıdaki gibidir: Fibo çubuklarının sayısı için ekstremumlar alınır (2,3,5,8,13....). Örneğin satın alınacak her nöron için - fiyat bir dönem için ekstremum DÜŞÜK fiyatının altında veya ona eşitse, aksi takdirde 1 döndürün - 0. Ayrıca, NeuronMACD örneğinde olduğu gibi. Satmak için - tersini yansıtın.

Kod ve algoritma hakkında eleştiri bekliyorum.

 
dimeon:

Bu baykuşu ben yazdım. Bunun bir sinir ağı olduğunu söyleyebilir miyiz, çünkü şüphelerim var.

Kanalda işlem yapmak için baykuş.

Algoritma aşağıdaki gibidir: Fibo çubuklarının sayısı için ekstremumlar alınır (2,3,5,8,13....). Örneğin, satın alınacak her nöron için - fiyat bir dönem için DÜŞÜK ekstremum fiyatının altında veya ona eşitse, aksi takdirde 1 döndürürüz - 0. Ayrıca, NeuronMACD örneğinde olduğu gibi. Satmak için - tersini yansıtın.

Kod ve algoritmanın eleştirisini bekliyorum.

Sizin durumunuzda, nöron aktivasyonunun işlevi atılabilir, bu gereksiz bir frendir.
return(NET);
Bu bir sinir ağı değil, sadece bir algılayıcı. Bir ağ için en az birkaç algılayıcıya ihtiyacınız vardır.
 
her.human:
Sizin durumunuzda, Nöron Aktivasyon Fonksiyonu gereksiz bir fren olarak dışarı atılabilir.
return(NET);
Bu bir sinir ağı değil, sadece bir algılayıcı. Bir ağ için en az birkaç algılayıcıya ihtiyacınız vardır.
Bana bir örnek verebilir misiniz, bir MA veya başka bir gösterge veya başka bir şey eklemek ve bunların hepsini nasıl ağa bağlamak gibi?