专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

神经网络变得轻松(第二部分)网络训练和测试

  内容概述1。定义问题2。神经网络模型项目2。1。判定输入层中神经元的数量2。2。设计隐藏层2。3。判定输出层中神经元的数量3。编程3。1。准备工作3。2。初始化类3。3。训练神经网络3。4。改进梯度计算方法4。测试结束语本文中用到的程序概述
  在上一篇名为神经网络变得轻松的文章中,我们曾研究过利用MQL5配合完全连接的神经网络一起操作的CNet构造原理。在本文中,我将演示一个示例,说明如何在EA中利用该类,并在实际条件下评估该类。
  1。定义问题
  在开始创建智能交易系统之前,必须定义将为新神经网络设定的目标。当然,金融市场上所有智能交易系统的共同目标是获利。然而,此目的太笼统宽泛。我们需要为神经网络指定更具体的任务。甚至,我们需要了解如何评估神经网络的未来结果。
  另一个重要的时刻是,先前创建的CNet类使用了监督学习的原理,因此它需要标记数据作为训练集合。
  如果您查看价格图表,自然会希望在价格峰值时执行交易操作,这可以通过标准的比尔威廉姆斯(BillWilliams)分形指标来示意。而指标的问题在于,它会判断3根烛条的峰值,且产生的信号始终会延迟1根烛条,而这可能会产生相反的信号。如果我们设置神经网络以判定第三根烛条形成之前的枢轴点,该怎么办?这种方法至少会在交易方向移动有一根之前走势的烛条。
  这是指训练集合:在正向递进中,我们会将当前行情状况输入到神经网络,并输出最后一根收盘烛条上提取的形成概率的评估。对于逆向递进中,在下一根烛条形成之后,我们将检查前一根烛条上是否存在分形,并将输入结果按权重调整。
  为了评估网络运算的结果,我们可以使用均方预测误差,正确的分形预测的百分比,和无法识别的分形的百分比。
  现在我们需要判定哪些数据应输入到我们的神经网络中。您还记得,当您尝试根据图表评估行情状况时所做的事情吗?
  首先,建议交易新手从图表中直观评估趋势方向。因此,我们必须将有关价格变动的信息数字化,并将其输入到神经网络中。我建议输入有关的开盘价和收盘价、最高价和最低价、交易量和形成时间的数据。
  另一种判定趋势的流行方法是使用振荡器指标。此类指标操作很方便,因为指标会输出标准化数据。我决定为本次实验准备四个标准指标:RCI,CCI,ATR和MACD,所有指标均带采用标准参数。我在选择指标及其参数时,没有进行任何其他分析。
  有人可能会说利用指标是没有意义的,因为指标的数据是通过重新计算烛条的价格数据而建立的,我们已经将其输入到神经网络当中。但这并非完全正确。指标值是通过计算来自多根烛条的数据来判定的,从而可对所分析的样本进行一定程度的扩展。神经网络训练过程将判定它们如何影响结果。
  为了能够评估行情动态,我们在一定的历史时期内将全部信息输入到神经网络之中。2。神经网络模型项目2。1。判定输入层中神经元的数量
  此处,我们需要知晓输入层中神经元的数量。为此,请评估每根烛条上的初始信息,然后将其乘以分析历史记录的深度。
  由于指标数据已经标准化,且指标缓冲区的相关数量已知,因此无需预处理指标数据(上述4个指标总共有5个值)。因此,若要在输入层中接收这些指标,我们需要为每根所分析烛条创建5个神经元。
  烛条价格数据的情况略有不同。从图表直观地判定趋势方向和强度时,我们首先分析烛条方向和大小。只有在此之后,当我们要判定趋势方向,和可能的枢轴点时,我们要注意所分析品种的价位。因此,有必要在把该数据输入到神经网络之前对其进行标准化。我个人输入了所述烛条的开盘价与收盘价、最高价和最低价的差值。在这种方法中,定义三个神经元就足够了,其中第一个神经元的符号判定烛条方向。
  有许多不同的资料论述了各种时间因素对货币波动的影响。例如,季度线、周线和日线的动态差异,以及欧洲、美洲和亚洲的交易时段,均以不同的方式影响货币汇率。若要分析这些因素,将烛条形成的月份、时刻和星期几输入进神经网络。我特意将烛条形成的时间和日期分为几个部分,因为这可令神经网络能够泛化,并找到依赖性。
  另外,我们来包含有关成交量的信息。如果您的经纪商提供真实的交易量数据,则指明这些交易量;否则指定即时报价的交易量。
  故此,为了应对每根烛条,我们需要12个神经元。将此数字乘以所分析的历史深度,您可得到神经网络输入层的大小。2。2。设计隐藏层
  下一步是准备神经网络的隐藏层。网络结构(层数和神经元数)的选择是最困难的任务之一。单层感知器善于类的线性分离。双层网络可跟踪非线性边界。三层网络可以描述复杂的多连接区域。当我们增加层数时,功能类别会扩展,但这会导致收敛性变差,和训练成本增加。每层当中,神经元的数量必须满足功能的预期变化。实际上,非常简单的网络无法在实际条件下按要求的精度模拟行为,而过于复杂的网络不仅会重复训练目标函数,还有噪声。
  在首篇文章中,我提到了5个为什么方法。现在,我建议继续此实验,并创建一个包含4个隐藏层的网络。我将首个隐藏层中的神经元数量设置为1000。不过,也有可能根据分析周期的深度建立一些依赖关系。遵照帕累托(Pareto)规则,我们将每个后续层中的神经元数量减少70。此外,将遵循如下限制:隐藏层中的神经元数量不得少于20。2。3。判定输出层中神经元的数量
  输出层当中神经元的数量取决于任务,及其解决方案。若要解决回归问题,只需要一个神经元就能产生期望值即可。为了解决分类问题,我们需要与期望的类数量相等的神经元每个神经元将为分配给每个类的原始对象生成概率。而在实际中,对象的类别由最大概率判定。
  对于我们的情况,我建议创建2个神经网络变体,并评估它们在实践中应对我们之问题的适用性。在第一种情况下,输出层仅有一个神经元。数值在0。5。。。1。0范围内与买入分形对应,而数值在0。5。。1。0范围内与卖出信号对应,数值在0。5。。。0。5范围内表示没有信号。在此解决方案中,双曲正切用作激活函数它的输出值范围为1。0到1。0。
  在第二种情况下,将在输出层中创建3个神经元(买、卖、无信号)。在这个变体中,我们来训练神经网络,从而获得范围为0。0。。。1。0的结果。在此,结果就是分形出现的概率。信号将依据最大概率来判定,并根据含有最高概率的神经元的索引来判定信号的方向。3。编程3。1。准备工作
  现在,到编程的时候了。首先,加入所需的函数库:NeuroNet。mqh前一篇文章中创建神经网络的函数库SymbolInfo。mqh接收品种数据的标准库TimeSeries。mqh处理时间序列的标准库Volumes。mqh接收交易量数据的标准库Oscilators。mqh含有振荡器类的标准库includeNeuroNet。mqhincludeTradeSymbolInfo。mqhincludeIndicatorsTimeSeries。mqhincludeIndicatorsVolumes。mqhincludeIndicatorsOscilators。mqh
  下一步是编写程序参数,通过它们来设置神经网络和指标参数。inputparametersinputintStudyPeriod10;Studyperiod,yearsinputuintHistoryBars20;DepthofhistoryENUMTIMEFRAMESTimeFramePERIODCURRENT;inputgroupRSIinputintRSIPeriod14;PeriodinputENUMAPPLIEDPRICERSIPricePRICECLOSE;AppliedpriceinputgroupCCIinputintCCIPeriod14;PeriodinputENUMAPPLIEDPRICECCIPricePRICETYPICAL;AppliedpriceinputgroupATRinputintATRPeriod14;PeriodinputgroupMACDinputintFastPeriod12;FastinputintSlowPeriod26;SlowinputintSignalPeriod9;SignalinputENUMAPPLIEDPRICEMACDPricePRICECLOSE;Appliedprice
  接下来,声明全局变量稍后会讲解它们的用法。CSymbolInfoSymb;CiOpenOpen;CiCloseClose;CiHighHigh;CiLowLow;CiVolumesVolumes;CiTimeTime;CNetNet;CArrayDoubleTempData;CiRSIRSI;CiCCICCI;CiATRATR;CiMACDMACD;doubledError;doubledUndefine;doubledForecast;doubledPrevSignal;datetimedtStudied;boolbEventStudy;
  准备工作至此完成。现在继续进行类的初始化。3。2初始化类
  类的初始化将在OnInit函数中执行。首先,我们创建处理品种的CSymbolInfo类的实例,并更新有关图表品种的数据。ExpertinitializationfunctionintOnInit(){SymbnewCSymbolInfo();if(CheckPointer(Symb)POINTERINVALID!Symb。Name(Symbol))returnINITFAILED;Symb。Refresh();
  然后创建时间序列实例。在您每次创建类实例时,请检查它是否已成功创建,并初始化。如果发生错误,则以INITFAILED作为结果退出函数。OpennewCiOpen();if(CheckPointer(Open)POINTERINVALID!Open。Create(Symb。Name(),TimeFrame))returnINITFAILED;ClosenewCiClose();if(CheckPointer(Close)POINTERINVALID!Close。Create(Symb。Name(),TimeFrame))returnINITFAILED;HighnewCiHigh();if(CheckPointer(High)POINTERINVALID!High。Create(Symb。Name(),TimeFrame))returnINITFAILED;LownewCiLow();if(CheckPointer(Low)POINTERINVALID!Low。Create(Symb。Name(),TimeFrame))returnINITFAILED;VolumesnewCiVolumes();if(CheckPointer(Volumes)POINTERINVALID!Volumes。Create(Symb。Name(),TimeFrame,VOLUMETICK))returnINITFAILED;TimenewCiTime();if(CheckPointer(Time)POINTERINVALID!Time。Create(Symb。Name(),TimeFrame))returnINITFAILED;
  在此示例中采用了即时报价交易量。若您希望采用真实交易量,则在调用Volumes。Creare方法时将VOLUMETICK替换为VOLUMEREAL。
  在声明了时间序列之后,创建类的实例,从而以类似方式使用指标。RSInewCiRSI();if(CheckPointer(RSI)POINTERINVALID!RSI。Create(Symb。Name(),TimeFrame,RSIPeriod,RSIPrice))returnINITFAILED;CCInewCiCCI();if(CheckPointer(CCI)POINTERINVALID!CCI。Create(Symb。Name(),TimeFrame,CCIPeriod,CCIPrice))returnINITFAILED;ATRnewCiATR();if(CheckPointer(ATR)POINTERINVALID!ATR。Create(Symb。Name(),TimeFrame,ATRPeriod))returnINITFAILED;MACDnewCiMACD();if(CheckPointer(MACD)POINTERINVALID!MACD。Create(Symb。Name(),TimeFrame,FastPeriod,SlowPeriod,SignalPeriod,MACDPrice))returnINITFAILED;
  现在我们可以直接利用神经网络类运作了。首先,创建一个类的实例。在CNet类初始化期间,构造函数参数会将引用传递给含有网络结构规范的数组。请注意,网络训练过程当中会消耗计算资源,且会花费大量时间。因此,每次重启之后,网络都是不正确的,需要训练。此处是我如何操作的:首先,我在声明网络实例时未指定结构,然后尝试从本地存储加载先前已训练过的网络(文件名在define中提供)。defineFileNameSymb。Name()EnumToString((ENUMTIMEFRAMES)Period())IntegerToString(HistoryBars,3)frea。。。。。。。。。。。。NetnewCNet(NULL);ResetLastError();if(CheckPointer(Net)POINTERINVALID!Net。Load(FileName。nnw,dError,dUndefine,dForecast,dtStudied,false)){printf(sdErrorofreadsprevNetd,FUNCTION,LINE,FileName。nnw,GetLastError());
  如果无法加载先前已训练的数据,则会将消息打印到日志,指示错误代码,然后开始创建新的未经训练的网络。首先,声明CArrayInt类的实例,并指定神经网络的结构。元素的数量表示神经网络层的数量,而元素的数值表示相应层中神经元的数量。CArrayIntTopologynewCArrayInt();if(CheckPointer(Topology)POINTERINVALID)returnINITFAILED;
  正如早前所提到的,我们在输入层中需要12个神经元来应对每根烛条。因此,在第一个数组元素中,用12乘以所分析历史记录的深度。if(!Topology。Add(HistoryBars12))returnINITFAILED;
  然后定义隐藏层。我们已判定在第一个隐藏层中将包括4个含1000个神经元的隐藏层。然后,在后续的每个层中,神经元的数量将减少70,但每一层至少含有20个神经元。数据将循环添加到数组当中。intn1000;boolresulttrue;for(inti0;(i4result);i){result(Topology。Add(n)result);n(int)MathMax(n0。3,20);}if(!result){deleteTopology;returnINITFAILED;}
  在输出层中指示1来构建回归模型。if(!Topology。Add(1))returnINITFAILED;
  如果我们采用分类模型,则需要为输出神经元指定3。
  接下来,删除先前创建的CNet类实例,并创建一个新实例,并在其中指明要创建的神经网络的结构。创建新的神经网络实例后,删除网络结构的类,因为以后不会再用到它。deleteNet;NetnewCNet(Topology);deleteTopology;if(CheckPointer(Net)POINTERINVALID)returnINITFAILED;
  设置变量的初始值,以便收集统计数据:dError标准偏差(误差)dUndefine未定义分形的百分比dForecast正确预测分形的百分比dtStudied最后一根已训练烛条的日期。dError1;dUndefine0;dForecast0;dtStudied0;}
  不要忘记,只当没有先前训练过的神经网络,无需从本地存储加载的情况下,我们才需要设置神经网络结构,创建神经网络类的新实例,并初始化统计变量。
  在OnInit函数的末尾,创建CArrayDouble()类的实例,该实例用来与神经网络交换数据,并开始神经网络训练过程。
  我想在这里分享另一种解决方案。MQL5不支持异步函数调用。如果我们从OnInit函数显式调用学习函数,则终端将误认为程序初始化过程尚未完成,直到训练完成。这就是为什么我们要创建一个自定义事件,从OnChartEvent函数调用该训练函数,替代直接调用该函数的原因。创建事件时,请在lparam参数中指定训练开始日期。这种方法可令我们调用函数,并完成OnInit函数。TempDatanewCArrayDouble();if(CheckPointer(TempData)POINTERINVALID)returnINITFAILED;bEventStudyEventChartCustom(ChartID(),1,(long)MathMax(0,MathMin(iTime(Symb。Name(),PERIODCURRENT,(int)(100Net。recentAverageSmoothingFactor(dForecast70?1:10))),dtStudied)),0,Init);return(INITSUCCEEDED);}ChartEventfunctionvoidOnChartEvent(constintid,constlonglparam,constdoubledparam,conststringsparam){if(id1001){Train(lparam);bEventStudyfalse;OnTick();}}
  不要忘记清除OnDeinit函数中的内存。ExpertdeinitializationfunctionvoidOnDeinit(constintreason){if(CheckPointer(Symb)!POINTERINVALID)deleteSymb;if(CheckPointer(Open)!POINTERINVALID)deleteOpen;if(CheckPointer(Close)!POINTERINVALID)deleteClose;if(CheckPointer(High)!POINTERINVALID)deleteHigh;if(CheckPointer(Low)!POINTERINVALID)deleteLow;if(CheckPointer(Time)!POINTERINVALID)deleteTime;if(CheckPointer(Volumes)!POINTERINVALID)deleteVolumes;if(CheckPointer(RSI)!POINTERINVALID)deleteRSI;if(CheckPointer(CCI)!POINTERINVALID)deleteCCI;if(CheckPointer(ATR)!POINTERINVALID)deleteATR;if(CheckPointer(MACD)!POINTERINVALID)deleteMACD;if(CheckPointer(Net)!POINTERINVALID)deleteNet;if(CheckPointer(TempData)!POINTERINVALID)deleteTempData;}3。3。训练神经网络
  为了训练神经网络,创建Train函数。训练期的开始日期应作为参数传递给函数。voidTrain(datetimeStartTrainBar0)
  在函数伊始声明局部变量:count学习期计数prevun前一学习期内未识别分形的百分比prevfor前一学习期内分形正确预测的百分比prever前一个学习期的误差bartime重新计算酒吧日期stop用于跟踪强制程序终止调用的标志。intcount0;doubleprevup1;doubleprevfor1;doubleprever1;datetimebartime0;boolstopIsStopped();MqlDateTimesTime;
  接下来,检查在函数参数中获得的日期是否未超过最初指定的训练周期。MqlDateTimestarttime;TimeCurrent(starttime);starttime。yearStudyPeriod;if(starttime。year0)starttime。year1900;datetimesttimeStructToTime(starttime);dtStudiedMathMax(StartTrainBar,sttime);
  神经网络训练将在dowhile循环语句中实现。在循环开始时,重新计算训练神经网络所需历史柱线数量,并保存先前的递次统计信息。do{intbars(int)MathMin(Bars(Symb。Name(),TimeFrame,dtStudied,TimeCurrent())HistoryBars,Bars(Symb。Name(),TimeFrame));prevundUndefine;prevfordForecast;preverdError;ENUMSIGNALbarUndefine;
  然后,调整缓冲区的大小,并加载必要的历史数据。if(!Open。BufferResize(bars)!Close。BufferResize(bars)!High。BufferResize(bars)!Low。BufferResize(bars)!Time。BufferResize(bars)!RSI。BufferResize(bars)!CCI。BufferResize(bars)!ATR。BufferResize(bars)!MACD。BufferResize(bars)!Volumes。BufferResize(bars))break;Open。Refresh(OBJALLPERIODS);Close。Refresh(OBJALLPERIODS);High。Refresh(OBJALLPERIODS);Low。Refresh(OBJALLPERIODS);Volumes。Refresh(OBJALLPERIODS);Time。Refresh(OBJALLPERIODS);RSI。Refresh(OBJALLPERIODS);CCI。Refresh(OBJALLPERIODS);ATR。Refresh(OBJALLPERIODS);MACD。Refresh(OBJALLPERIODS);
  更新跟踪强制程序终止的标志,并声明一个新的标志,指示学习期已经过去(addloop)。stopIsStopped();booladdloopfalse;
  遍历所有历史数据来组织嵌套的训练循环。在循环的伊始,检查历史数据是否已触及末尾。如有必要,更改addloop标志。另外,在图表上用注释显示神经网络训练的当前状态。这将有助于监视训练过程。for(inti(int)(barsMathMax(HistoryBars,0)1);i0!stop;i){if(i0)addlooptrue;stringsStringFormat(StudyErad。2fUndefine。2fforacast。2fdofd。2fError。2fs。2f,count,dError,dUndefine,dForecast,barsi1,bars,(double)(barsi1。0)bars100,Net。getRecentAverageError(),EnumToString(DoubleToSignal(dPrevSignal)),dPrevSignal);Comment(s);
  然后检查循环的上一步是否已计算出预测的系统状态。如果有,则沿正确值的方向调整权重。为此,清除TempData数组的内容,检查在上一根烛条上是否分形已形成,然后向TempData数组添加正确的值(以下是在输出层中含有一个神经元的回归神经网络的代码)。之后,调用神经网络的backProp方法,把TempData数组的引用作为参数传递。更新dForecast(正确预测分形的百分比)和dUndefine(无法识别分形的百分比)中的统计数据。if(i(int)(barsMathMax(HistoryBars,0)1)i1Time。GetData(i)dtStudieddPrevSignal!2){TempData。Clear();boolsell(High。GetData(i2)High。GetData(i1)High。GetData(i)High。GetData(i1));boolbuy(Low。GetData(i2)Low。GetData(i1)Low。GetData(i)Low。GetData(i1));TempData。Add(buy!sell?1:!buysell?1:0);Net。backProp(TempData);if(DoubleToSignal(dPrevSignal)!Undefine){if(DoubleToSignal(dPrevSignal)DoubleToSignal(TempData。At(0)))dForecast(100dForecast)Net。recentAverageSmoothingFactor;elsedForecastdForecastNet。recentAverageSmoothingFactor;dUndefinedUndefineNet。recentAverageSmoothingFactor;}else{if(sellbuy)dUndefine(100dUndefine)Net。recentAverageSmoothingFactor;}}
  调整神经网络权重系数后,计算在当前历史柱线上出现分形的概率(如果等于0,则计算在当前柱线上形成分形的概率)。为此,清除TempData数组,并将神经网络输入层的当前数据添加到其中。如果数据添加失败或没有足够的数据,则退出循环。TempData。Clear();intri(int)HistoryBars;if(rbars)continue;for(intb0;b(int)HistoryBars;b){intbartrb;doubleopenOpen。GetData(bart);TimeToStruct(Time。GetData(bart),sTime);if(openEMPTYVALUE!TempData。Add(Close。GetData(bart)open)!TempData。Add(High。GetData(bart)open)!TempData。Add(Low。GetData(bart)open)!TempData。Add(Volumes。Main(bart)1000)!TempData。Add(sTime。mon)!TempData。Add(sTime。hour)!TempData。Add(sTime。dayofweek)!TempData。Add(RSI。Main(bart))!TempData。Add(CCI。Main(bart))!TempData。Add(ATR。Main(bart))!TempData。Add(MACD。Main(bart))!TempData。Add(MACD。Signal(bart)))break;}if(TempData。Total()(int)HistoryBars12)break;
  准备好初始数据后,运行feedForward方法,并将神经网络结果写入dPrevSignal变量。以下是在输出层中含有一个神经元的回归神经网络的代码。在输出层中含有三个神经元的分类神经网络的代码随附于后。Net。feedForward(TempData);Net。getResults(TempData);dPrevSignalTempData〔0〕;
  为了在图表上可视化神经网络的操作,显示最后200根蜡烛的预测分形的标签。bartimeTime。GetData(i);if(i200){if(DoubleToSignal(dPrevSignal)Undefine)DeleteObject(bartime);elseDrawObject(bartime,dPrevSignal,High。GetData(i),Low。GetData(i));}
  在历史数据周期结束时,更新强制程序终止的标志。stopIsStopped();}
  一旦在所有可用的历史数据上针对神经网络进行了训练,就可以增加训练期的计数,并将神经网络的当前状态保存到本地文件之中。下次启动神经网络数据时,我们将会用到此数据。if(addloop)count;if(!stop){dErrorNet。getRecentAverageError();if(addloop){Net。Save(FileName。nnw,dError,dUndefine,dForecast,dtStudied,false);printf(Eraderror。2fforecast。2f,count,dError,dForecast);}}
  最后,指定退出训练循环的条件。条件可以如下:接收信号表示所达目标高于预定级别以上的概率;达到目标误差参数;或在训练期之后,统计数据没有变化,或变化不大(训练停止在局部最小值处)。您可以自行定义退出训练过程的条件。}while((!(DoubleToSignal(dPrevSignal)!UndefinedForecast70)!(dError0。1MathAbs(dErrorprever)0。01MathAbs(dUndefineprevup)0。1MathAbs(dForecastprevfor)0。1))!stop);
  在退出训练函数之前,请保存最后一根已训练烛条的时间。if(count0){dtStudiedbartime;}}3。4。改进梯度计算方法
  我想提请您注意,我在测试过程中发现的如下几点。当训练神经网络时,在某些情况下,隐藏层神经元的权重系数不受控制地增加,这是因为超出了最大允许变量值,结果导致整个神经网络瘫痪了。当随后的层错误要求神经元输出的数值,超出了激活函数可能的数值范围时,就会发生这种情况。我找到的解决方案是标准化神经元的目标值。经调整后的梯度计算方法代码如下所示。voidCNeuron::calcOutputGradients(doubletargetVals){doubledelta(targetVals1?1:targetVals1?1:targetVals)outputVal;gradient(delta!0?deltaCNeuron::activationFunctionDerivative(targetVals):0);}
  附件中提供了所有方法和函数的完整代码。4。测试
  在H1时间帧内,在EURUSD对上进行了神经网络的测试训练。将20根烛条的数据输入到神经网络。针对最近两年进行了训练。为了检查结果,我在同一终端的两张图表上同时启动了这个智能交易系统:一个EA具有回归神经网络(分形输出层中有1个神经元),另一个则是分类神经网络(Fractal2输出层中有3个神经元的分类)。
  第一个训练期是12432根柱线,历时2小时20分钟。两种EA的表现相似,命中率刚超过6。
  第一个训练期强烈依赖于在初始阶段随机选择的神经网络的权重。
  经过35期的训练,统计数据的差异略有增加回归神经网络模型的效果更好:
  数值
  回归神经网络
  分类神经网络
  根均方误差
  0。68
  0。78
  命中率
  12。68
  11。22
  未识别的分形
  20。22
  24。65
  测试结果表明,两种神经网络组织变体在训练时间和预测准确性方面产生的结果相似。于此同时,获得的结果表明神经网络需要额外的时间和资源进行训练。如果您希望分析神经网络的学习动态,请查看附件中每个学习期的屏幕截图。结束语
  在本文中,我们研究了神经网络创建、训练和测试的过程。获得的结果表明,这种技术有潜在的利用价值。然而,神经网络训练过程会消耗大量计算资源,并会花费大量时间。本文中用到的程序
  发行
  类型
  说明
  ExpertsNeuroNetDNG
  1hrFractal。mq5
  智能交易系统
  一款含有回归神经网络(输出层中有1个神经元)的智能交易系统
  2hrFractal2。mq5
  智能交易系统
  一款含有分类神经网络的智能交易系统(输出层中有3个神经元)
  3hrNeuroNet。mqh
  类库
  创建神经网络(感知器)的类库
  Files
  4hrFractal
  目录
  包含显示回归神经网络测试的屏幕截图
  5hrFractal2
  目录
  包含显示分类神经网络测试的屏幕截图

