资料库: ALGLIB - 数值分析库 - 页 4

 
Yury Kulikov:

漂亮的 MQ!

使用该库的一个例子是教 MLP 神经网络学习乘法表。


:( 当用户开始在他们的专家中积极使用该库时,我真不敢想象云计算会发生什么。
这个简单的脚本不到一兆字节。


相同,但用于 RF:

计数不太准确,我应该尝试调整一下

#include <Math\Alglib\dataanalysis.mqh>
//+------------------------------------------------------------------+
#define _rand(min,max) ((rand()/(double)SHORT_MAX)*((max)-(min))+min)
//+------------------------------------------------------------------+
void OnStart()
{
   CDecisionForest      Trf;
   CDecisionForestShell RFshell;
   CMatrixDouble        PatternsMatrix;
   CDFReport            RF_report;
   int RFinfo;
   double vector[2], out[1];
   
   // 数据准备
   PatternsMatrix.Resize(100,3);
   int m=0;     // 第一种模式
   for(int i=1; i<=10; i++)
      for(int j=1; j<=10; j++)
      {
         PatternsMatrix[m].Set(0,i/10.0);       // 输入 1
         PatternsMatrix[m].Set(1,j/10.0);       // 输入 2
         PatternsMatrix[m].Set(2,(i*j)/100.0);  // 目标
         m++; //下一个模式
      }
   // 射频创建。
   CDForest::DFBuildRandomDecisionForest(PatternsMatrix,100,2,1,50,0.4,RFinfo,Trf,RF_report);
   Print("Info=",RFinfo,"  Error=",CDForest::DFAvgError(Trf,PatternsMatrix,100));  
   // 检查网络上的整数数据
   string s="测试 1 >> ";
   for(int i=1; i<=10; i++)
   {
      int d1=(int)_rand(1,10), d2=(int)_rand(1,10);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
      CDForest::DFProcess(Trf,vector,out);
      s+=(string)d1+"*"+(string)d2+"="+DoubleToString(out[0]*100,0)+" // ";
   }
   Print(s);
   // 检查分数数据的网络
   s="测试 2 >> ";
   for(int i=1; i<=5; i++)
   {
      double d1=NormalizeDouble(_rand(1,10),1), d2=NormalizeDouble(_rand(1,10),1);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
       CDForest::DFProcess(Trf,vector,out);
      s+=DoubleToString(d1,1)+"*"+DoubleToString(d2,1)+"="+DoubleToString(out[0]*100,2)+
         "("+DoubleToString(d1*d2,2)+") // ";
   }
   Print(s);
}
2017.09.04 21:43:21.609 RF sample (EURUSD,H1)   Info=1  Error=0.01861400000000001
2017.09.04 21:43:21.610 RF sample (EURUSD,H1)   Тест 1 >> 6*9=55 // 7*3=21 // 6*6=38 // 9*7=65 // 9*9=80 // 8*4=32 // 4*1=6 // 1*8=13 // 4*3=12 // 2*2=5 // 
2017.09.04 21:43:21.610 RF sample (EURUSD,H1)   Тест 2 >> 7.7*5.8=46.64(44.66) // 3.0*3.3=9.70(9.90) // 6.0*9.2=55.32(55.20) // 2.6*6.7=20.08(17.42) // 2.5*4.0=12.54(10.00) // 

PS

CDForest::DFBuildRandomDecisionForest(PatternsMatrix,100,2,1,500,1,RFinfo,Trf,RF_report);

它更准确了,500 个古老的数据,r=1,拟合度更高,噪音更小。

2017.09.04 22:08:33.227 RF sample (EURUSD,H1)   Info=1  Error=2.02997341158806 e-15
2017.09.04 22:08:33.228 RF sample (EURUSD,H1)   Тест 1 >> 2*2=4 // 2*6=12 // 1*9=9 // 9*1=9 // 4*7=28 // 9*6=54 // 5*6=30 // 5*5=25 // 4*1=4 // 1*4=4 // 
2017.09.04 22:08:33.230 RF sample (EURUSD,H1)   Тест 2 >> 4.0*3.8=16.00(15.20) // 9.6*3.1=30.00(29.76) // 5.5*6.4=36.00(35.20) // 4.0*4.4=16.00(17.60) // 1.6*4.2=8.00(6.72) // 
 
Maxim Dmitrievsky:


射频也是如此:

认为不够准确,需要尝试调整

PS

这种方法更准确,500 棵树,r=1,拟合度更高,噪音更小。

我想知道需要做多少棵树才能使结果准确?而且这是最简单的乘法表,如果有几个函数,我们需要通过 RF 而不是乘法表来运行,那么答案从远处看显然会像一些公平的东西?
 
MQL5库确实很强大,就是确实如何调用库的更详细的介绍
 

关于交易、自动交易系统和测试交易策略的论坛

错误、漏洞和问题

Andrey Khatimlianskii, 2019.01.30 04:57 AM

MQL5\Include\Math\AlgLib\dataanalysis.mqh - CLinReg::LRLine 对1M及以上的值不起作用?

有人知道吗?

 

谢谢@ 拉希德-乌马罗夫

我建议大家访问网站,因为这个主题已经更新了 3 年,但网站一直在更新。

 

我们对基于 GPL C++ 版本的 ALGLIB 库 进行了全面修订,将其发布为 ALGLIB++。这跟踪了 ALGLIB 的最新版本,即截至 2019/12 的 3.16.0。自 MQL5 与之同步的早期版本以来,优化和插值模块中增加了许多内容(例如,点云样条(!)、更多反向距离加权插值方法、大量附加优化方法等)。

ALGLIB++ 是 ALGLIB 的衍生版本,在长期的重新设计/重构过程中被用作中间形式,它将被重新编码为本地 C++(类似于第 3 版之前的情况),多余的层和重复的部分将被移除,以便为多线程提供更直接的支持,以及额外的测试和模块,并最终提供脚本语言前端。

ALGLIB 的不同语言版本都是从一个共同的核心生成的,其中 C++ 版本对 C90 C 语言方言提供了有限的(但非官方的)支持。这一特性使得有必要在 C 语言中模拟原本属于 C++ 的功能,然后在此基础上提供一个 C++ 封装。因此,有两个独立的命名空间:alglib_impl(包含 C 语言版本)和 alglib(包含 C++ 封装)。ALGLIB++ 尽可能保留了大部分结构和原始编码,但减少或取消了大部分全局基础结构,作为取消这些基础结构并代之以多线程本地 C++ 代码的第一步,并大大简化了 C++ 封装器接口。因此,它是连接 ALGLIB 本身和 ALGLIB++ 正在转变成的未来库的中间形式。


自 MQL5 采用的版本以来(以及之前),导致 ALGLIB 复杂性增加的许多问题已得到解决,从而简化了结构并降低了复杂性。对于目前维护 MQL5 版本 ALGLIB 的用户来说,目前的 ALGLIB 应该更容易适应 MQL5。

随发行版附带的是 ALGLIB++ 手册,该手册从 ALGLIB C++ 原版进行了全面重新格式化。不过,有关包和子包的部分与两个版本的 ALGLIB 都兼容,其布局和内容都能轻松适应 MQL5 版本。手册的 "参考文献和相关链接 "部分对 MQL5 进行了介绍。


最新版本可在以便将来 集成到 ALGLIB++ 中。其他库,包括 MKL(顺便说一下,它有神经网络例程)也在考虑将来整合到 ALGLIB++ 中。

LydiaMarieWilliamson/ALGLIB_cpp
LydiaMarieWilliamson/ALGLIB_cpp
  • LydiaMarieWilliamson
  • github.com
Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Permalink
 
给 ALGLIB MQL5 版本开发人员的一些补充说明:

当您将 ALGLIB 改编为 MQL5 时,您在 "RCOMM "例程方面遇到了困难。

这些例程实际上是多线程例程,通过以下方式将线程切换直接写入代码:
(1) 在每次进入和退出时缓存线程本地变量--迭代例程可能执行数百万乃至数十亿次调用/返回循环!
(2) 在事件发生时跳出例程 "暂停",在事件发生后跳回例程 "继续",从而实现线程切换--这意味着大量的 "goto "和多个入口点。
(3) 简化这些例程的控制流结构,以便将入口点放在函数体的顶层。

在将 ALGLIB 改编为 MQL5 时,您保留了控制流分解,实际上是将代码片段分拆成独立的例程。正如您最终发现的那样,这种解决方案是不可维护的;这使得 ALGLIB 更新无法跟上。ALGLIB 本身也有点落后于时代--他们的 RCOMM 例程有时会留下早期版本的孤儿结构和变量。

在 ALGLIB++ 中,控制流结构被重新整合:入口点跳回循环或其他控制流结构的中间位置。
线程本地变量没有缓存;目前它们已被静态化(以线程安全为代价--但多线程并非 GPL ALGLIB 的正式组成部分)。
与 ALGLIB 一样,这意味着需要使用大量的 goto 语句来完成所有的来回跳转,但这些语句的组织更加简洁。
根据我们的测试结果,ALGLIB++ 所做的修复本身可将例程速度提高约 20-25%。

有两种方法可以处理这种架构,以摆脱 goto 语句,并更妥善地处理线程本地变量:
(1) 实现实际的线程切换,这意味着 RCOMM 例程会发送 "事件 "消息(这正是 needf、... algpowerup 标志的实际含义),而调用者必须设置一个事件处理程序来接收和处理这些消息。但不确定 MQL5 是否能生成和处理用户定义的事件。
(2) 为事件使用函数指针。
请记住,RCOMM 例程可能是嵌套的;在某些情况下,它们可以将从它们自己调用的 RCOMM 例程中获得的事件转发给它们的调用者。

ALGLIB 开发人员在实施 ALGLIB 时决定不使用函数指针或多线程,因为 ALGLIB 首次发布时,任何广泛传播和广泛使用的语言都不支持多线程编程,而且并非 ALGLIB 所针对的所有语言都与 C 和 C++ 的函数指针具有相同或类似的等效功能。但 MQL5 有函数指针。如果将 ALGLIB 改编为 MQL5,由于控制流结构的重新整合,从 ALGLIB++ 进行改编会容易得多。

然而,理想的解决方案是使用线程切换。最终,ALGLIB++ 将使用函数指针或线程切换;我们尚未决定采用哪种方式。

 
LydiaMW:
给 ALGLIB MQL5 版本开发人员的几点补充说明:

当您将 ALGLIB 改编为 MQL5 时,您在 "RCOMM "例程方面遇到了困难。

这些例程实际上是多线程例程,线程切换直接写入代码中:
(1) 在每次进入和退出时缓存线程本地变量--迭代例程可能会执行数百万乃至数十亿次的调用/返回循环!
(2) 在事件发生时跳出例程 "暂停",在事件发生后跳回例程 "继续",从而实现线程切换--这意味着需要大量的 "goto "和多个入口点。
(3) 简化这些例程的控制流结构,以便将入口点放在函数体的顶层。

在将 ALGLIB 改编为 MQL5 时,您保留了控制流分解,实际上是将代码片段分拆成独立的例程。正如您最终发现的那样,这种解决方案是不可维护的;这使得 ALGLIB 更新无法跟上。ALGLIB 本身也有点落后于时代--他们的 RCOMM 例程有时会留下早期版本的孤儿结构和变量。

在 ALGLIB++ 中,控制流结构被重新整合:入口点跳回循环或其他控制流结构的中间位置。
线程本地变量没有缓存;目前它们已被静态化(以线程安全为代价--但多线程并非 GPL ALGLIB 的正式组成部分)。
与 ALGLIB 一样,这意味着需要使用大量的 goto 语句来完成所有的来回跳转,但这些语句的组织更加简洁。
根据我们的测试结果,ALGLIB++ 所做的修复本身可将例程速度提高约 20-25%。

有两种方法可以处理这种架构,既可以去掉回转语句,又可以更妥善地处理线程本地变量:
(1) 实现实际的线程切换,这意味着 RCOMM 例程会发送 "事件 "消息(这正是 needf、... algpowerup 标志的实际含义),而调用者必须设置一个事件处理程序来接收和处理这些消息。不过,我不确定 MQL5 是否能生成和处理用户定义的事件。
(2) 为事件使用函数指针。
请记住,RCOMM 例程可能是嵌套的;在某些情况下,它们可以将从自己调用的 RCOMM 例程中获得的事件转发给调用者。

ALGLIB 开发人员在实施 ALGLIB 时决定不使用函数指针或多线程,因为 ALGLIB 首次发布时,任何广泛传播和广泛使用的语言都不支持多线程编程,而且并非 ALGLIB 所针对的所有语言都与 C 和 C++ 的函数指针具有相同或类似的等效功能。但 MQL5 有函数指针。如果您将 ALGLIB 改编为 MQL5,由于控制流结构的重新整合,从 ALGLIB++ 进行改编会容易得多。

然而,理想的解决方案是使用线程切换。最终,ALGLIB++ 将使用函数指针或线程切换;我们尚未决定采用哪种方式。

亲爱的莉迪亚:

但您在 github 上的 ALGLIB ++ 库文件仍然是 C ++ CPP 格式。您能提供 .mql 格式的 ALGLIB ++ 库文件吗?谢谢!

 

亲爱的开发者,请在 复数 结构中添加计算 复数 共轭 方法 源码在 SB <Math\Alglib\complex.mqh> 中)

我的版本

   //--- 操作
   void              Copy(const complex &rhs);
   bool              Eq(const complex &lhs, const complex &rhs);
   bool              NotEq(const complex &lhs, const complex &rhs);
   complex           Add(const complex &lhs, const complex &rhs);
   complex           Sub(const complex &lhs, const complex &rhs);
   complex           Mul(const complex &lhs, const complex &rhs);
   complex           Div(const complex &lhs, const complex &rhs);
   complex           Conjugate(void) const;


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


//+------------------------------------------------------------------+
//| 共轭|
//+------------------------------------------------------------------+
complex complex::Conjugate(void) const
  {
   complex complex_val(re,-im);
   return complex_val;
  };


在下一次发布 版本后,你必须回滚到之前的版本。这很不方便。

 
Denis Kirichenko:

亲爱的开发者,请在 复数 结构中添加计算 复数 共轭数的 方法 源代码在 SB <Math\Alglib\complex.mqh> 中)

我的版本


在下一次发布 版本后,你必须回滚到之前的版本。这很不方便。

已添加