未加星标

MovingAverage-滑动平均

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二04 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏

MovingAverage 可翻译为滑动平均或移动平均,是做时间序列预测时用到的简单方法。

计算方法:对于一个给定的数列,首先设定一个固定的值k,然后分别计算第1项到第k项,第2项到第k+1项,第3项到第k+2项的平均值,依次类推。

下面代码取自TensorFlow源代码:

class MovingAverage { public: explicit MovingAverage(int window); ~MovingAverage(); void Clear(); double GetAverage() const; void AddValue(double v); private: const int window_;// Max size of interval double sum_;// Sum over interval double* data_;// Actual data values int head_;// Offset of the newest statistic in data_ int count_;// # of valid data elements in window }; // 构造函数 MovingAverage::MovingAverage(int window) : window_(window), sum_(0.0), data_(new double[window_]), head_(0), count_(0) { CHECK_GE(window, 1); } // 析构函数 MovingAverage::~MovingAverage() { delete[] data_; } void MovingAverage::Clear() { count_ = 0; head_ = 0; sum_ = 0; } double MovingAverage::GetAverage() const { if (count_ == 0) { return 0; } else { return static_cast<double>(sum_) / count_; } } void MovingAverage::AddValue(double v) { if (count_ < window_) { // This is the warmup phase. We don't have a full window's worth of data. head_ = count_; data_[count_++] = v; } else { if (window_ == ++head_) { head_ = 0; } // Toss the oldest element sum_ -= data_[head_]; // Add the newest element data_[head_] = v; } sum_ += v; }

以1、2、3、4、5共5个数为例,window为3,计算过程为:(1+2+3)/3=2,(2+3+4)/3=3,(3+4+5)/3=4。

... MovingAveragema(3); ma.AddValue(1); ma.AddValue(2); ma.AddValue(3); printf("%lf\n", ma.GetAverage()); // 2.0 ma.AddValue(4); printf("%lf\n", ma.GetAverage()); // 3.0 ma.AddValue(5); printf("%lf\n", ma.GetAverage()); // 4.0 ... 一图胜千言

数据取自:< TensorFlow练习19: 预测天朝铁路客运量 >

import matplotlib.pyplotas plt import pandasas pd import requests import io import numpyas np def moving_average(l, N): sum = 0 result = list( 0 for x in l) for i in range( 0, N ): sum = sum + l[i] result[i] = sum / (i+1) for i in range( N, len(l) ): sum = sum - l[i-N] + l[i] result[i] = sum / N return result # 使用效率更高的numpy # http://stackoverflow.com/questions/13728392/moving-average-or-running-mean def fast_moving_average(x, N): return np.convolve(x, np.ones((N,))/N)[(N-1):] url = 'http://blog.topspeedsnail.com/wp-content/uploads/2016/12/铁路客运量.csv' ass_data = requests.get(url).content df = pd.read_csv(io.StringIO(ass_data.decode('utf-8')))# python2使用StringIO.StringIO data = np.array(df['铁路客运量_当期值(万人)']) ma_data = moving_average(data.to_list(), 3) plt.figure() plt.plot(data, color='g') plt.plot(ma_data, color='r') plt.show()

当window/N=3:


MovingAverage-滑动平均
红线是MovingAverage,注意看,它慢了一拍

当window/N=10:


MovingAverage-滑动平均
可以用来中和掉一些异常值

还有一个类似的东西,叫Moving Median,Median是中位数。

中位数定义:把数列按顺利排好,中间的那个数就是中位数,如果数列个数是偶数,那么取中间两个数的平均值。

正在看马哥的告别演说,转眼8年过去了,真TM快,这货头发全白了。


MovingAverage-滑动平均

马哥的演技还是这么牛,期待大嘴巴川普的就职演说。

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

主题: 预测中位数数据
分页:12
转载请注明
本文标题:MovingAverage-滑动平均
本站链接:http://www.codesec.net/view/522960.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(27)