关于模糊时间序列的简短教程
介绍
时间序列分析和预测方法在某些领域是必不可少的,例如工程,医学,经济,气象等。
从传统的和神圣的统计工具(ARMA,ARIMA,SARIMA,Holt-Winters等)到新的计算智能工具(递归神经网络,LSTM,GRU等),有几种分析和预测方法。
我将假设你没有机器学习(专注于模糊系统)和时间序列背景,我将介绍这些领域的关键概念。然后在pyFTS库的帮助下引入模糊时间序列方法。
什么是模糊集?
逻辑理论和经典数学将集合定义为二分法:每个元素都在集合的内部或外部。元素的成员关系是一个布尔值,即集合{0,1}上的值,将其强加给每个集合强而不灵活的边界。
这种二分法的思维方式对人类来说是不舒服的,因为无数的现实并非如此。当我们试图将人划分为严格限制的类别时,我们会遇到困难,例如:体重={瘦,苗条,肥胖},年龄={儿童,青少年,年轻人,成年人,老年人},身高={低,中,高}。如果我们要描述某人至少在其中一个中使用这些概念,我们会发现这个人可能处于这两个值之间的中间类别。但是classic / rigid集合没有给我们这种灵活性。
由Zadeh(1965)提出的模糊逻辑提出了二元性,而不是这种二分法:某个元素可能在某个级别上属于并且同时不属于同一集合,以至于隶属度是区间内的值[0,1]。模糊集没有严格的边界,它们通常是重叠的,所以——使用前面的例子——我可以是中等高和中等,或者90%中和10%高。
给定X,一个数值变量,使得X∈ℝ--例如高度测量 - 它的论域,缩写为U,是该变量的值是可以假设的范围,U =[min(X)max(X)]。
一个语言变量A是数值型变量X的值转化为一组words / linguistic terms(我们称之为模糊化)的。每个word/linguistic ter是模糊集ã∈,每个模糊集ã与函数μ(mu希腊字母)相关联,例如μã:X→[0,1](这意味着μã接收输入值)从X开始,并在区间[0,1]上返回一个输出值。
让我们回到以厘米为单位测量的数值变量高度。我们将U = [20,220]和linguistic variableÃ定义为:
Ã= { “非常小”,“小”,“短”,“中等”,“高”,“非常高” }
你看到我们想要做什么吗?我们想停止使用X的数值数据并开始使用Ã表示的词汇表,为此我们需要为每个集合映射X的值ã∈Ã。
我们将通过将U划分为6个重叠区间来实现这一点,每个区间对应一个ã∈Ã。对于每个区间,我们将μã(X)函数关联起来。有几种类型的隶属函数,但为了简化,我们将使用三角形隶属函数。三角形隶属函数可以用Python定义为:
def triangular(x, a, b, c): return max( min( (x-a)/(b-a), (c-x)/(c-b) ), 0 )
其中a b c画了一个三角形a在左边,b在上面c在右边。当一个给定的输入值x = b,我们说它是100%在模糊集(换句话说:其隶属度等于1)。另一方面,隶属度在区间[a,b]上从0线性增加到1 ,并且在区间[b,c]上从1线性减小到0 。如果x小于a或大于c,我们说x 完全在模糊集之外(换句话说:其隶属度等于0)。
那么,linguistic variable Ã的集合是什么样的呢?
假设一个人身高163厘米。对于变量Ã,它将是.27 median和.73 tall,即:
μ_median(163) = triangular(163, 90, 130, 175) = 0.2666666…
μ_high(163) = triangular(163, 130, 175,220) = 0.7333…
什么是时间序列?
时间序列是代表一个(或多个)随机变量随时间变化的行为的一组数据,其主要特征是该变量的连续记录之间不相互独立,其分析必须考虑所收集的顺序。
根据Ehlers(2009),“相邻的观测是相互依赖的,我们感兴趣的是分析和建模这种依赖”。这是什么意思?为了预测时间序列的未来值,我使用了相同序列的过去/滞后值。
一个简单的例子是自回归AR(p)模型,其中p表示预测时使用的滞后变量的数量。给定时间序列X(t),其中t表示时刻,如果我们将仅使用预测中的滞后,那么我们有一个AR(1)模型,就像X(t)=α · X(t-1)+ε,其中X(t-1)是滞后值,α是通过统计方法调整的系数,ε表示噪声或随机误差,表示与该预测相关的不确定性,ε~ (0,1)。如果我们想在预测中使用最后两个滞后,我们将得到一个AR(2)模型,它类似于X(t)=α0 · X(t-1)+α1 ·X(t-2)+ε。
滞后量是多少,应该使用什么滞后量?要做到这一点,有必要研究时间序列的组成部分,并利用ACF和PACF等图表分析它们的特性。通常,时间序列在高级别上被建模(使用附加模型)为:
X(t)= C(t)+ T(t)+ S(t)+ R(t)
其中:
- t是时间指数;
- X(t)是t时刻序列的点估计值;
- C(t)是周期性成分,可预见的短期/非常短期波动;
- T(T)为趋势分量,表示该序列的长期行为。一般来说,趋势是增长/上升或下降/下降,否则说这个序列没有趋势;
- S(t)是季节成分,是中长期的周期性波动。季节性成分的一个很好的例子是。一年四季!这些间隔有自己的特点,每年重复一次——这使得任何具有这种季节性的变量都更容易预测。
- R(t)是噪声分量,是一个均值和方差不变的随机值。这种随机噪声是不可预测的!
并不是所有的时间序列都有趋势或季节性。有些序列是固定的,这意味着它们的平均值(或多或少)是常数。在非平稳序列中,平均随时间变化。在同域序列中,方差是常数,而在异域序列中,方差随时间变化。综上所述:平稳和同塑性时间序列表现良好,预测简单,非平稳和异塑性时间序列复杂得多。在后一种情况下,我们可以应用数学变换(如微分、Box-Cox等)使级数平稳且同质化。
什么是模糊时间序列?
模糊集用于建模和预测时间序列的使用几乎直观地出现,首先基于模糊模型逼近函数的能力,而且还基于使用linguistic variables的规则的可读性,使得专家和非专家分析更容易获得。
《模糊时间序列》的先驱作品是Song and Chisson(1993),但这里我们展示的是陈(1996)出版的《进化》。其思想是在间隔/分区(模糊集)中从时间序列中划分Universe of Discourse,并学习每个区域的行为(通过时间序列模式提取规则)。随着值从一个地方跳到另一个地方,这些模型的规则说明了分区随时间的变化。换句话说:让我们创建一个linguistic variables来表示数字时间序列,这些区域将是我们变量的语言术语。
当我们创建一个linguistic variables来表示话语世界时,我们创建了一个“词汇”,然后模糊序列由该词汇中的单词组成。这些单词的顺序 - 句子或短语 - 是我们需要学习的模式。
为方便起见,我将模糊时间序列的方法分为两个程序:训练和预测。
训练过程
我们将在本教程中使用模糊时间序列起源的一个众所周知的时间序列:阿拉巴马大学的招生。您可以看到以下数据:
1.Universe of Discourse U
首先我们需要从训练数据中知道universe of discourse U ,例如U = [min(X),max(X)]。通常我们将上限和下限推算为20%,作为安全边际。
2.创建Linguistic Variable Ã(Universe of Discourse Partitioning)
现在我们需要在几个重叠的间隔(即分区)上分割U并为它们中的每一个创建一个模糊集。区间数是模糊时间序列中最重要的参数之一,它将直接暗示模型的准确性。
除了分区数量之外,我们分割U的方式也会对准确性产生很大影响。此后,我们采用最简单的分区方法 - 网格分区,其中所有分区具有相同的长度和格式。对于我们的示例数据,我们将使用10分区方案,使得语言变量为Ã= {A0,A1,...,A9}。
3.模糊化
现在我们可以将X(t)的数值转换为linguistic variable Ã的模糊值,从而产生模糊时间序列F(t)。提醒Ã上的模糊集是重叠的总是好的,因此对于每个x∈X(t),它可能属于多于一个模糊集Ai∈Ã。在Chen方法上,事情有点简单:只选择最大隶属度模糊集。然而,在其他FTS方法中,考虑了所有模糊值。
使用Chen的方法,我们的测试数据的模糊值将是F(t)= {A1,A2,A2,A3,A4,A4,A4,A4,A5,A5,A5,A4,A4,A4,A4,A4 ,A5,A7,A8,A8,A8,A7}。
4.创建时间模式
时间模式表示在模糊时间序列F(t)上顺序出现的两个模糊集,其格式为Precedent→Consequent,其中Precedent表示时间t上的模糊集,Consequent表示时间t+1后不久出现的模糊集。
对于前面的示例,生成的时间模式将是:
A1→A2,A2→A2,A2→A3,A3→A4,A4→A4,...,A8→A8,A8→A7
5.创建规则
我们的模型规则也具有Precedent→Consequent格式。鉴于先前生成的时间模式,我们将根据其Precedent对它们进行分组。我们的模型将包含针对每个不同Precedent的规则,并且每个规则的Consequent将是每个时间模式的所有Consequent与相同Precedent的并集。
对于前面的示例,生成的规则将是:
A1→A2
A2→A2,A3
A3→A4
A4→A4,A5
A5→A4,A5,A7
A7→A8
A8→A7,A8
规则可视化
事实上,规则集是FTS模型。它们描述了我们的时间序列的行为方式,如果它足够稳定(表现良好),我们可以使用这个模型来预测下一个时间值。
像这样简单易读的模型还有另一个优点:
a)并行/分发很容易,这对大数据非常有吸引力;
b)更新非常容易,这对于经常变化的数据非常有吸引力。
预测过程
由于我们知道时间t的数值,x(t)∈X(t),我们现在想要预测下一个瞬间x(t + 1)。
1.输入值模糊
输入值x(t)将被转换为linguistic variable Ã的模糊值,生成值f(t)。如在训练过程中,仅选择最相关的组。
对于示例数据,对于t = 1992,该值是x(t)= 18876。模糊x(t)最相关的集合是A7,因此f(t)= A7。
2.查找兼容规则
查找precedent 等于f(t)的规则。该规则的consequence 将是t + 1的模糊预测,即f(t + 1)。
对于f(t)= A7,我们有规则A7→A8。然后f(t + 1)= A8。
3. Defuzzyfication
现在你需要将f(t + 1)转换为数值。为此,我们使用质心法,其中数值等于f(t + 1)模糊集中心的平均值,即x(t + 1)= n-1ΣAi,对于i = 0..n-1,n等于f(t + 1)中的集合数。
由于f(t + 1)只有一个集合,因此x(t + 1)= 19366.46。
最准确的方法现在使用更多滞后(这个只使用t-1滞后),规则中的权重,优化器找到最佳数量的集合,滞后等。
pyFTS库
Python的pyFTS库: Fuzzy Time Series for Python library是由位于巴西的Minas Gerais联邦大学(UFMG)的mind - Machine Intelligence and Data Science开发的,主要面向学生、研究人员、数据科学家或希望使用模糊时间序列方法的人
让我们了解图书馆的一些主要特色:
1.测试数据
在pyFTS.data包中有几个常见时间序列的数据集,如TAIEX,纳斯达克,标准普尔500,passengers等。每个数据集都有自己的特征 - 一些是单变量,另一些是多变量等 - 但它们都基本上有两个函数:
- get_data():返回单变量时间序列
- get_dataset():返回多变量时间序列
Python示例如下:
from pyFTS.data import Enrollments train = Enrollments.get_data()
2.数据转换
在pyft .common. transform中,可以使用几个数据转换进行预处理和/或后处理数据,这些数据转换直接影响着 universe of discourse的划分。Python示例如下:
from pyFTS.common import Transformations tdiff = Transformations.Differential(1)
3.Partitioners
pyFTS.partitioners包是universe of discourse partitioners。每个分区器具有representing the linguistic variable的函数,创建Discourse Universe的分区及其模糊集。在所有这些中,至少需要两个构造函数参数:
- data :(mandatory!)训练数据;
- npart :(mandatory!)要构建的最小数量的模糊集;
- mf:将在模糊集上使用的隶属函数,默认情况下为三角形(trimf)。各种成员函数可以在pyFTS.common.Membership中找到;
- transformation:如果序列中使用了任何转换,则应在此处进行报告。
Python示例如下:
from pyFTS.partitioners import Grid, Entropy, Util as pUtil fs = Grid.GridPartitioner(data=train, npart=20) print(fs)
4.模糊时间序列方法
各种方法可以在pyFTS.models包中找到。所有方法都继承自common.fts.FTS类。对于最终用户,有两种主要方法可以了解:
- FTS.fit(data,partitioner = fs):从参数数据的训练数据和已由fs分区器构建的linguistic variable训练模型。建议研究这个函数的帮助,因为这里已经可以使用cluster dispy进行分布式训练。将尽快发布与pySpark兼容的版本。
- FTS.predict(data,type ='point',steps_ahead = 1):它使用已经训练过的模型根据数据中包含的滞后进行预测。有三种可能的预测类型,由'type'参数表示:'point'(默认),'interval'和'distribution'。在选择方法时应该小心,因为并非所有这些都适用于所有这些类型。最后,'steps_ahead'参数指示预测范围,或者您想要预测的前进步数。
Python示例如下:
from pyFTS.models import chen modelo = chen.ConventionalFTS(partitioner=fs) modelo.fit(train) print(modelo) predicoes = modelo.predict(test)