- Non Stationary Fuzzy Time Series - NSFTS: stable version

This commit is contained in:
Petrônio Cândido 2017-10-06 13:04:33 -03:00
parent b3db1a60a3
commit a8e3ba4810
6 changed files with 74 additions and 14 deletions
pyFTS

@ -52,7 +52,7 @@ def generateRecurrentFLRs(fuzzyData):
tmp = FLR(l, r) tmp = FLR(l, r)
flrs.append(tmp) flrs.append(tmp)
else: else:
tmp = FLR.FLR(lhs,rhs) tmp = FLR(lhs,rhs)
flrs.append(tmp) flrs.append(tmp)
return flrs return flrs

@ -221,9 +221,9 @@ class PolynomialNonStationaryPartitioner(partitioner.Partitioner):
def get_polynomial_perturbations(self, data, **kwargs): def get_polynomial_perturbations(self, data, **kwargs):
w = kwargs.get("window_size", int(len(data) / 5)) w = kwargs.get("window_size", int(len(data) / 5))
deg = kwargs.get("degree", 2) deg = kwargs.get("degree", 2)
xmax = [0] xmax = [data[0]]
tmax = [0] tmax = [0]
xmin = [0] xmin = [data[0]]
tmin = [0] tmin = [0]
lengs = [0] lengs = [0]
tlengs = [0] tlengs = [0]

@ -76,11 +76,21 @@ class NonStationaryFTS(fts.FTS):
for k in np.arange(0, l): for k in np.arange(0, l):
#print("input: " + str(ndata[k]))
tdisp = k + time_displacement tdisp = k + time_displacement
affected_sets = [ [set, set.membership(ndata[k], tdisp)] affected_sets = [ [set, set.membership(ndata[k], tdisp)]
for set in self.sets if set.membership(ndata[k], tdisp) > 0.0] for set in self.sets if set.membership(ndata[k], tdisp) > 0.0]
if len(affected_sets) == 0:
if self.sets[0].get_lower(tdisp) > ndata[k]:
affected_sets.append([self.sets[0], 1.0])
elif self.sets[-1].get_upper(tdisp) < ndata[k]:
affected_sets.append([self.sets[-1], 1.0])
#print(affected_sets)
tmp = [] tmp = []
for aset in affected_sets: for aset in affected_sets:
if aset[0] in self.flrgs: if aset[0] in self.flrgs:
@ -88,7 +98,11 @@ class NonStationaryFTS(fts.FTS):
else: else:
tmp.append(aset[0].get_midpoint(tdisp) * aset[1]) tmp.append(aset[0].get_midpoint(tdisp) * aset[1])
ret.append(sum(tmp)) pto = sum(tmp)
#print(pto)
ret.append(pto)
ret = self.doInverseTransformations(ret, params=[data[self.order - 1:]]) ret = self.doInverseTransformations(ret, params=[data[self.order - 1:]])

@ -15,13 +15,19 @@ def plot_sets(uod, sets, start=0, end=10, tam=[5, 5], colors=None, save=False, f
param = set.perturbated_parameters[t] param = set.perturbated_parameters[t]
if set.mf == Membership.trimf: if set.mf == Membership.trimf:
axes.plot([t, t+1, t], param) if t == start:
axes.plot([t, t+1, t], param, label=set.name)
else:
axes.plot([t, t + 1, t], param)
ticks.extend(["t+"+str(t),""]) ticks.extend(["t+"+str(t),""])
axes.set_ylabel("Universe of Discourse") axes.set_ylabel("Universe of Discourse")
axes.set_xlabel("Time") axes.set_xlabel("Time")
plt.xticks([k for k in np.arange(0,2*end,1)], ticks, rotation='vertical') plt.xticks([k for k in np.arange(0,end,1)], ticks, rotation='vertical')
handles0, labels0 = axes.get_legend_handles_labels()
lgd = axes.legend(handles0, labels0, loc=2, bbox_to_anchor=(1, 1))
plt.tight_layout() plt.tight_layout()

@ -79,4 +79,4 @@ class Partitioner(object):
ax.plot(tmpx, tmpy) ax.plot(tmpx, tmpy)
def __str__(self): def __str__(self):
return self.name return self.name + ":\n ".join([str(a) + "\n" for a in self.sets])

@ -1,10 +1,13 @@
import os
import numpy as np import numpy as np
from pyFTS.common import Membership from pyFTS.common import Membership
from pyFTS.nonstationary import common,perturbation,util,nsfts from pyFTS.nonstationary import common,perturbation,util,nsfts
from pyFTS.partitioners import Grid from pyFTS.partitioners import Grid
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import pandas as pd
os.chdir("/home/petronio/Dropbox/Doutorado/Codigos/")
"""
def generate_heteroskedastic_linear(mu_ini, sigma_ini, mu_inc, sigma_inc, it=10, num=35): def generate_heteroskedastic_linear(mu_ini, sigma_ini, mu_inc, sigma_inc, it=10, num=35):
mu = mu_ini mu = mu_ini
sigma = sigma_ini sigma = sigma_ini
@ -17,6 +20,8 @@ def generate_heteroskedastic_linear(mu_ini, sigma_ini, mu_inc, sigma_inc, it=10,
lmv1 = generate_heteroskedastic_linear(1,0.1,1,0.3) lmv1 = generate_heteroskedastic_linear(1,0.1,1,0.3)
#lmv1 = generate_heteroskedastic_linear(5,0.1,0,0.2)
#lmv1 = generate_heteroskedastic_linear(1,0.3,1,0)
ns = 5 #number of fuzzy sets ns = 5 #number of fuzzy sets
ts = 200 ts = 200
@ -25,19 +30,54 @@ test = lmv1[ts:]
w = 25 w = 25
deg = 4 deg = 4
fig, axes = plt.subplots(nrows=1, ncols=1, figsize=[10,5])
tmp_fs = Grid.GridPartitioner(train[:35], 10) tmp_fs = Grid.GridPartitioner(train[:35], 10)
fs = common.PolynomialNonStationaryPartitioner(train, tmp_fs, window_size=35, degree=1) fs = common.PolynomialNonStationaryPartitioner(train, tmp_fs, window_size=35, degree=1)
nsfts1 = nsfts.NonStationaryFTS("", partitioner=fs) nsfts1 = nsfts.NonStationaryFTS("", partitioner=fs)
nsfts1.train(train[:35]) nsfts1.train(train[:100])
tmp = nsfts1.forecast(test, time_displacement=200) print(fs)
axes.plot(test) print(nsfts1)
axes.plot(tmp)
tmp = nsfts1.forecast(test[:10], time_displacement=200)
print(tmp) print(tmp)
"""
passengers = pd.read_csv("DataSets/AirPassengers.csv", sep=",")
passengers = np.array(passengers["Passengers"])
ts = 80
trainp = passengers[:ts]
testp = passengers[ts:]
tmp_fsp = Grid.GridPartitioner(trainp[:50], 10)
fsp = common.PolynomialNonStationaryPartitioner(trainp, tmp_fsp, window_size=20, degree=1)
nsftsp = nsfts.NonStationaryFTS("", partitioner=fsp)
nsftsp.train(trainp[:50])
print(fsp)
print(nsftsp)
tmpp = nsftsp.forecast(testp, time_displacement=ts)
print(testp)
print(tmpp)
#fig, axes = plt.subplots(nrows=1, ncols=1, figsize=[15,5])
"""
axes.plot(testp, label="Original")
#axes.plot(tmpp, label="NSFTS")
handles0, labels0 = axes.get_legend_handles_labels()
lgd = axes.legend(handles0, labels0, loc=2)
"""