如何使用 InfluxDB 的 Holt-Winters 函数进行预测

导航至

欢迎来到本三部分博客文章系列的第三部分。要理解第三部分,我建议先阅读第一部分和第二部分。

第一部分中,我们介绍了

  1. 何时使用 Holt-Winters
  2. 单指数平滑的工作原理指数平滑入门指南
  3. 单指数平滑优化的概念概述
  4. 额外内容:线性回归 RSS 优化的证明

第二部分中,我们深入探讨了

  1. 单指数平滑如何与三重指数平滑/Holt-Winters 相关
  2. RSS 如何与 RMSE(均方根误差)相关
  3. 如何使用 Nelder-Mead 方法优化 Holt-Winters 的 RMSE

在当前的文章第三部分中,我们探讨了

  1. 如何使用 InfluxDB 内置的乘法 Holt-Winters 函数对时间序列数据生成预测
  2. 学习资源列表

如何使用 InfluxDB 的内置乘法 Holt-Winters 函数对时间序列数据生成预测

为了开发者体验,我决定遵循文档中的Holt-Winters 示例。此示例的数据集可以通过以下方式下载

curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txt

下载内容包括来自美国国家海洋和大气管理局的潮汐和海流指标的集合。此数据集有点过时(来自 2015 年)。如果您想使用最新数据,我鼓励您使用CO-OPS API进行当前数据检索。下载后,您可以使用以下命令将其写入 InfluxDB

influx -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database

我们使用此查询来检查数据

SELECT "water_level" FROM "NOAA_water_database"."autogen"."h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-08-17 22:12:00' AND time <= '2015-08-28 03:00:00'

通过目视检查,我们可以看到我们的数据有一个 348 米的偏移量(2015/08/17 20:00- 2015/08/18 01:48)。我们还看到从 2015/08/22 开始出现强烈的季节性,因此我们将使用该点之后的数据进行预测。

SELECT "water_level" FROM "NOAA_water_database"."autogen"."h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-08-22 22:12:00' AND time <= '2015-08-28 03:00:00'

我们还可以通过目视检查找到每个峰值之间发生的时间长度。

我们发现大约是 379 米(2015/08/25 03:18 — 2015/08/25 9:36)。

现在我们准备好通过使用FIRST()函数并在应用偏移量后按峰值之间的时间段进行分组来匹配原始数据的趋势。 FIRST() 函数返回与字段键关联的最旧字段值。

下一个查询的目标是用尽可能少的点来表示我们的数据。如果我们有效地用少量点概括我们的数据,那么我们可以有效且高效地使用 Holt-Winters。在每个季节,我们看到两个山丘,一个比另一个大。每个山丘都有一个峰值和一个谷底。

然后我们使用 FIRST() 函数在每个峰值和谷底选择一个点。我们通过按每个峰值和谷底之间的时间跨度进行分组来实现这一点,以便我们可以确保不会错过任何一个。

SELECT FIRST("water_level") FROM "NOAA_water_database"."autogen"."h2o_feet" WHERE "location"='santa_monica' and time >= '2015-08-22 22:12:00' and time <= '2015-08-28 03:00:00' GROUP BY time(379m,348m)

现在我们可以清楚地看到每个季节有四个峰值和谷底,并且我们已经用相应的点表示了每个峰值和谷底。

我想对 FIRST() 函数做最后一个评论。数据是有价值的,但更多并不一定更好。使用像 MEAN() 这样的聚合而不是 FIRST() 实际上会模糊我们数据的形状,并做出糟糕且阻尼的预测。好的,现在我们终于准备好使用HOLT_WINTERS() 函数了。

如果我们想预测 10 个点,我们将写

SELECT HOLT_WINTERS_WITH_FIT(FIRST("water_level"),10,4) FROM "NOAA_water_database"."autogen"."h2o_feet" WHERE "location"='santa_monica' AND time >= '2015-08-22 22:12:00' AND time <= '2015-08-28 03:00:00' GROUP BY time(379m,348m)

恭喜!您已经使用 Holt-Winters 进行了预测。这就是全部内容。

附注:有趣的事实:如果您将 period = 0,那么您将 Holt-Winters 从三重指数平滑转换为双指数平滑。因此,如果您的数据有趋势但没有季节性,请不要担心——您也可以使用 HOLT_WINTERS() 函数来满足您的预测需求。

学习资源列表

我想分享我用来学习 Holt-Winters 的所有资源,以补充您的理解并感谢作者们的精彩工作。谢谢。

我希望本教程能帮助您开始您的预测之旅。如果您有任何问题,请在社区网站上发布或在 Twitter 上 @InfluxDB 提及我们。