Code

There are two popular variants of the Holt-Winters forecasting method; RRDtool
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Fri, 15 Jun 2007 07:59:01 +0000 (07:59 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Fri, 15 Jun 2007 07:59:01 +0000 (07:59 +0000)
commitc4246f38b2e80c5accd07276cdc1aaf51e0b5c17
treee2673a7868dd7e8647c728ed6960cbbbb1e86aab
parentfd7f5dce3b2ed1cf3556cfd5a7ae2126a950b1b6
There are two popular variants of the Holt-Winters forecasting method; RRDtool
supports the "additive" method, which means that seasonal variation is simply
added to the baseline. For our application, it would be more appropriate to use
the "multiplicative" Holt-Winters method, where seasonal variation is a
coefficient multiplied by the baseline.  Quick example to illustrate the
difference: if the average doubles season-over-season, the additive method
would predict the delta between min and max to be constant, whereas the
multiplicative method would predict the delta to double as well.

Attached is a patch against trunk to support the multiplicative method.  I've
done this with a new consolidation function, MHWPREDICT, which is essentially
interchangeable with HWPREDICT. There is a noticeable improvement in prediction
deviations for certain types of functions; the attachments show HWPREDICT and
MHWPREDICT predictions for a function with an x*sin(x) component.

Because HWPREDICT and MHWPREDICT differ only in their equations, I've factored
out their math into rrd_hw_math.c. The appropriate smoothing functions are
passed to the update functions in a container of function pointers, which are
called where appropriate. Thus the additive and multiplicative methods use the
same update functions, and the right equations are evaluated without having
flag checks everywhere. This approach, I think, makes the algorithms quite
clear, with minimal duplicate code.

I have moved update_hwpredict, update_seasonal, update_devpredict,
update_devseasonal, and update_failures into a separate file, rrd_hw_update.c,
with some slight refactoring related to rrd_hw_math.c. I ran some
regression tests against trunk to make sure I didn't break anything with
the existing HWPREDICT code.

MHWPREDICT uses the same deviation smoothing and failure detection algorithms
as HWPREDICT.

Some helpful references on the multiplicative Holt-Winters method:

http://www.it.iitb.ac.in/~praj/acads/seminar/04329008_ExponentialSmoothing.pdf
(a student's quick overview of additive vs. multiplicative HW)

http://ideas.repec.org/p/msh/ebswps/1999-1.html (paper on variations to the
multiplicative Holt-Winters, including variance calculations; FYI, my
implementation uses "Model 1")

My employer and the owner of this patch (IMVU, Inc.) is happy to license it
under the same terms as RRDtool, i.e. give it to the project.
-- Evan Miller emiller imvu.com

git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk@1125 a5681a0c-68f1-0310-ab6d-d61299d08faa
17 files changed:
program/doc/rrdcreate.pod
program/doc/rrdtune.pod
program/src/Makefile.am
program/src/rrd_create.c
program/src/rrd_dump.c
program/src/rrd_format.c
program/src/rrd_format.h
program/src/rrd_graph.c
program/src/rrd_hw.c
program/src/rrd_hw_math.c [new file with mode: 0644]
program/src/rrd_hw_math.h [new file with mode: 0644]
program/src/rrd_hw_update.c [new file with mode: 0644]
program/src/rrd_hw_update.h [new file with mode: 0644]
program/src/rrd_info.c
program/src/rrd_restore.c
program/src/rrd_tune.c
program/src/rrd_update.c