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

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

前言


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


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


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


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


目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
215 65
|
1月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
27天前
|
机器学习/深度学习 存储 算法
经典算法代码
这段代码展示了多个经典算法,包括:穷举法解决“百钱买百鸡”问题;递推法计算“猴子吃桃”问题;迭代法求解斐波那契数列及折纸高度超越珠峰的问题。同时,还提供了希尔排序算法实现及披萨票务订购系统和汉诺塔问题的链表存储解决方案。每部分通过具体案例解释了算法的应用场景与实现方法。
23 3
|
1月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
17天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了一种结合粒子群优化(PSO)与分组卷积神经网络(GroupCNN)的时间序列预测算法。该算法通过PSO寻找最优网络结构和超参数,提高预测准确性与效率。软件基于MATLAB 2022a,提供完整代码及详细中文注释,并附带操作步骤视频。分组卷积有效降低了计算成本,而PSO则智能调整网络参数。此方法特别适用于金融市场预测和天气预报等场景。
|
2月前
|
人工智能 算法 数据可视化
DBSCAN密度聚类算法(理论+图解+python代码)
DBSCAN密度聚类算法(理论+图解+python代码)
|
2月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
25 0
|
3天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
1月前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
1月前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
下一篇
无影云桌面