首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于测试系统稳定性的函数,该函数接收预测的时间序列作为输入。

用于测试系统稳定性的函数,该函数接收预测的时间序列作为输入。
EN

Stack Overflow用户
提问于 2019-05-21 13:15:50
回答 1查看 335关注 0票数 9

我想写一个函数,得到一个时间序列和一个标准差作为参数,并返回一个调整后的时间序列,它看起来像一个预测。

使用这个函数,我想测试一个系统的稳定性,它得到一个天气预报时间序列列表作为输入参数。

我对这一职能的处理方法如下:

代码语言:javascript
复制
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的随机数,并使用该数字来设置符号。
  • 利用逆累积分布函数求出指示符号何时变化的限值。当复制的时间序列的值接近原始值时,符号将被更改。这里给出了逆CDF的实现。

  • 时间序列中每个项目的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

你觉得这种方法怎么样?

这个函数能用来测试一个必须处理预测时间序列的系统吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-01 00:27:06

您希望生成时间序列数据,这些数据的行为就像从真实现象(天气和股票交易所)获得的现有时间序列数据一样。生成的时间序列数据将被输入到某个系统中,以测试其稳定性。

您可以做的是:将一些模型安装到现有的数据中,然后使用该模型生成遵循模型的数据,从而生成现有的数据。将数据拟合到模型会产生一组模型参数和一组偏差(模型没有解释的差异)。偏差可能遵循一些已知的密度函数,但不一定。给定模型参数和偏差,您可以生成与原始数据类似的数据。请注意,如果模型不能很好地解释数据,那么偏差将很大,使用模型生成的数据将不像原始数据。

例如,如果您知道您的数据是线性的,您可以在它们之间拟合一条线,您的模型是:

代码语言:javascript
复制
y = M x + B + E

其中,E是一个随机变量,它遵循符合您的数据的行周围的错误分布,而MB是模型参数。现在,您可以使用该模型生成线性的(x, y)坐标。当随机变量E抽样时,您可以假设它遵循一些已知的分布,如正态分布,或者使用直方图来生成跟随任意密度函数的偏差。

有几个时间序列模型,您可以用来拟合您的天气和股票交易数据。你可以看看指数平滑。它有几种不同的型号。我相信你可以在维基百科上找到很多其他的模型。

如果模型不适合您的数据,您也可以将其参数视为随机变量。在上面的例子中,假设我们观察到的数据似乎是斜率在变化。我们将拟合几条线,并为M获得一个分布。然后,在生成数据时,我们将与E一起对该变量进行示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56239172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档