交易中的机器学习:理论、模型、实践和算法交易 - 页 200

 
雷纳特-法特库林

让我们回到最初关于文章中R错误的声明。

我们的意见仍然是:有错误存在,而且是由于执行中的粗心造成的。

你的专家不想就事论事地回答我。他只是戳了一下我的钨丝,就这样。

我将重复我们的观点。在伽马分布上没有错误。这在数学界是一个惯例问题。你有一个错误的短语,这是不正确的。

在你的版本中,对密度的零的推导,首先是可能的选择之一(惯例)。其次,从应用分析的本质来看,这个值的选择(nan、0或1)并不影响什么。分布函数用于估计统计数据。在这其中,分布是零。而这就足够了。

关于t分布,我在最新版本的R上重现了这个错误,但并没有深入到算法的本质。我承认确实需要纠正。

我将尝试向R支持团队提出问题。
 

而你进入它,重新计算一切,像他那样花几个星期重新检查。但相反,你甚至没有阅读我们的文章。

就我们而言,我们做了这项工作。而且我们做得很好。如果Wolfram对你来说也不是一个权威,那么你的这种交流方式就是在浪费时间。

请不要把创作者和用户混为一谈。

 
雷纳特-法特库林

而你进入其中,重新计算一切,花几个星期重新检查,就像他做的那样。但相反,你甚至没有阅读我们的文章。

就我们而言,我们做了这项工作。而且我们做得很好。如果Wolfram对你来说也不是一个权威,那么你用这种交流方式是在浪费时间。

请不要把创作者和用户混为一谈。

我尊重你的意见。但你为什么要为它回答?

我再说一遍。

在你的版本中,对密度的零的推导,首先是可能的选择之一(惯例)。其次,从应用分析的本质来看,这个值的选择(nan、0或1)并不影响什么。分布函数用于估计统计数据。在这一点上,分布是零。而这就足够了。

我想补充的是,一般来说,加快计算速度 是一个优点。也就是说,客观上,根据你的文章,函数的实现并不差,甚至更好。
 
我希望情感部分已经结束...

已经四处寻找0^0。这正是争论的焦点--包含在x=0时伽马分布的概率密度 方程中。


在这次讨论中,这就是答案。
0^0和0!都等于1,因为有空积规则。IEEE标准说,0^0的值应该是1。因此,大多数计算机软件会以这种方式评估。在任何情况下,评估为0都是有帮助的。

有许多公式都假设0^0=1,例如多项式和幂级数的符号,红心数算术,二项式定理,等等,这些都是假设0^0=1。例如,将x=0代入x^0+x^1+x^2+...。= 1/(1-x)显示0^0 = 1。

也就是说,将这个表达式转换为1的标准。而且,将表达式改为0也没有什么好处或坏处。

我认为在R中硬编码为1...,而你有0。

这就是问题所在,没有必要为此争论不休。计算机无法用代数法计算出这个值。
 
阿列克谢-伯纳科夫

在你的版本中,对密度的零的推导,首先是一种可能性(惯例)。

人们可以认为,定义一个函数意味着指定一种计算方法。

给定表达式
阿列克谢-伯纳 科夫。

此外,根据。

https://en.wikipedia.org/wiki/Gamma_distribution

当x=0,α=1,β=1时,你在分子中得到一个未定义的值,这使整个分数变得不确定。

我们声明,严格来说,零点的分布的伽马密度是不确定的。而以右边的极限为例,密度为1。

有鉴于此,我们认为 "R的计算错误 "的表述是不正确的。更确切地说,这是一个约定俗成的问题:比考虑等于零度的表达。在零点将伽马分布密度等同于零,似乎不是一个有效的做法。

不符合函数的定义,因为它在x=0点包含一个不确定性,正如你所指出的。

如果条件x>=0而不是x>0,那么就没有不确定性,你可以用这个公式计算出数值。

关于实践--Mathematica和Matlab可以说是工程计算的工业标准,它们产生的是0,即该表达式只对x>0有效。

 
量子化

我们可以假设,定义一个函数意味着指定一种计算方法。

给出的表达方式是。

