文章 "MQL5 中的统计分布 - 取最佳的 R" - 页 13

 
СанСаныч Фоменко:

读一读。

读懂了。

我认为您给出的测试不完全正确。我认为有必要写出来,因为性能比较不是最后的问题。

关键是 MKL 与 R 有质的区别。在进行性能比较时,应尽可能考虑到这些质的不同。R 是一种解释器,而 MKL 是一种编译器。对于工业程序而言,这种质的差异是 MKL 的优势所在。

请看一下 R 的源代码(它是开放源代码)。所有的 C/C++ 基本数学都编译到了引擎中。而且大多数软件包也是用 C++ 编写的,否则你就无法等待计算结果了。

如果 R 是基本/系统函数的解释器,它将落后 MQL5 200-500 倍。我们专门测试了 R 的 C/C++ 系统函数,而不是在循环中进行手动处理(R 在这方面落后数百倍)。

在 R 开发过程中,我们一直在寻找 "如何才能找到一个软件包,让我不必编写 for/while/foreach 循环"。事实上,在 R 中进行计算只有一种方法,那就是将任何或多或少的大量计算传递给第三方软件包。


但还有一个质的区别,这在程序的工业运行中也非常重要,在测试中没有考虑到这些区别,导致结果失真。

R 和 MKL 的本质区别在于,MKL 中的基本对象是标量,而更复杂的对象(例如矢量)则由标量 构成。矢量是分布函数的输入。

在 /include/math/stat 目录中可以找到数百个向量函数。


在 R 中,根本没有标量的概念。最简单的对象就是向量。在我们比较 R 代码中的分布函数的示例中,我们可以清楚地看到 "矢量化 "这种 R 特有的编程技术,而 MKL 中没有这种技术。由于矢量化是 R 的一种特殊技术,可将计算速度提高 10-100 倍(取决于矩阵的大小),因此 R 的代码必须包含这种技术。矢量化的使用是显而易见的,因为在测试中,我们使用一个输入矢量并对其进行 100 次计算,也就是说,它是一个相同的矩阵,但我们可以对不同的列进行计算。

R 中没有矢量化,也没有现代功能。那里的代码都是由普通编程初学者迎头编写的。没错,他们是出色的数学家,但却是平庸的程序员。

R 中的 GPU 仍然只是童话故事和最稀有软件包中的个别尝试。


总而言之:R 语言中的文本应该使用 R 语言的功能来编写,尤其是在 MKL 中没有类似功能的情况下。

你根本不了解 R 或 MQL5。

你没有看过 R 的源代码,也不知道 MQL5 的源代码。在过去的 15 年中,你从未编译过编译器。但您却试图与那些做过这一切的人争论。

 

目前,MQL5 统计库(不包括 Alglib 和 Fuzzy)已经拥有超过 461 个函数:https://www.mql5.com/ru/forum/86386/page222#comment_3867386。

这已经很好地涵盖了基本的统计函数。


如果您以前读过这篇文章,我建议您再读一遍--昨天他们发布了新版文章,增加了很多新函数。
Машинное обучение: теория и практика (торговля и не только)
Машинное обучение: теория и практика (торговля и не только)
  • www.mql5.com
Добрый день всем, Знаю, что есть на форуме энтузиасты machine learning и статистики...
 
Renat Fatkhullin:

目前,MQL5 统计库(不包括 Alglib 和 Fuzzy)已经拥有超过 461 个函数:https://www.mql5.com/ru/forum/86386/page222#comment_3867386。

这已经很好地涵盖了基本的统计函数。


我建议以前读过这篇文章的人再读一遍--昨天他们发布了新版文章,增加了很多新函数。

还不知道如何向 Quantum 发送推送消息。请添加一个 R 中可能根本没有的东西。

这是平均值区间向右移动一位时的快速计算。类似的还有皮尔逊相关系数的计算。

如果正面计算,Pearson 是很难计算的。但也有迭代计算的方法:K[i] 到 K[i-1]。

有趣的是,这是我第一次在俄语中遇到每个单词后面都有逗号的句子:

请添加一个可能不存在的东西。

 

为什么不自己编写必要的函数?

查看 /include/math/stat 中的全部函数,并写出缺少的函数。

 
Renat Fatkhullin:

R 没有矢量化,也没有现代功能。那里的代码只是由普通的程序员编写的。是的,他们是不错的数学家,但他们是平庸的程序员。

你根本不了解 R 或 MQL5。

你没有看过 R 的源代码,也不知道 MQL5 的源代码。在过去的 15 年中,你从未编译过编译器。但你却试图与那些做过所有事情的人争论。

我的编程知识非常有限,但还没有达到你所描述的程度。

总之,我完全明白,你所说的 R 在 C++ 中的内部实现与我提出的测量执行速度问题毫无关系。我写的是用 R 本身编写代码的技术,而内部的东西才是我们要测量的。

那么,关于矢量化。

字符串在 R 中看起来很正常

с <- a+b

它至少总是一个向量计算。这取决于上下文--ab 是什么。

此外

c <- sqrt(a)

会得到一个向量c,其中每个元素都是向量a 的相应元素的平方根。

在这种情况下,a 不一定是一个向量,它可以是一个更复杂的对象,如矩阵。