万若愚作品四川古代名人画册(叁)四川古代名人赋黄帝画野,始分郡邑。大禹导江,初奠山川。岷山巍峨,长江浩荡,夔巫险峻,嘉陵流淌。巴蜀之地,盈江春水,沃野千里,阡陌纵横。北连秦陇,南接衡湘,西通藏卫,东达荆楚。雪岭光孝庄才貌双全,太宗册封崇德五妃时为何排最后?其中两位还是二婚1636年皇太极改后金为大清,正式登基称帝,并大封后宫,册封五宫后妃蒙古科尔沁贝勒莽古思的女儿哲哲,被封为中宫皇后,居住清宁宫蒙古科尔沁寨桑贝勒的女儿海兰珠,被封为宸妃,居住关雎宫寡妇邹氏到底有什么本事,能够赢得一代枭雄曹操欢心大家都知道历史上的曹操虽为一代枭雄,可是私生活方面有些奇特,就是喜欢寡妇,估计是觉得寡妇比起黄花闺女更懂得男人的心吧!那么,曹操喜欢的第一个寡妇是谁呢?她就是张济的妻子也是张绣的婶历史上4个消失人物,有一个是徐福,有一个成仙,他们到底去哪了第一个传奇人物徐福徐福是秦代著名方士鬼谷子的关门弟子。秦始皇为了长生不老,派徐福两次出海寻找仙药。电视剧大秦赋剧照史记秦始皇本纪有记载,秦始皇二十八年,命令徐福率3000童男童女几如何拒绝毒鸡汤诸葛亮绝不会问刘备,为什么我们没有箭?拒绝毒鸡汤的方法有很多,比如刘备绝不会讽刺诸葛亮你的隆中对只是个PPT,要实事求是。大学刚毕业要加强历练,不要天马行空,白日做梦。大耳绝不会计较关二哥我知道你在单位干满35,能力突玄武门之变发动的根本原因竟是李世民被骗三次!历史上赫赫有名的玄武门之变,使得李世民走上了权利的巅峰,但也成为后世抨击他的把柄,那么他为什么要发动这场政变呢?引导他政变的导火索又是什么呢?中国历史上大名鼎鼎的玄武门之变无人不知说说秦始皇的三公九卿和郡县制头条创作挑战赛史记以前的东周列国,各国官员组织很乱很杂,于是秦始皇先生决定采用三公九卿制度,听起来是不是感觉非常高大上,其实呢,关系如下图秦始皇(老大)手下的三个人管打仗的管国家事阅读资治通鉴恶毒的吕后恶毒的吕后刘邦做了皇帝以后,就把自己的正室妻子吕雉封为皇后。这样一来,吕后的儿子刘盈也就顺理成章地被立为太子,成了刘邦的继承人。可是刘盈并不争气,在性格上十分懦弱。刘邦打心眼里看不河南老汉收养日本伤兵,当亲兄弟供养47年,后来怎么样了?他是一个普普通通的农民,却扛着外界的压力照顾日本弃兵,四十多年从未间断,因为这件事,导致他的孩子失去了上大学的机会,即便这样他们一家也无怨无悔。这些年里他们一家也从未停下帮日本兵找被丈夫当街施暴后,她的左手掌长了层厚厚的鳞片检察官,救救我妹妹吧,你们再不救她,她就没命了!2022年2月,家住北京市丰台区的赵萧霞通过丰台区妇联联系到丰台区检察院,语气焦急地向检察官讲述了自己妹妹赵萧丹被丈夫王明军家暴虐待致敬贝利巴西传奇足球运动员贝利去世的消息震惊了全世界。国王被广泛认为是有史以来最伟大的足球运动员,他的绰号成为形容某人卓越和令人叹为观止的技术的形容词。尽管EdsonArantesdoNa
负债必看3步教你快速还清债务轻松上岸你知道自己背了多少负债吗?是不是快到还钱那几天总是特别心慌?还完了这笔,下一笔又能否安全度过呢?如果你借了钱,大到房贷车贷,小到消费分期信用卡小额借贷,一定要耐心看完这期视频,下面创NBA历史纪录!恭喜詹姆斯将成为球员兼4支球队老板的球星北京时间8月31号,NBA交易市场正在火热进行中,联赛各队都在积极备战着,力争帮助球队在今夏完成阵容的升级补强,以在新赛季拿到更多场次的胜利,吸引了数以万计球迷的目光。与此同时,交8月29日A股猛料多部委下发重要通知!利好5板块将创历史新高聚焦A股市场每日重磅消息,为2亿散户点明投资方向!在阅读正文前,你必须知道一点没有几个主力资金会笨到在利好一出炉就将股价直线拉升到涨停,所以请股民朋友们耐心一点,让利好飞一会,也许王者荣耀9月1日更新赵云阿古朵赢麻了,宫本又一次被削弱大家好,又到了给大家讲解王者荣耀这款游戏的时间,9月1号王者荣耀正式服更新,这次调整得比较多,比如说kpl英雄皮肤返场,多位英雄技能平衡性调整,很多玩家看到英雄增强或者是削弱就会感关羽传说级加强,荣耀典藏周年庆上线?后羿玩家得到补偿大家好,这里是峡谷热点报,将会给你带来王者荣耀最新的爆料内容。随着王者荣耀正式服更新之后,没想到王者荣耀体验服也迎来了一波更新,而且这次更新的内容引起了广大玩家的热议。首先就是关于中医肝郁气滞型失眠治疗原则与方法快问中医超能团肝郁气滞失眠大部分是因为生气,导致身体肝郁气滞导致的失眠情况,患者伴有两肋胀痛彻夜不眠干恶口苦急躁易怒多梦出现头晕头胀目赤耳鸣口干不思饮食舌苔黄腻脉弦等症状。中医学认睡姿不对易伤身!这2种睡姿比较推荐,看看你适合哪种大多数人在睡觉时没有特别讲究姿势,总觉得怎么舒服怎么来,因此在睡觉时姿势各异。实际上,想要保护身体,维持骨骼健康,睡觉时姿势应该讲究,选择最恰当的,才能提高睡眠质量的同时减少压迫,它是天然叶酸,隔三差五吃一次,美容养颜又滋补,2元钱一斤如果你也喜欢美食,点击关注,每天不断更新精彩内容!导语它是天然叶酸,隔三差五吃一次,美容养颜又滋补,2元钱一斤!相信大家也知道这个季节在当年,天气越来越热的时候,但是温差却很大,这常按4个穴位,失眠不来找!助你一觉到天亮俗话说三寒两倒七分饱,是健康百岁的三大法宝。对于人体来说,阳气盛时工作效率最高,因此,白天应尽可能多劳作,待有一定疲劳困乏感后,利用夜间阴气盛的时机休眠。提升睡眠小技巧01保证白天把白开水放置16个小时以上,或比慢性毒药?喝水别踩几个误区白开水,在日常生活中,是非常常见的水资源之一,也叫凉白开冻滚水,是多数群体喝得最多的水资源之一,因无色无味,几乎没有热量,对身体健康来说至关重要,更是仅次于氧气般的存在。据统计发现比猪肉补人,比鸡肉更鲜!这种肉,最近别错过,常吃还不容易上火处暑已过,而处暑即出暑,代表炎热的夏天要结束了。俗语处暑送鸭,无病各家。处暑后吃鸭肉有不少好处,看看你都知道吗?1hr鸭肉的营养优势1清热补虚中医认为,鸭肉性寒味甘寒,入脾胃肾肺经
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网