如何使用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'

通过视觉检查,我们可以看到我们的数据有348m的偏移量(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'

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

我们发现它大约是379m(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方法做出了预测。这就是全部。

附言:有趣的事实:如果您将周期设置为0,那么Holt-Winters方法将从三重指数平滑转换为双重指数平滑。所以,如果您的数据有趋势但没有季节性,别担心——您也可以使用HOLT_WINTERS()函数来满足您的预测需求。

学习资源列表

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

我希望这个教程能帮助您开始预测之旅。如果您有任何问题,请将它们发布在社区网站上或向我们@InfluxDB发推文。