在 MQL 中,这些对象总是循环。

此外,R 语言中的矢量化不仅意味着对象本身,还包括

  • 以特定运算符应用 及其变体形式出现的程序装置
  • 使用标准MKL 库来执行所有这些矢量化操作。

回到我在上一篇文章中所写内容的含义。

我根本没有写任何关于 C++ 函数实现质量的内容。和你一样,我建议按实际情况来衡量它们。不过,我使用的是专门用于矢量化操作的 R 语言工具。

举个例子

对于你的所有测试,用 100 个数据组成一个矩阵 M(就像你所做的那样),其中每一列都是一个引用的模型

那么在 R 语言中,所有列的最小值看起来像这样

apply(M,  2, min)

结果将是一个包含每列最小值的向量

利用这种模式,我们需要测量用适当的应用程序包着的所有分布函数的比率。分布函数有很多,而且各不相同。MKL 中没有类似的函数。

同时,确保MKL 库与 R 一起安装。

Intel® Math Kernel Library (Intel® MKL) | Intel® Software
  • software.intel.com
Intel® Math Kernel Library (Intel® MKL) accelerates math processing routines that increase application performance and reduce development time.
 
Renat Fatkhullin:

为什么不自己编写必要的函数?

查看 /include/math/stat 中的完整函数源,然后写出缺失的函数。

有趣的想法。

也许你能找到移植软件包的执行者。例如,花键。你会得到高质量的mashups,货真价实。

 
СанСаныч Фоменко:

我对编程略知一二,但还没有达到您所描述的程度。

无论如何,我完全明白你所说的 R 的内部 C++ 实现与我提出的测量执行速度问题毫无关系。我写的是在 R 本身中编写代码的技术,而内部的东西就是我们要测量的。

不幸的是,你不知道 R 中的所有内容都是用 C/C++ 编写的。你显然认为它是一个解释器,即使在系统函数中也是如此。


那么,关于矢量化。

在 R 中,字符串看起来很正常

с <- a+b

在 R 中,一个字符串看起来是正常的,但它至少是一个矢量化计算。这取决于上下文--ab 是什么。

此外

c <- sqrt(a)

会得到一个向量c,其中每个元素都是向量a 的相应元素的平方根。

在这种情况下,a 不一定是一个向量,它可以是一个更复杂的对象,例如矩阵。

在 MQL 中,这些对象总是循环。

我们已经展示了如何在循环中更快地工作。在 MQL5 中的纯源代码中,无需使用 C++。

我们还将打败最简单的向量 sqrt。这里有两个标准函数库中的函数,它们与 R. 完全类似:

bool MathSqrt(double &array[])                           // 将结果放入同一向量
bool MathSqrt(const double &array[],double &result[])    // 将结果放入一个单独的向量
比较。

你还不太明白,MQ5 数学标准库中的这 461 个函数涵盖了大量的基本数学运算。


此外,R 语言中的矢量化不仅意味着对象本身,还意味着以特定形式存在的程序装置:

  • 特定应用 运算符及其变体形式的程序装置
  • 使用标准MKL 库来执行所有这些矢量化操作。

是的,没错。理论上是这样。

而 99% 的操作都是在最简单的函数中完成的,没有加速的机会。

在 MQL5 中,OpenCL 是标准配置,无需第三方库即可加速所有操作。在普通 MQL5 中,您可以获得 C++ 级别的结果。

但在 R 中,唯一的选择是寻找一个包来加速每个循环。是的,准确地说是每个周期,如果它在迭代次数方面有任何问题的话。


回到我在上一篇文章中所写的意思。

你并不具备深厚的知识,只是使用了肤浅的推理。
 

很少有人意识到这一点,但在使用 MKL 时,将 R 输入数据转换为 MKL 可以处理的常规数组,然后将结果转换回 R 的内部数据表示格式,很可能会 产生巨大的开销。

我还没有深入研究过这个问题,但从逻辑上看就是这样。这意味着提供 MKL 支持需要很大的开支。

当然,在 MQL5 中完全没有这种损失。只有在 OpenCL 中才需要复制数据,但这只是简单的平面内存复制。

 
Renat Fatkhullin:

你为什么不自己写一个必要的函数呢?

我写过一次,但我没有将其格式化为数学函数。

看看 /include/math/stat 中函数的完整来源,然后写出缺少的函数。

问题是要像量子那样,将它们放入一个科学与编程相结合的标准库中

很有可能需要与你的解决方案进行性能比较。然后,我认为就有可能说服将自行车放到 mat 库中。我自己还没有在 mat 软件包中见过这种情况(R 软件包就更不用说了)。

 

另一个小秘密--为什么 MQL5 速度如此之快,尤其是当库完全包含在源代码中时。

我们的编译器进行了深度优化,能够切断大量的检查和条件,以至于函数完全消失,循环被简化到极致。当然,这仅限于 x64 版本。

与其他系统使用库/包(甚至不能对调用进行优化)不同,MQL5 编译器几乎总是使用完整的源代码,并始终执行最大深度的全局优化。这将带来惊人的结果。

这就是为什么我们必须提供所有标准库 的源代码。我们知道,在决赛中,一切都会被过度优化,这样你就能在速度上击败几乎所有人。甚至托管语言的开销也不会对其造成太大影响。