PIFTS bugfix

This commit is contained in:
Petrônio Cândido de Lima e Silva 2016-11-01 17:39:13 -02:00
parent e336a0670e
commit ccdc74a49d
3 changed files with 31 additions and 14 deletions

View File

@ -48,7 +48,7 @@ class IntervalFTS(hofts.HighOrderFTS):
ret = [] ret = []
for k in np.arange(self.order,l): for k in np.arange(self.order-1,l):
affected_flrgs = [] affected_flrgs = []
affected_flrgs_memberships = [] affected_flrgs_memberships = []
@ -60,7 +60,7 @@ class IntervalFTS(hofts.HighOrderFTS):
count = 0 count = 0
lags = {} lags = {}
if self.order > 1: if self.order > 1:
subset = ndata[k-self.order : k ] subset = ndata[k-(self.order-1) : k+1 ]
for instance in subset: for instance in subset:
mb = common.fuzzyInstance(instance, self.sets) mb = common.fuzzyInstance(instance, self.sets)

View File

@ -6,7 +6,9 @@ from pyFTS import *
def GridPartitionerTrimf(data,npart,names = None,prefix = "A"): def GridPartitionerTrimf(data,npart,names = None,prefix = "A"):
sets = [] sets = []
dmax = max(data) dmax = max(data)
dmax = dmax + dmax*0.10
dmin = min(data) dmin = min(data)
dmin = dmin - dmin*0.10
dlen = dmax - dmin dlen = dmax - dmin
partlen = dlen / npart partlen = dlen / npart
partition = dmin partition = dmin

View File

@ -92,25 +92,34 @@ class ProbabilisticIntervalFTS(ifts.IntervalFTS):
up = [] up = []
lo = [] lo = []
# Achar os conjuntos que tem pert > 0 para cada lag # Find the sets which membership > 0 for each lag
count = 0 count = 0
lags = {} lags = {}
if self.order > 1: if self.order > 1:
subset = ndata[k-(self.order-1) : k+1 ] subset = ndata[k-(self.order-1) : k+1 ]
for instance in subset: for instance in subset:
mb = common.fuzzyInstance(instance, self.sets) mb = common.fuzzyInstance(instance, self.sets)
tmp = np.argwhere( mb ) tmp = np.argwhere( mb )
idx = np.ravel(tmp) #flat the array idx = np.ravel(tmp) #flatten the array
if idx.size == 0: # the element is out of the bounds of the Universe of Discourse
if instance <= self.sets[0].lower:
idx = [0]
if instance >= self.sets[-1].upper:
idx = [len(self.sets)-1]
lags[count] = idx lags[count] = idx
count = count + 1 count = count + 1
# Constrói uma árvore com todos os caminhos possíveis
# Build the tree with all possible paths
root = tree.FLRGTreeNode(None) root = tree.FLRGTreeNode(None)
self.buildTree(root,lags,0) self.buildTree(root,lags,0)
# Traça os possíveis caminhos e costrói as PFLRG's # Trace the possible paths and build the PFLRG's
for p in root.paths(): for p in root.paths():
path = list(reversed(list(filter(None.__ne__, p)))) path = list(reversed(list(filter(None.__ne__, p))))
@ -120,7 +129,7 @@ class ProbabilisticIntervalFTS(ifts.IntervalFTS):
## ##
affected_flrgs.append( flrg ) affected_flrgs.append( flrg )
# Acha a pertinência geral de cada FLRG # Find the general membership of FLRG
affected_flrgs_memberships.append(min(self.getSequenceMembership(subset, flrg.LHS))) affected_flrgs_memberships.append(min(self.getSequenceMembership(subset, flrg.LHS)))
else: else:
@ -144,6 +153,9 @@ class ProbabilisticIntervalFTS(ifts.IntervalFTS):
# gerar o intervalo # gerar o intervalo
norm = sum(norms) norm = sum(norms)
if norm == 0:
ret.append( [ 0, 0 ] )
else:
ret.append( [ sum(lo)/norm, sum(up)/norm ] ) ret.append( [ sum(lo)/norm, sum(up)/norm ] )
return ret return ret
@ -151,6 +163,9 @@ class ProbabilisticIntervalFTS(ifts.IntervalFTS):
def forecastAhead(self,data,steps): def forecastAhead(self,data,steps):
ret = [[data[k],data[k]] for k in np.arange(len(data)-self.order,len(data))] ret = [[data[k],data[k]] for k in np.arange(len(data)-self.order,len(data))]
for k in np.arange(self.order,steps): for k in np.arange(self.order,steps):
if ret[-1][0] <= self.sets[0].lower and ret[-1][0] >= self.sets[-1].upper:
ret.append(ret[-1])
else:
lower = self.forecast( [ret[x][0] for x in np.arange(k-self.order,k)] ) lower = self.forecast( [ret[x][0] for x in np.arange(k-self.order,k)] )
upper = self.forecast( [ret[x][1] for x in np.arange(k-self.order,k)] ) upper = self.forecast( [ret[x][1] for x in np.arange(k-self.order,k)] )
ret.append([np.min(lower),np.max(upper)]) ret.append([np.min(lower),np.max(upper)])