文章 "神经网络:从理论到实践" - 页 6

 
fyords: 当然,我并不反对在这个主题中讨论神经网络的微妙之处,但这篇文章 原本是为初学者准备的。文章省略了一些细节,因为这些细节会让神经网络新手感到困惑。当然,这篇文章并没有具体说明训练(拟合)神经网络的各种方法,但在初始阶段这并不是必要的。如果你意识到神经网络并不难,这并不能成为你拒绝接受并说 "这很难,不适合我 "的借口。如果你懂得更多,那很好,但这篇文章可能不适合你。

到目前为止,正是因为没有我上面提到的那些细节,才让我这个普通的傻瓜陷入了迷茫。 我把这篇文章重读了三遍,但只在论坛上找到了必要的答案。

fyords: 目前,第二部分将涉及多层神经网络的工作。 如果您对第二部分的内容有任何希望,请简要提出。
我只对一个问题感兴趣:如何创建一个不使用 "外部 "优化器的自学习 程序。当然,如果在现阶段有可能的话。
 
fyords:

经过商议,决定撰写文章的第二部分。

目前,第二部分将涉及多层神经网络的工作。
如果您对文章内容有任何希望,请简要写出来。
那些我用手指就能表达的想法将在文章中描述。

谢谢。

我希望看到用手指描述梯度学习方法。
 
Yedelkin:

我 "天真地认为",在以俄语为母语的人中,并不习惯把独立学习的过程称为 "参数拟合"。同样,把任何系统的参数选择(借助外部过程)称为学习也是不被接受的。

无论你如何称呼拟合,它都不会停止拟合。

处理非平稳数据的神经网络的优化、拟合和学习是同义词。因为这三个词的意思是一样的:为过去的历史数据(训练样本)选择加权系数,以尽量减少神经网络输出的误差。如果有可能为网格提供未来数据,那就另当别论了。但现在办公设备商店里还没有时间机器出售,所以我们只能适应过去。

 
Reshetov:

无论你把它叫做什么,它都不会不再是一个配件。

再培训的定义很简单。因此,没有什么可指责镜子的。
 
Yedelkin:

只有一个问题令人感兴趣:如何创建一个不使用 "外部 "优化器的自学 程序。当然,如果在现阶段有可能的话。

这很简单。EA 代码可以包含网络本身及其权重优化器,当新数据到来时,优化器可以自动启动。在大多数情况下,我们所说的神经网络 指的就是这种自学习网络。外部训练的网络,例如由测试优化器训练的网络,就是玩具。

 
各位,帮帮我!我的理解是否正确,即输入数据的归一化应该在网络 的整个训练 期进行?我是说 xi 的最大值和最小值应该取自整个训练期?
 
net:
各位,帮帮我!我的理解是否正确,即输入数据的归一化应该在网络的整个训练期进行?我是说 xi 的最大值和最小值应该取自整个训练期?
有必要对整个训练样本进行归一化。
 
//+------------------------------------------------------------------+
//|macd-neuro-example.mq5
//| Copyright 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"
//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+

#define SIZE 1000

#include <Trade\Trade.mqh>        // 连接执行贸易操作的图书馆
#include <Trade\PositionInfo.mqh> // 连接图书馆以获取有关职位的信息
#include <Indicators/TimeSeries.mqh>

//--- 加权系数的值 
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;         // 用于存储字符的变量
double            inputsH[13];        // 用于存储输入信号的数组
double            inputsL[13];        // 用于存储输入信号的数组
int               periods[13]={2,3,5,8,13,21,34,55,89,144,233,377,610};
int B,Ba;
double            weight[13];        // 用于存储权重系数的数组
double High[SIZE],Low[SIZE];

CTrade            m_Trade;           // 执行贸易操作的对象
CPositionInfo     m_Position;        // 位置信息对象
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
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);

//--- 返回 0,初始化完成
   return(0);
  }
//+------------------------------------------------------------------+
//| 专家去初始化函数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);                   // 最优惠购买
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);                   // 最优惠出售

   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);

      //--- 如果神经元输出值小于 0
      if(outL>0)
        {
         //--- 如果该字符已有位置
         if(m_Position.Select(my_symbol))
           {
            //--- 如果该位置的类型是 "卖出",则关闭它
            if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);
            //--- 如果该仓位的类型是买入,则退出。
            if(m_Position.PositionType()==POSITION_TYPE_BUY) return;
           }
         //--- if you got here, there is no position, open it.
         m_Trade.Buy(0.1,my_symbol);
        }
      //--- 如果神经元输出值大于或等于 0
      if(outH>0)
        {
         //--- 如果该字符已有位置
         if(m_Position.Select(my_symbol))
           {
            //--- 如果该仓位的类型是买入,则关闭它
            if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);
            //--- 如果该位置的类型是卖出,则退出。
            if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
           }
         //--- if you got here, there is no position, open it.
         m_Trade.Sell(0.1,my_symbol);
        }

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

  }
//+------------------------------------------------------------------+
//|| 神经元计算功能|
//+------------------------------------------------------------------+
double CalculateNeuron(double &inputs[],double &w[])
  {
//--- 用于存储输入信号加权和的变量
   double NET=0.0;
//-----------------------------在循环中按输入数得到输入的加权平均和
   for(int n=0;n<ArraySize(inputs);n++)
     {
      NET+=inputs[n]*w[n];
     }
//--- 将投入的加权平均值乘以加法因子
   return(ActivateNeuron(NET));
  }
//+------------------------------------------------------------------+
//|| 神经元激活函数|
//+------------------------------------------------------------------+
double ActivateNeuron(double x)
  {
//--- 用于存储激活函数结果的变量
   double Out;
//--- 双曲正切函数
   Out=(exp(x)-exp(-x))/(exp(x)+exp(-x));
//--- 返回激活函数的值
   return(Out);
  }
//+------------------------------------------------------------------+

这只猫头鹰是我写的。我们能说它是一个神经网络吗?

用于通道交易的猫头鹰。

算法如下:取斐波条数的极值(2,3,5,8,13....)。对于每个神经元的买入,例如 - 如果价格低于或等于一个周期的 LOW 极值价格,我们返回 1,否则 - 0。卖出 - 相反。

我在等待对代码和算法的批评。

 
dimeon:

这只猫头鹰是我写的。我们能说它是一个神经网络吗?

用于通道交易的猫头鹰。

算法如下:取斐波条数的极值(2,3,5,8,13....)。对于每个神经元的买入,例如 - 如果价格低于或等于一个周期的 LOW 极值价格,我们返回 1,否则 - 0。要卖出--镜像相反。

我在等待对代码和算法的批评。

在您的案例中,神经元激活的功能可以丢掉,因为它是一个不必要的制动器。
return(NET);
这不是神经网络,只是一个感知器。一个网络至少需要几个感知器。
 
her.human:
在你的情况中,神经元激活功能可以被丢弃,这是一个不必要的制动器。
return(NET);
这不是一个神经网络,它只是一个感知器。一个网络至少需要几个感知器。
你能给我举个例子吗,比如添加 MA 或其他指标或其他东西,以及如何将其全部联网?