diff --git a/benchmarks.py b/benchmarks.py index 1036f55..b92776c 100644 --- a/benchmarks.py +++ b/benchmarks.py @@ -189,7 +189,10 @@ def SelecaoSimples_MenorRMSE(original,parameters,modelo): sets = partitioner.GridPartitionerTrimf(original,p) fts = modelo(str(p)+ " particoes") fts.train(original,sets) - forecasted = [fts.forecast(xx) for xx in original] + #print(original) + forecasted = fts.forecast(original) + forecasted.insert(0,original[0]) + #print(forecasted) ax0.plot(forecasted,label=fts.name) error = rmse(np.array(forecasted),np.array(original)) print(p,error) @@ -226,8 +229,8 @@ def SelecaoSimples_MenorRMSE(original,parameters,modelo): sets = partitioner.GridPartitionerTrimf(difffts,p) fts = modelo(str(p)+ " particoes") fts.train(difffts,sets) - forecasted = [fts.forecast(xx) for xx in difffts] - #forecasted.insert(0,difffts[0]) + forecasted = fts.forecast(difffts) + forecasted.insert(0,difffts[0]) ax2.plot(forecasted,label=fts.name) error = rmse(np.array(forecasted),np.array(difffts)) print(p,error) diff --git a/chen.py b/chen.py index 73a35d4..160a5cb 100644 --- a/chen.py +++ b/chen.py @@ -24,14 +24,14 @@ class ConventionalFTS(fts.FTS): super(ConventionalFTS, self).__init__(1,name) self.flrgs = {} - def generateFLRG(self, flrs): + def generateFLRG(self, flrs): flrgs = {} for flr in flrs: - if flr.LHS in flrgs: - flrgs[flr.LHS].append(flr.RHS) + if flr.LHS.name in flrgs: + flrgs[flr.LHS.name].append(flr.RHS) else: - flrgs[flr.LHS] = ConventionalFLRG(flr.LHS); - flrgs[flr.LHS].append(flr.RHS) + flrgs[flr.LHS.name] = ConventionalFLRG(flr.LHS); + flrgs[flr.LHS.name].append(flr.RHS) return (flrgs) def train(self, data, sets): @@ -39,26 +39,32 @@ class ConventionalFTS(fts.FTS): tmpdata = common.fuzzySeries(data,sets) flrs = common.generateNonRecurrentFLRs(tmpdata) self.flrgs = self.generateFLRG(flrs) - + def forecast(self,data): - mv = common.fuzzyInstance(data, self.sets) + l = 1 - actual = self.sets[ np.argwhere( mv == max(mv) )[0,0] ] + ndata = np.array(data) + + l = len(ndata) + + ret = [] + + for k in np.arange(1,l): + + mv = common.fuzzyInstance(ndata[k], self.sets) + + actual = self.sets[ np.argwhere( mv == max(mv) )[0,0] ] - if actual.name not in self.flrgs: - return actual.centroid - - flrg = self.flrgs[actual.name] - - count = 0.0 - denom = 0.0 - - for s in flrg.RHS: - denom = denom + self.sets[s].centroid - count = count + 1.0 - - return denom/count + if actual.name not in self.flrgs: + ret.append(actual.centroid) + else: + flrg = self.flrgs[actual.name] + mp = self.getMidpoints(flrg) + + ret.append(sum(mp)/len(mp)) + + return ret diff --git a/fts.py b/fts.py index f1cf7b1..6317f03 100644 --- a/fts.py +++ b/fts.py @@ -1,3 +1,4 @@ +import numpy as np from pyFTS import * class FTS: @@ -23,6 +24,10 @@ class FTS: def train(self, data, sets): pass + + def getMidpoints(self,flrg): + ret = np.array([s.centroid for s in flrg.RHS]) + return ret def __str__(self): tmp = self.name + ":\n" diff --git a/ismailefendi.py b/ismailefendi.py index 87888c7..dd6b46c 100644 --- a/ismailefendi.py +++ b/ismailefendi.py @@ -48,14 +48,26 @@ class ImprovedWeightedFTS(fts.FTS): self.flrgs = self.generateFLRG(flrs) def forecast(self,data): - mv = common.fuzzyInstance(data, self.sets) + l = 1 - actual = self.sets[ np.argwhere( mv == max(mv) )[0,0] ] + ndata = np.array(data) + + l = len(ndata) + + ret = [] + + for k in np.arange(1,l): + + mv = common.fuzzyInstance(ndata[k], self.sets) + + actual = self.sets[ np.argwhere( mv == max(mv) )[0,0] ] - if actual.name not in self.flrgs: - return actual.centroid - - flrg = self.flrgs[actual.name] - - mi = np.array([self.sets[s].centroid for s in flrg.RHS.keys()]) - return mi.dot( flrg.weights() ) + if actual.name not in self.flrgs: + ret.append(actual.centroid) + else: + flrg = self.flrgs[actual.name] + mp = self.getMidpoints(flrg) + + ret.append( mi.dot( flrg.weights() )) + + return ret diff --git a/sadaei.py b/sadaei.py index f89be11..0f2c69c 100644 --- a/sadaei.py +++ b/sadaei.py @@ -53,16 +53,27 @@ class ExponentialyWeightedFTS(fts.FTS): self.flrgs = self.generateFLRG(flrs,c) def forecast(self,data): - mv = common.fuzzyInstance(data, self.sets) + l = 1 - actual = self.sets[ np.argwhere( mv == max(mv) )[0,0] ] + ndata = np.array(data) + + l = len(ndata) + + ret = [] + + for k in np.arange(1,l): + + mv = common.fuzzyInstance(ndata[k], self.sets) + + actual = self.sets[ np.argwhere( mv == max(mv) )[0,0] ] - if actual.name not in self.flrgs: - return actual.centroid - - flrg = self.flrgs[actual.name] - - mi = np.array([self.sets[s].centroid for s in flrg.RHS]) - - return mi.dot( flrg.weights() ) + if actual.name not in self.flrgs: + ret.append(actual.centroid) + else: + flrg = self.flrgs[actual.name] + mp = self.getMidpoints(flrg) + + ret.append( mi.dot( flrg.weights() )) + + return ret diff --git a/yu.py b/yu.py index 2a33a82..60823f6 100644 --- a/yu.py +++ b/yu.py @@ -35,11 +35,11 @@ class WeightedFTS(fts.FTS): def generateFLRG(self, flrs): flrgs = {} for flr in flrs: - if flr.LHS in flrgs: - flrgs[flr.LHS].append(flr.RHS) + if flr.LHS.name in flrgs: + flrgs[flr.LHS.name].append(flr.RHS) else: - flrgs[flr.LHS] = WeightedFLRG(flr.LHS); - flrgs[flr.LHS].append(flr.RHS) + flrgs[flr.LHS.name] = WeightedFLRG(flr.LHS); + flrgs[flr.LHS.name].append(flr.RHS) return (flrgs) def train(self, data, sets): @@ -49,17 +49,26 @@ class WeightedFTS(fts.FTS): self.flrgs = self.generateFLRG(flrs) def forecast(self,data): - - mv = common.fuzzyInstance(data, self.sets) + l = 1 - actual = self.sets[ np.argwhere( mv == max(mv) )[0,0] ] - - if actual.name not in self.flrgs: - return actual.centroid - - flrg = self.flrgs[actual.name] - - mi = np.array([self.sets[s].centroid for s in flrg.RHS]) - - return mi.dot( flrg.weights() ) + ndata = np.array(data) + + l = len(ndata) + + ret = [] + + for k in np.arange(1,l): + + mv = common.fuzzyInstance(ndata[k], self.sets) + + actual = self.sets[ np.argwhere( mv == max(mv) )[0,0] ] + if actual.name not in self.flrgs: + ret.append(actual.centroid) + else: + flrg = self.flrgs[actual.name] + mp = self.getMidpoints(flrg) + + ret.append( mi.dot( flrg.weights() )) + + return ret