用于测试系统稳定性的功能,它接收预测的时间序列作为输入
Function for testing system stability, which receives predicted time series as input
我想编写一个函数,获取时间序列和标准差作为参数,returns 调整后的时间序列看起来像预测。
我想使用此功能测试系统的稳定性,该系统获取天气预报时间序列列表作为输入参数。
我对这种功能的做法,如下所述:
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 的随机数,并使用该数字设置符号。
- 使用逆累积分布函数获取限值,该限值指示何时更改符号。当复制的时间序列的值接近原始值时,符号会发生变化。
- 时间序列中每个项目的 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
您如何看待这种做法?
这个函数可以用来测试一个必须处理预测时间序列的系统吗?
您想要生成的时间序列数据的行为类似于您从真实现象(天气和证券交易所)获得的一些现有时间序列数据。生成的时间序列数据将被输入到某个系统中以测试其稳定性。
您可以做的是:将一些模型拟合到您现有的数据,然后使用该模型生成遵循该模型的数据,从而生成您现有的数据。将数据拟合到模型会产生一组模型参数和一组偏差(模型未解释的差异)。偏差可能遵循一些已知的密度函数,但不一定。给定模型参数和偏差,您可以生成看起来像原始数据的数据。注意,如果模型不能很好地解释数据,偏差会很大,用模型生成的数据看起来不像原始数据。
例如,如果您知道您的数据是线性的,您可以通过它们拟合一条线,您的模型将是:
y = M x + B + E
其中 E
是一个随机变量,它遵循适合您的数据的直线周围的误差分布,其中 M
和 B
是模型参数。您现在可以使用该模型生成大致线性的 (x, y)
坐标。在对随机变量 E
进行采样时,您可以假设它遵循某种已知分布,例如正态分布,或者使用直方图来生成遵循任意密度函数的偏差。
您可以使用多种时间序列模型来拟合您的天气和证券交易所数据。你可以看看exponential smoothing。它有几种不同的型号。我相信您可以在维基百科上找到许多其他模型。
如果模型不能很好地拟合您的数据,您还可以将其参数视为随机变量。在我们上面的例子中,假设我们已经观察到斜率似乎在变化的数据。我们将拟合几条线并获得 M
的分布。然后我们会在生成数据时对该变量以及 E
进行采样。
我想编写一个函数,获取时间序列和标准差作为参数,returns 调整后的时间序列看起来像预测。
我想使用此功能测试系统的稳定性,该系统获取天气预报时间序列列表作为输入参数。
我对这种功能的做法,如下所述:
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 的随机数,并使用该数字设置符号。
- 使用逆累积分布函数获取限值,该限值指示何时更改符号。当复制的时间序列的值接近原始值时,符号会发生变化。
- 时间序列中每个项目的 For 循环:
- 得到一个正态分布值,当
sign == -1
时应该是小零,当sign == 1
时应该是大零
- 根据正态分布调整时间序列的旧值 值
- 如果正态分布值接近原始值,则更改
sign
。
- 得到一个正态分布值,当
例如,可以在此处看到黄色的低标准差结果:
- stddev: 5 -> MAPE: ~0.04
- stddev: 10 -> MAPE: ~0.08
- stddev: 15 -> MAPE: ~0.12
- stddev: 20 -> MAPE: ~0.16
您如何看待这种做法?
这个函数可以用来测试一个必须处理预测时间序列的系统吗?
您想要生成的时间序列数据的行为类似于您从真实现象(天气和证券交易所)获得的一些现有时间序列数据。生成的时间序列数据将被输入到某个系统中以测试其稳定性。
您可以做的是:将一些模型拟合到您现有的数据,然后使用该模型生成遵循该模型的数据,从而生成您现有的数据。将数据拟合到模型会产生一组模型参数和一组偏差(模型未解释的差异)。偏差可能遵循一些已知的密度函数,但不一定。给定模型参数和偏差,您可以生成看起来像原始数据的数据。注意,如果模型不能很好地解释数据,偏差会很大,用模型生成的数据看起来不像原始数据。
例如,如果您知道您的数据是线性的,您可以通过它们拟合一条线,您的模型将是:
y = M x + B + E
其中 E
是一个随机变量,它遵循适合您的数据的直线周围的误差分布,其中 M
和 B
是模型参数。您现在可以使用该模型生成大致线性的 (x, y)
坐标。在对随机变量 E
进行采样时,您可以假设它遵循某种已知分布,例如正态分布,或者使用直方图来生成遵循任意密度函数的偏差。
您可以使用多种时间序列模型来拟合您的天气和证券交易所数据。你可以看看exponential smoothing。它有几种不同的型号。我相信您可以在维基百科上找到许多其他模型。
如果模型不能很好地拟合您的数据,您还可以将其参数视为随机变量。在我们上面的例子中,假设我们已经观察到斜率似乎在变化的数据。我们将拟合几条线并获得 M
的分布。然后我们会在生成数据时对该变量以及 E
进行采样。