不适合用来定义一个函数,因为正如你所指出的,它在x=0处包含一个不确定性。

如果你把条件x>=0而不是x>0,就没有不确定性,你可以用这个公式计算出数值。

关于实践--Mathematica和Matlab可以说是工程计算的行业标准,它们给出的是0,即该表达式只有在x>0时才是真的。

正确。该函数被定义在正区域(0,inf)。

为什么你在0点仍有0? 为什么误差是1?


顺便说一句,有意思。钨在空间[0,inf]上定义了一个伽马分布概率函数。因此,他们在零点时给出了一定的数值...这很奇怪。


 
量子化

Mathematica和Matlab可以说是工程计算的工业标准

你把一个没有解决方案的情况,查找Wolfram返回的结果,并称其他的结果都是错误的。这不是工程计算,而是教条。

他们可以以R为参考,写出在Wolfram中发现错误的情况。我想如果你把所有的数学软件,根据它们在这种情况下的回报分成两组--会有50%/50%的比例,你可以在一篇关于mql的文章中再增加一打mql擅长的软件。

谢谢你在AS 243 中提到的错误。但你不应该把它归咎于其他带参数的函数的行为,对于这些函数没有明确的解决方案。
所以应该在关于mql优势的文章中写到--看,在R中,有一个函数有小数点后15位的错误。而我们在mql中有另一个函数,它更准确。一切都将是有文化和科学的,而不是像现在这样的教条主义。

 
阿列克谢-伯纳科夫

为什么你在0点仍有0? 为什么误差是1?

让我们考虑一个例子,参数a=0.5,b=1的点x=0

> dgamma(0,0.5,1,log=FALSE)[1] Inf> pgamma(0,0.5,1,log=FALSE)[1] 0

如果我们不排除x=0点,密度就会发散,概率就没问题。

再往前走,也没有问题了。

> pgamma(0.00001,0.5,1,log=FALSE)[1] 0.003568236

事实证明,当计算CDF R时排除了x=0点,无穷大在某处消失了。

 
量子化

亲爱的同事!

有好几页都在争论你和R的算法在函数 域边缘的区别。边际点就是边际点,在实践中可以忽略掉这些差异。

但在这种情况下,我有一个更实质性的问题。

你所有的功能的文档在哪里?

以前,我认为我们把你的函数,然后把R的文档,因为你的函数是类似的,然后深入研究R的文档中那些描述算法的部分,或者按照R提供的链接。R有非常高质量的文档和参考仪器。

在争论的过程中,我发现你的函数与R不同--它们是一些其他的函数,其算法依赖于其他来源。文章本身没有关于这一点,没有文件。而我们在完全不同的背景下从雷纳特那里了解到了这一点。

在实践中,我们可以得出一个毫不含糊的结论:代码不能从R移植到MQL5。

原因就在这里。

我很清楚,如果上面写着 "R的类似物",而且没有关于类似物的文档,那么它就是100%的类似物,我可以很容易地将代码从解释器转移到编译器,而不用担心这个问题。如果不是这样,那么一个案例就足以终止将代码从R移植到MQL5的想法了。没有人希望在将工作代码转移到R时,你得到的MQL代码由于算法实现的细微差别而无法工作,这让人完全头疼。

 
桑桑尼茨-弗门科

你所有的功能的文档在哪里?

以前,我认为我们把你的函数,然后把R的文档,因为你的函数是类比的,然后进入R文档中那些描述算法的部分,或者去找R提供的链接。R有非常高质量的文档和参考仪器。

在争论的过程中,我发现你的函数与R不同--它们是一些其他的函数,其算法依赖于其他来源。文章本身没有关于这一点,没有文件。而我们在完全不同的背景下从雷纳特那里了解到了这一点。

在实践中,我们可以得出一个毫不含糊的结论:代码不能从R移植到MQL5。

原因就在这里。

我很清楚,如果上面写着 "R的类似物",而且没有关于类似物的文档,那么它就是100%的类似物,我可以很容易地将代码从解释器转移到编译器,而不用担心这个问题。如果不是这样,就足以终止将代码从R移植到MQL5的想法了。没有人希望得到一个完全的僵局,当把工作代码迁移到R中后,你得到了MQL代码,由于算法实现的微妙性,它不能工作。

