LSTM系列_LSTM的数据准备(3)——如何使用差分法消除数据的趋势和季节性

本文介绍了如何使用差分法去除数据集中的趋势和季节性,通过具体实例展示了差分变换的过程及其逆转换,适用于时间序列数据分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读:

我们的很多数据是具有季节性或者趋势性的,就是随着时间越来越久,数据随着一个趋势来变化,这种内在的趋势对数据的预测有一定的影响。那么怎么来消除这个影响呢?

我们可以使用差分法,差分法简单说就是在一系列数据中,相邻两个相减得到相邻两个值的变化量,我们在进行数据分析的过程中,只对差分之后的结果进行分析,也就是说我们只分析连续数据间的变化情况,而忽略了数据本身的累加形成的趋势性或者季节性。最后我们对数据进行逆转换即可。

源码地址:https://github.com/yangwohenmai/LSTM/tree/master/%E9%95%BF%E7%9F%AD%E6%9C%9F%E8%AE%B0%E5%BF%86(LSTM)/LSTM%E7%9A%84%E6%95%B0%E6%8D%AE%E5%87%86%E5%A4%87/%E4%BD%BF%E7%94%A8%E5%B7%AE%E5%BC%82%E5%8F%98%E6%8D%A2%E6%B6%88%E9%99%A4%E8%B6%8B%E5%8A%BF%E5%92%8C%E5%AD%A3%E8%8A%82%E6%80%A7

正文如下:

差分变换

差分是一种转换时间序列数据集的方法。

它可用于消除序列对时间的依赖性,即所谓的时间依赖性。这包括趋势和季节性等结构。

 

通过从当前观察中减去先前的观察来执行差分。

difference(t) = observation(t) - observation(t-1)


当必须将预测转换回原始比例时,需要反转该过程。

通过将先前时间步骤的观察值添加到差值,可以反转该过程。

inverted(t) = differenced(t) + observation(t-1)

以这种方式,可以计算一系列差异和反转差异。

滞后差异

将连续观察之间的差异称为滞后-1差异。

可以调整滞后差异以适应特定的时间结构。

对于具有季节性成分的时间序列,滞后可以预期为季节性的周期(宽度)。

差异订单

在执行差分运算之后,一些时间结构可能仍然存在,例如在非线性趋势的情况下。

因此,差分过程可以重复多次,直到所有时间依赖性都被消除。

执行差分的次数称为差分顺序。

计算差分

我们可以手动区分数据集。

这涉及开发一个创建差异数据集的新功能。该函数将遍历提供的序列并以指定的间隔或滞后计算差异值。

下面名为difference()的函数实现了此过程。

#创建一个差分序列

def difference(dataset, interval=1):

diff = list()

for i in range(interval, len(dataset)):

value = dataset[i] - dataset[i - interval]

diff.append(value)

return Series(diff)

我们可以看到该函数在指定的时间间隔后小心地开始差异数据集,以确保实际上可以计算差值。定义默认间隔或滞后值1。这是一个合理的默认值。

进一步的改进是还能够指定执行差分操作的次序或次数。

下面名为inverse_difference()的函数会反转单个预测的差异运算。它还要求提供前一时间步的实际观测值。

# 差分的逆转换

def inverse_difference(last_ob, value):

return value + last_ob

 

区别于消除趋势

在本节中,我们将介绍使用差异变换来移除趋势。

趋势通过提高水平使时间序列非静止。这具有随时间改变平均时间序列值的效果。

下面的示例将difference()函数应用于具有线性增加趋势的人为数据集。

# 创建一个差分序列
def difference(dataset, interval=1):
	diff = list()
	for i in range(interval, len(dataset)):
		value = dataset[i] - dataset[i - interval]
		diff.append(value)
	return diff

# 差分的逆转换
def inverse_difference(last_ob, value):
	return value + last_ob

# 定义一个有线性趋势的数据集
data = [i+1 for i in range(20)]
print(data)
# 对数据做差分
diff = difference(data)
print(diff)
# 差分的逆转换
inverted = [inverse_difference(data[i], diff[i]) for i in range(len(diff))]
print(inverted)

最后,使用来自原始序列的先前值作为每个变换的引物来反转差异序列。运行该示例首先使用线性趋势打印设计序列。接下来,打印差异数据集,显示每个时间步长增加一个单位。该序列的长度为19而不是20,因为序列中第一个值的差异无法计算,因为没有先前值。

 

1

2

3

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

 

区别于删除季节性

 

在本节中,我们将介绍使用差异变换来消除季节性。

季节性变化或季节性是随着时间的推移而定期重复的循环。

 

季节性有很多种类。一些明显的例子包括:时间,每日,每周,每月,每年等。因此,确定时间序列问题中是否存在季节性因素是主观的。

确定是否存在季节性方面的最简单方法是绘制和审查您的数据,可能是在不同的尺度和添加趋势线。

下面的示例将difference()函数应用于人为的季节性数据集。数据集包括两个循环,每个循环360个单元。

from math import sin
from math import radians
from matplotlib import pyplot

# 创建一个差分序列
def difference(dataset, interval=1):
	diff = list()
	for i in range(interval, len(dataset)):
		value = dataset[i] - dataset[i - interval]
		diff.append(value)
	return diff

# 差分的逆转换
def inverse_difference(last_ob, value):
	return value + last_ob

# 定义一个有线性趋势的数据集
data = [sin(radians(i)) for i in range(360)] + [sin(radians(i)) for i in range(360)]
pyplot.plot(data)
pyplot.show()
# 对数据做差分
diff = difference(data, 360)
pyplot.plot(diff)
pyplot.show()
# 差分的逆转换
inverted = [inverse_difference(data[i], diff[i]) for i in range(len(diff))]
pyplot.plot(inverted)
pyplot.show()

首先运行示例创建并绘制360时间步长序列的两个周期的数据集。

人工数据集的线图

                                                             人工数据集的线图

接下来,应用差异变换并绘制结果。该图显示了360个零值,并删除了所有季节性信号。

在上面的去趋势示例中,差值应用滞后为1,这意味着牺牲了第一个值。这里整个周期用于差分,即360个时间步长。结果是牺牲整个第一循环以区分第二循环。

差异季节性数据集的线图

                                                        差异季节性数据集的线图

最后,转换反转显示第二个周期恢复了季节性。

差分数据集的线图与反向差分变换

                                                 差分数据集的线图与反向差分变换

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日拱一两卒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值