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

导读:

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

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

正文如下:

差分变换

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

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

 

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

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个时间步长。结果是牺牲整个第一循环以区分第二循环。

差异季节性数据集的线图

                                                        差异季节性数据集的线图

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

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

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

猜你喜欢

转载自blog.csdn.net/yangwohenmai1/article/details/84790658