目前,这些功能在文章https://www.mql5.com/ru/articles/2742 中有所描述。

考虑以参数mu=2,sigma=1的正态分布 为例进行计算。

n <- 10
k <- seq(0,1,by=1/n)
mu=2
sigma=1
normal_pdf<-dnorm(k, mu, sigma, log = FALSE)
normal_cdf<-pnorm(k, mu, sigma, lower.tail=TRUE,log.p = FALSE)
normal_quantile <- qnorm(normal_cdf, mu,sigma, lower.tail=TRUE,log.p = FALSE)
normal_pdf
normal_cdf
normal_quantile


1)R函数dnorm()的类似物是一个函数。

该函数计算随机变量数组x[]的正态分布概率密度函数的值,参数为mu和sigma。如果出现错误,则返回 false。R中dnorm() 的类似物。

bool MathProbabilityDensityNormal(
  const double   &x[],        // [in]  Массив со значениями случайной величины
  const double   mu,          // [in]  Параметр распределения  mean (математическое ожидание)
  const double   sigma,       // [in]  Параметр распределения sigma (среднеквадратическое отклонение)
  const bool     log_mode,    // [in]  Флаг расчета логарифма значения, если log_mode=true, то рассчитывается натуральный логарифм плотности вероятности
  double         &result[]    // [out] Массив для значений функции плотности вероятности
);

2)模拟pnorm。

该函数计算随机变量数组x[]的参数mu和sigma的正态分布函数值。 如果出现错误,则返回false。类似于R中的pnorm()

bool MathCumulativeDistributionNormal(
  const double   &x[],        // [in]  Массив со значениями случайной величины
  const double   mu,          // [in]  Математическое ожидание
  const double   sigma,       // [in]  Среднеквадратическое  отклонение
  const bool     tail,        // [in]  Флаг расчета, если lower_tail=true, то рассчитывается вероятность того, что случайная величина не превысит x
  const bool     log_mode,    // [in]  Флаг расчета логарифма значения, если log_mode=true, то рассчитывается натуральный логарифм вероятности
  double         &result[]    // [out] Массив для значений функции вероятности
);

3) qnorm的类似物。

这个函数计算参数为mu和sigma的正态分布的反函数值,用于计算概率[]数组的值。 如果出现错误,它将返回false。R中qnorm() 的类似物。

bool MathQuantileNormal(
  const double   &probability[],// [in]  Массив со значениями вероятностей случайной величины
  const double   mu,            // [in]  Математическое ожидание
  const double   sigma,         // [in]  Среднеквадратическое отклонение
  const bool     tail,          // [in]  Флаг расчета, если lower_tail=false, то расчет ведется для вероятности 1.0-probability
  const bool     log_mode,      // [in]  Флаг расчета, если log_mode=true, то расчет ведется для вероятности Exp(probability)
  double         &result[]      // [out] Массив со значениями квантилей
);

这是一个关于如何使用它的例子。

#include <Math\Stat\Normal.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- arrays for calculated values
   double x_values[];
   double normal_pdf[];
   double normal_cdf[];
   double normal_quantile[];
//--- prepare x values
   const int N=11;
   ArrayResize(x_values,N);
   for(int i=0;i<N;i++)
      x_values[i]=i*1.0/(N-1);
//--- set distribution parameters
   double mu=2.0;
   double sigma=1.0;
//--- calculate pdf, cdf and quantiles
   MathProbabilityDensityNormal(x_values,mu,sigma,false,normal_pdf);
   MathCumulativeDistributionNormal(x_values,mu,sigma,true,false,normal_cdf);
   MathQuantileNormal(normal_cdf,mu,sigma,true,false,normal_quantile);
//--- show calculated values
   for(int i=0;i<N;i++)
      PrintFormat("1 %d, x=%.20e PDF=%.20e, CDF=%.20e, Q=%.20e,",i,x_values[i],normal_pdf[i],normal_cdf[i],normal_quantile[i]);
  }

结果。

