一文速学-时间序列分析算法之一次移动平均法和二次移动平均法详解+实例代码

简介: 一文速学-时间序列分析算法之一次移动平均法和二次移动平均法详解+实例代码

前言


最近打算研究通彻将机器学习所有有关时间序列分析算法预测模型都讲明白清楚,在一些业务数据分析或者是数学建模需要用到强时间序列的预测模型,我们不得不学习时间序列法。严格来讲


时间序列法并不属于机器学习而是统计分析法,供预测用的历史数据资料有的变化表现出比较强的规律性,由于它过去的变动趋势将会连续到未来,这样就可以直接利用过去的变动趋势预测未来。但多数的历史数据由于受偶然性因素的影响,其变化不太规则。利用这些资料时,要消除偶然性因素的影响,把时间序列作为随机变量序列,采用算术平均、加权平均和指数平均等来减少偶然因素,提高预测的准确性。


我们将常用的时间序列分析算法平滑法模型列出:


2da72c6901214dba889ecdc621ad63eb.png

一、平滑法理论


平滑法是对不断获得的实际数据和原预测数据给以加权平均,使预测结果更接近于实际情况的预测方法,又称光滑法或递推修正法。平滑法是趋势法或时间序列法中的一种具体方法。是为了帮助我们看清数据中的隐藏的概率形式。使具有趋势性的东西显露出来. 这里我们举个例子:


dde25f05c73a41a9a72edcd012d924d4.png

比如这张图,这是在某化学反应里,测得生成物浓度y(%)与时间t(min)的数据。我们知道浓度和时间的关系是正相关的,但是在某一时刻的数据根据点的分布我们是推测不准确的。当根据数据拟合一条时序曲线就很容易看出规律:

765f9fe559534454a55278cec92d813d.png


1.时序特性


那么基于此类时序数据我们可以发现此类数据一般用于这下面四种特性:


1.长期趋势(Trend)


2.季节变化(Season)


3.循环波动(Cyclic)


4.不规则波动(Irregular)


四种影响因素通常有两种组合方式:


一种是加法模型:Y=T+S+C+I,认为数据的发展趋势是4种影响因素相互叠加的结果


一种是乘法模型:Y=T*S*C*I,认为数据的发展趋势是4种因素相互综合的结果



2.建模流程


时序模型的建模需要我们考虑我们获取到的数据是否是时间强相关数据,而不是机器学习那种以特征为主的预测模型。通常时序模型建模步骤为:


  1. 数据清洗、预处理、样本均衡
  2. 判断是否强关联时间、确定数据是否存在周期性波动
  3. 确定使用时序算法模型
  4. 横向对比其他时序算法模型,选择最优模型
  5. 参数调优


二、平滑法算法


根据上述我们提到的平滑法算法我们来依次建模


2da72c6901214dba889ecdc621ad63eb.png


1.移动平均法


又称滑动平均法,我们以在某化学反应里,测得生成物浓度y(%)与时间t(min)的数据为例子:

580c829ecc8442c087ff76e286a3b8bf.png


假定是随时间序列gif.gif发生变化的已知数据:


根据上述情况我们可以得到N为16,则为.将其分为若干段,以4个数据作为一段,进行滑动。


第一段:gif.gif,.在此为数据平均值,所有数据应在它的上下波动。那么我们可以用于推测当t=5时的数值还按前一组数值的变化幅度波动。


那么我们就很好理解,当t=6时的数值按t=2到5时间段波动。


那么第二段为:gif.gifgif.gif以此类推....


我们总结一下:一般的:


gif.gif这个公式为一次移动平均公式。


移动平均法基本上是在平均值的基础上进行预测。一般来说若经济变量在某一值上下波动情况以及升降缓慢预测效果比较好,反之误差比较大。


python代码:


移动平均法基本上是在平均值的基础上进行预测。一般来说若经济变量在某一值上下波动情况以及升降缓慢预测效果比较好,反之误差比较大。


python代码:

