这是我的代码:
#include <math.h>
#include <iostream>
using namespace std;
inline void Task(double start, double target) {
double a0 = 0.0101252;
double z = start;
double value = -1.0;
double temp = 0.0;
int counter = 0;
while (value != temp) {
temp = value;
// exponential moving average
z += a0 * (target - z);
value = z;
counter++;
}
cout << "start: " << start << " | target: " << target << " | iterations: " << counter << std::endl;
}
int main()
{
Task(0.0, 0.01);
Task(0.01, 0.0);
Task(0.01, 0.02);
Task(0.02, 0.01);
}
将指数移动平均值从0.1应用到0.2(或从0.2应用到0.1或从0.0应用到0.1)会导致大约3100次迭代:
start: 0 | target: 0.01 | iterations: 3173
start: 0.01 | target: 0.02 | iterations: 3105
start: 0.02 | target: 0.01 | iterations: 3173
相反,如果我使用0.0,它的迭代成本要高出25倍:
start: 0.01 | target: 0 | iterations: 72305
为什么?棘手的地方在哪里?我想不出来。非规范化?
双精度表示的值在接近零时密度更大。当值==温度时,即基本上接近目标,误差通过舍入而丢失时,就打破了循环。这反过来又有效地意味着,当目标值接近零时,您需要比目标值的绝对值大得多的精度。
您可能希望选择一个比“尾数的最后一位”更合理的精度目标。
我也看过Pyspark中的加权移动平均线,但我需要一个Spark/Scala的方法,以及10天或30天的均线。 有什么想法吗?
公式链接:https://sciencing.com/calculate-exponential-moving-averages-8221813.html
Python是否有一个SciPy函数或NumPy函数或模块来计算给定特定窗口的一维数组的运行平均值?
问题内容: 我有一个二维的numpy数组。我想对每个条目取n个最近条目的平均值,就像对一维数组取滑动平均值一样。什么是最干净的方法? 问题答案: 这与将 滤镜 应用于 图像的 概念类似。 幸运的是,有很多功能可以做到这一点。您所追求的是。 可以这样使用: 如果您需要5x5滤镜,请使用。该选项控制如何处理边缘。您没有指定要如何处理边缘。在此示例中,“常量”模式表示将数组边界之外的每个项目都视为常量值
问题内容: 我有一个表(日期,有效负载),其中包含约10年的数据,我想基于14天(2周)和90天(12周)的间隔计算移动平均值(MA),以显示有效负载的趋势 我已经写了这个查询,但是它得到了错误的值 实际上我知道是什么,但我不了解Oracle的工作原理! 我可以在Excel中进行计算,但是我需要在数据库级别执行此操作,能否请您告诉我如何执行此操作? 问题答案: 我不明白使用的目的是什么?根据文档,
我又用Python玩了一点,我找到了一本有例子的整洁的书。其中一个例子是绘制一些数据。我有一个有两列的。txt文件,我有数据。我把数据绘制得很好,但在练习中,它说:进一步修改程序,计算并绘制数据的运行平均值,定义如下: 其中在本例中(并且是数据文件中的第二列)。使程序将原始数据和运行平均值绘制在同一张图上。 到目前为止我有这个: 非常感谢^^:)