2016.11.11:56:46.413 测试(EURUSD,H1) 1 0, x=0.000000000000000000e+00 PDF=5.39909665131880628364e-02, CDF=2.27501319481792120547e-02, Q=0.000000000000000000e+00。
2016.11.11 11:56:46.413 测试 (EURUSD,H1) 1 1, x=1.00000000000000005551e-01 PDF=6.56158147746765951780e-02, CDF=2.87165598160018034624e-02, Q=1.00000000000000088818e-01
2016.11.11 11:56:46.413 测试 (EURUSD,H1) 1 2, x=2.00000000000000011102e-01 PDF=7.895015830089414932-02, CDF=3.593031911292598098213e-02, Q=2.0000000000177636e-01
2016.11.11 11:56:46.413 测试 (EURUSD,H1) 1 3, x=2.99999999999888-01 PDF=9.40490773768869470217e-02, CDF=4.456546247585430410108e-02, Q=3.0000000000266454e-01
2016.11.11 11:56:46.413 测试 (EURUSD,H1) 1 4, x=4.00000000000000022204e-01 PDF=1.1092083434679455543315e-01, CDF=5.47992916995579740225e-02, Q=3.99999999999999911182e-01
2016.11.11:56:46.413 测试(EURUSD,H1) 1 5, x=5.00000000000000-01 PDF=1.29517595665891743772e-01, CDF=6.68072012688580713080e-02, Q=5.0000000000222045e-01,
2016.11.11 11:56:46.413 测试 (EURUSD,H1) 1 6, x=5.99999999999999977796e-01 PDF=1.49727465635744877437e-01, CDF=8.07566592337710387195e-02, Q=6.0000000000310862e-01
2016.11.11 11:56:46.413 测试 (EURUSD,H1) 1 7, x=6.9999999999999551e-01 PDF=1.71368592047807355438e-01, CDF=9.68004845856103440793e-02, Q=7.0000000000177636e-01
2016.11.11:56:46.413 测试 (EURUSD,H1) 1 8, x=8.0000000000000000044409e-01 PDF=1.94186054983212952330e-01, CDF=1.15069670221708289515e-01, Q=8.0000000000000000044409e-01,
2016.11.11 11:56:46.413 测试 (EURUSD,H1) 1 9, x=9.0000000000000000022204e-01 PDF=2.1785217177032550525793e-01, CDF=1.35666060946382671659e-01, Q=9.0000000000133227e-01
2016.11.11:56:46.413 测试 (EURUSD,H1) 1 10, x=1.000000000000000000e+00 PDF=2.41970724519143365328e-01, CDF=1.58655253931457046468e-01, Q=1.000000000000000000e+00。

R中的计算结果。

> n <- 10> k <- seq(0,1,by=1/n)> mu=2> sigma=1> normal_pdf<-dnorm(k, mu, sigma, log = FALSE)> normal_cdf<-pnorm(k, mu, sigma, lower.tail=TRUE,log.p=FALSE)> normal_quantile <- qnorm(normal_cdf, mu,sigma, lower.tail=TRUE,log.p=FALSE)> normal_pdf[1] 0.05399097 0.06561581 0。07895016 0.09404908 0.11092083 0.12951760 0.14972747 0.17136859 [9] 0.19418605 0.21785218 0.24197072> normal_cdf[1] 0.02275013 0.02871656 0.03593032 0。04456546 0.05479929 0.06680720 0.08075666 0.09680048 [9] 0.11506967 0.13566606 0.15865525> normal_quantile[1] 0.0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее
Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее
  • 2016.10.06
  • MetaQuotes Software Corp.
  • www.mql5.com
Рассмотрены функции для работы с основными статистическими распределениями, реализованными в языке R. Это распределения Коши, Вейбулла, нормальное, логнормальное, логистическое, экспоненциальное, равномерное, гамма-распределение, центральное и нецентральные распределения Бета, хи-квадрат, F-распределения Фишера, t-распределения Стьюдента, а также дискретные биномиальное и отрицательное биномиальные распределения, геометрическое, гипергеометрическое и распределение Пуассона. Есть функции расчета теоретических моментов распределений, которые позволяют оценить степень соответствия реального распределения модельному.
附加的文件:
Test.mq5  2 kb