x=df_metric['t']
y=df_metric['y']
def mean_shift(x,y,n):
    fx=list(y[0:n])
    sum=0
    start=0
    end=n
    for i in range(0,len(y)-n):
        sum=0
        for j in range(start,end):
            sum+=fx[j]
        start+=1
        end+=1
        fx.append(sum/n)
    return fx
fx=mean_shift(x,y,4)
fx


c55fbe121a0b43fcab3adf327220f82e.png

当时间窗口为4时我们发现移动平均法效果很差,当时序数据不进行左右浮动时而是呈现一种趋势上升时不能够很好的进行预测。这是因为末端数值已经不能很好的反应出数据走向,而作均值时又会影响最近时刻的数值点。当数据的随机因素较大时,宜选用较大的N,这样有利于较大限度地平滑由随机性所带来的严重偏差;反之当数据的随机因素较小时,宜选用较小的N,这有利于跟踪数据的变化。说到底该算法仅限于处理一段数据量不是很大且数值相对集中,变化趋势相对于平稳的数据。


2.二次移动平均法


二次移动平均是在一次平均移动的基础上再做一次移动平均。

也就是我们把时间段内是数据聚合之后,再视为成一个时间点,类似套娃。用数学语言描述就是:


gif.gif


递推公式gif.gif

gif.gif为二次移动平均数

N为分段数据个数

gif.gif为以此移动平均数

与一次移动平均数关系


一次移动平均预测对于数据变化小,近似水平变化的数据平滑作用较好。如果是线性趋势变化,形成滞后偏差gif.gif

线性变化如下:


gif.gif

有:

image.png

考虑到gif.gif

gif.gif

所以:image.png

gif.gif

image.png


gif.gif

移项:gif.gif

有公式:gif.gif

gif.gif

说明用一次移动平均值模拟:真值与一次平均值存在(N-1)b_{t}/2的滞后偏差。

在线性趋势条件下gif.gif

此式表明。若直接用gif.gif作预测值,滞后偏差将拉大为gif.gif

二次移动平均法预测公式


在线性趋势条件下,回到视为基础,用线性函数拟合假定gif.gif

其中t为目前周期数,T为从目前周期t到需要预测的周期的周期个数。

gif.gif为第t+T周期的预测值,gif.gif为斜率,gif.gif为截距

若:令Y=0,得gif.gif为初始值,由于当前数据为gif.gifgif.gif

故选取gif.gif由公式:gif.gif

代入gif.gif得:gif.gifgif.gif

由此构成二次移动平均预测公式。


注意:


1.预测公式是以t时刻为基准的,这个时刻可以随意选取,当选择靠近当前时刻,准确度较高。


2.因为


image.png

即与一次移动平均法相比较,滞后偏差(N-1)/2已补偿。

3.gif.gif对应的N应一致,且二次移动值gif.gif不是预测值。

4.二次移动平均法预测公式仅适合于线性趋势预测

5.不断的丢失信息,且N的大小一般由经验以及前期趋势确定。


python代码

def one_mean_shift(x,y,n):
    fx_one=list(y[0:n])
    sum=0
    start=0
    end=n
    for i in range(0,len(y)-n):
        sum=0
        for j in range(start,end):
            sum+=fx_one[j]
        start+=1
        end+=1
        fx_one.append(sum/n)
    return fx_one
def two_mean_shift(x,y,n):
    fx_two=list(y[0:n])
    M1=one_mean_shift(x,y,n)
    M2=one_mean_shift(x,M1,n)
    #取周期T
    T=4
    a = 2 * M1[len(M1) - 1] - M2[len(M2) - 1]
    b = (2 / (n - 1)) * (M1[len(M1) - 1] - M2[len(M2) - 1])
    print(M2)
    print("a:", a, "b:", b)
    # 计算 X (预测值)
    X = a + b * T
    return X


目录
相关文章
|
9天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
12 3
|
7天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
12天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
21天前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
21天前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
25天前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
58 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
13天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
15 0
|
19天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
15天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
1天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。