用于测试系统稳定性的函数,它接收预测的时间序列作为输入
Posted
技术标签:
【中文标题】用于测试系统稳定性的函数,它接收预测的时间序列作为输入【英文标题】:Function for testing system stability, which receives predicted time series as input 【发布时间】:2019-10-07 21:36:25 【问题描述】:我想编写一个函数,它获取时间序列和标准差作为参数,并返回一个看起来像预测的调整时间序列。
使用这个函数我想测试一个系统的稳定性,它获取天气的预测时间序列列表作为输入参数。
我对这种功能的方法,如下所述:
vector<tuple<datetime, double>> get_adjusted_timeseries(vector<tuple<datetime, double>>& timeseries_original, const double stddev, const double dist_mid)
auto timeseries_copy(timeseries_original);
int sign = randInRange(0, 1) == 0 ? 1 : -1;
auto left_limit = normal_cdf_inverse(0.5 - dist_mid, 0, stddev);
auto right_limit = normal_cdf_inverse(0.5 + dist_mid, 0, stddev);
for (auto& pair : timeseries_copy)
double number;
do
nd_value = normal_distribution_r(0, stddev);
while (sign == -1 && nd_value > 0.0 || sign == 1 && nd_value < 0.0);
pair = make_tuple(get<0>(pair), get<1>(pair) + (nd_value / 100) * get<1>(pair));
if (nd_value > 0.0 && nd_value < right_limit || nd_value < 0.0 && nd_value > left_limit)
sign = sign == -1 ? 1 : -1;
return timeseries_copy;
从原来的时间序列复制一份,同样来自vector<tuple<datetime, double>>
类型
获取一个 0 或 1 的随机数,并使用该数字设置符号。
使用逆累积分布函数获取限制,指示何时更改符号。当复制的时间序列的值接近原始值时,符号会发生变化。 The implementation of the inverse CDF is shown here
时间序列中每个项目的 For 循环:
得到一个正态分布的值,当sign == -1
时应小于零,sign == 1
时应大于零
根据正态分布调整时间序列的旧值
价值
如果正态分布值接近原始值,则更改sign
。
例如,低标准偏差的结果可以在此处以黄色显示: 如果计算两个时间序列的平均绝对百分比误差(MAPE),得到如下关系:
stddev: 5 -> MAPE: ~0.04 stddev: 10 -> MAPE: ~0.08 stddev: 15 -> MAPE: ~0.12 stddev: 20 -> MAPE: ~0.16您如何看待这种方法?
这个函数可以用来测试一个必须处理预测时间序列的系统吗?
【问题讨论】:
也许 SE/Signal Processing 网站更适合这个问题 @Damien 感谢您的提示,我检查了数据科学、代码审查和信号处理,但标签最适合这里。 我不知道这种方法,但您似乎希望randInRange
能够良好使其工作。是吗? double number;
没有被使用? sign = sign == -1 ? 1 : -1;
可以写成sign = -sign;
“看起来像预测”是什么意思或如何定义?您将如何使用生成的随机时间序列来测试您的系统?你提到你的“系统处理预测的时间序列”,你的系统到底做了什么?
我知道你想做什么。你的建议是好的。我假设它有效地将“白噪声”(即正态分布的噪声)添加到过去的真实数据中。如果真实数据受到或可能受到此类噪声的影响,那么您将能够评估系统可以承受的噪声水平。您可能希望使用其他形式的噪声来测试您的系统。您知道这些会影响您的系统的其他类型的噪音吗?
【参考方案1】:
您希望生成的时间序列数据表现得与您从真实现象(天气和证券交易所)中获得的一些现有时间序列数据相似。生成的时间序列数据将被输入到某个系统中以测试其稳定性。
您可以做的是:为现有数据拟合一些模型,然后使用该模型生成遵循该模型的数据,从而生成现有数据。将数据拟合到模型会产生一组模型参数和一组偏差(模型未解释的差异)。偏差可能遵循一些已知的密度函数,但不一定。给定模型参数和偏差,您可以生成看起来像原始数据的数据。注意,如果模型没有很好的解释数据,偏差会很大,用模型生成的数据看起来不像原始数据。
例如,如果您知道您的数据是线性的,您可以通过它们拟合一条线,您的模型将是:
y = M x + B + E
其中E
是一个随机变量,它遵循适合您数据的线周围的误差分布,其中M
和B
是模型参数。您现在可以使用该模型生成大致线性的(x, y)
坐标。在对随机变量E
进行采样时,您可以假设它遵循一些已知分布,例如正态分布,或者使用直方图来生成遵循任意密度函数的偏差。
您可以使用多种时间序列模型来拟合天气和证券交易所数据。你可以看看exponential smoothing。它有几种不同的模型。我相信您可以在 Wikipedia 上找到许多其他模型。
如果模型不能很好地拟合您的数据,您还可以将其参数视为随机变量。在上面的示例中,假设我们观察到斜率似乎在变化的数据。我们将拟合几行并获得M
的分布。然后我们会在生成数据时对该变量和E
进行采样。
【讨论】:
@Anne Bierhoff 在回答另一个问题时,我举了一个例子,展示了如何使用指数平滑模型计算随机时间序列。见***.com/questions/56466979/… 非常感谢您的麻烦。您将如何继续查看系统破坏的预测准确度(百分比)并且不再产生有意义的结果? 这真的取决于您的系统,取决于预期会产生什么有意义的结果。 假设我的预测以 90% 的准确率与实际数据匹配。如果我现在想测试系统在 95% 的预测下的表现,我是否可以简单地将所有单独的预测值在实际数据的方向上移动一小部分?这只会减少或增加预测中出现的噪音类型,不是吗? 我认为按百分比缩放会改变噪声的概率分布。例如,如果您假设噪声是正常的,为了获得更小的误差,您需要重新计算具有更小标准偏差的噪声值。按百分比缩放不会产生相同的结果。以上是关于用于测试系统稳定性的函数,它接收预测的时间序列作为输入的主要内容,如果未能解决你的问题,请参考以下文章
我用spss进行时间序列预测,预测出来的结果怎么检验他的准确性和稳定性?
R语言DALEX包的explain函数生成指定分类预测机器学习模型的解释器predict_diagnostics函数执行残差的局部诊断可视化指定预测变量的局部稳定性图判断预测的稳定性以及高估低估