diff --git a/benchmarks/benchmarks.py b/benchmarks/benchmarks.py index d08df03..f8265de 100644 --- a/benchmarks/benchmarks.py +++ b/benchmarks/benchmarks.py @@ -144,7 +144,7 @@ def point_sliding_window(data, windowsize, train=0.8,models=None,partitioners=[G times[_key].append(_end - _start) _start = time.time() - _rmse, _smape, _u = get_point_statistics(test, mfts, indexer) + _rmse, _smape, _u = Measures.get_point_statistics(test, mfts, indexer) _end = time.time() rmse[_key].append(_rmse) smape[_key].append(_smape) @@ -271,7 +271,7 @@ def all_point_forecasters(data_train, data_test, partitions, max_order=3, statis def print_point_statistics(data, models, externalmodels = None, externalforecasts = None, indexers=None): ret = "Model & Order & RMSE & SMAPE & Theil's U \\\\ \n" for count,model in enumerate(models,start=0): - _rmse, _smape, _u = get_point_statistics(data, model, indexers) + _rmse, _smape, _u = Measures.get_point_statistics(data, model, indexers) ret += model.shortname + " & " ret += str(model.order) + " & " ret += str(_rmse) + " & " @@ -765,7 +765,7 @@ def all_ahead_forecasters(data_train, data_test, partitions, start, steps, resol print_distribution_statistics(data_test[start:], objs, steps, resolution) - plotComparedIntervalsAhead(data_test, objs, lcolors, distributions=distributions, time_from=start, time_to=steps, + plot_compared_intervals_ahead(data_test, objs, lcolors, distributions=distributions, time_from=start, time_to=steps, interpol=False, save=save, file=file, tam=tam, resolution=resolution, option=option) @@ -806,7 +806,7 @@ def print_distribution_statistics(original, models, steps, resolution): print(ret) -def plotComparedIntervalsAhead(original, models, colors, distributions, time_from, time_to, +def plot_compared_intervals_ahead(original, models, colors, distributions, time_from, time_to, interpol=False, save=False, file=None, tam=[20, 5], resolution=None, cmap='Blues',option=2): fig = plt.figure(figsize=tam) @@ -824,7 +824,7 @@ def plotComparedIntervalsAhead(original, models, colors, distributions, time_fro for count, fts in enumerate(models, start=0): if fts.hasDistributionForecasting and distributions[count]: density = fts.forecastAheadDistribution(original[time_from - fts.order:time_from], time_to, - parameters=option) + resolution=resolution, method=option) Y = [] X = [] diff --git a/hofts.py b/hofts.py index bd352dc..1e27702 100644 --- a/hofts.py +++ b/hofts.py @@ -39,7 +39,7 @@ class HighOrderFLRG(object): class HighOrderFTS(fts.FTS): - def __init__(self, order, **kwargs): + def __init__(self, order, name, **kwargs): super(HighOrderFTS, self).__init__(1, "HOFTS" + name) self.name = "High Order FTS" self.shortname = "HOFTS" + name diff --git a/ifts.py b/ifts.py index 660dc5b..c61cd99 100644 --- a/ifts.py +++ b/ifts.py @@ -7,8 +7,8 @@ from pyFTS import hofts, fts, tree class IntervalFTS(hofts.HighOrderFTS): - def __init__(self, order, **kwargs): - super(IntervalFTS, self).__init__("IFTS " + name) + def __init__(self, order, name, **kwargs): + super(IntervalFTS, self).__init__(order=1, name="IFTS " + name) self.shortname = "IFTS " + name self.name = "Interval FTS" self.detail = "Silva, P.; GuimarĂ£es, F.; Sadaei, H. (2016)" diff --git a/partitioners/Entropy.py b/partitioners/Entropy.py index c4a0313..d300748 100644 --- a/partitioners/Entropy.py +++ b/partitioners/Entropy.py @@ -98,7 +98,7 @@ class EntropyPartitioner(partitioner.Partitioner): b2 = (partitions[c + 1] - partitions[c]) / 2 sets.append(FuzzySet.FuzzySet(self.prefix + str(c), Membership.trapmf, [partitions[c - 1], partitions[c] - b1, - partitions[c] - b2, partitions[c + 1]], + partitions[c] + b2, partitions[c + 1]], partitions[c])) return sets diff --git a/partitioners/FCM.py b/partitioners/FCM.py index f2a98c3..1cc5428 100644 --- a/partitioners/FCM.py +++ b/partitioners/FCM.py @@ -107,12 +107,22 @@ class FCMPartitioner(partitioner.Partitioner): def build(self,data): sets = [] - centroides = fuzzy_cmeans(self.partitions, data, 1, 2) - centroides.append(self.max) - centroides.append(self.min) - centroides = list(set(centroides)) - centroides.sort() - for c in np.arange(1,len(centroides)-1): - sets.append(FuzzySet.FuzzySet(self.prefix+str(c),Membership.trimf,[round(centroides[c-1],3), round(centroides[c],3), round(centroides[c+1],3)], round(centroides[c],3) ) ) + centroids = fuzzy_cmeans(self.partitions, data, 1, 2) + centroids.append(self.max) + centroids.append(self.min) + centroids = list(set(centroids)) + centroids.sort() + for c in np.arange(1,len(centroids)-1): + if self.membership_function == Membership.trimf: + sets.append(FuzzySet.FuzzySet(self.prefix+str(c),Membership.trimf, + [round(centroids[c-1],3), round(centroids[c],3), round(centroids[c+1],3)], + round(centroids[c],3) ) ) + elif self.membership_function == Membership.trapmf: + q1 = (round(centroids[c], 3) - round(centroids[c - 1], 3))/2 + q2 = (round(centroids[c+1], 3) - round(centroids[c], 3)) / 2 + sets.append(FuzzySet.FuzzySet(self.prefix + str(c), Membership.trimf, + [round(centroids[c - 1], 3), round(centroids[c], 3) - q1, + round(centroids[c], 3) + q2, round(centroids[c + 1], 3)], + round(centroids[c], 3))) return sets \ No newline at end of file diff --git a/partitioners/Huarng.py b/partitioners/Huarng.py index 5537795..441050d 100644 --- a/partitioners/Huarng.py +++ b/partitioners/Huarng.py @@ -34,8 +34,17 @@ class HuarngPartitioner(partitioner.Partitioner): npart = math.ceil(dlen / base) partition = math.ceil(self.min) for c in range(npart): - sets.append( - FuzzySet.FuzzySet(self.prefix + str(c), Membership.trimf, [partition - base, partition, partition + base], partition)) + if self.membership_function == Membership.trimf: + sets.append( FuzzySet.FuzzySet(self.prefix + str(c), Membership.trimf, + [partition - base, partition, partition + base], partition)) + elif self.membership_function == Membership.gaussmf: + sets.append(FuzzySet.FuzzySet(self.prefix + str(c), Membership.gaussmf, + [partition, base/2], partition)) + elif self.membership_function == Membership.trapmf: + sets.append(FuzzySet.FuzzySet(self.prefix + str(c), Membership.trapmf, + [partition - base, partition - (base/2), + partition + (base / 2), partition + base], partition)) + partition += base return sets diff --git a/partitioners/Util.py b/partitioners/Util.py index 73fa5e2..a7e641a 100644 --- a/partitioners/Util.py +++ b/partitioners/Util.py @@ -7,6 +7,9 @@ from mpl_toolkits.mplot3d import Axes3D from pyFTS.common import Membership, Util from pyFTS.partitioners import Grid,Huarng,FCM,Entropy +all_methods = [Grid.GridPartitioner, Entropy.EntropyPartitioner, FCM.FCMPartitioner, Huarng.HuarngPartitioner] + +mfs = [Membership.trimf, Membership.gaussmf, Membership.trapmf] def plot_sets(data, sets, titles, tam=[12, 10], save=False, file=None): num = len(sets) @@ -20,7 +23,7 @@ def plot_sets(data, sets, titles, tam=[12, 10], save=False, file=None): #ax = fig.add_axes([0.05, 1-(k*h), 0.9, h*0.7]) # left, bottom, width, height ax = axes[k] ax.set_title(titles[k]) - ax.set_ylim([0, 1]) + ax.set_ylim([0, 1.1]) ax.set_xlim([minx, maxx]) for s in sets[k]: if s.mf == Membership.trimf: @@ -29,7 +32,7 @@ def plot_sets(data, sets, titles, tam=[12, 10], save=False, file=None): tmpx = [ kk for kk in np.arange(s.lower, s.upper)] tmpy = [s.membership(kk) for kk in np.arange(s.lower, s.upper)] ax.plot(tmpx, tmpy) - elif s.mf == Membership.gaussmf: + elif s.mf == Membership.trapmf: ax.plot(s.parameters, [0, 1, 1, 0]) plt.tight_layout() @@ -44,9 +47,6 @@ def plot_partitioners(data, objs, tam=[12, 10], save=False, file=None): def explore_partitioners(data, npart, methods=None, mf=None, tam=[12, 10], save=False, file=None): - all_methods = [Grid.GridPartitioner, Entropy.EntropyPartitioner, FCM.FCMPartitioner, Huarng.HuarngPartitioner] - mfs = [Membership.trimf, Membership.gaussmf, Membership.trapmf] - if methods is None: methods = all_methods @@ -60,4 +60,4 @@ def explore_partitioners(data, npart, methods=None, mf=None, tam=[12, 10], save= obj = p(data, npart,m) objs.append(obj) - plot_partitioners(data, objs, tam, save, file) + plot_partitioners(data, objs, tam, save, file) \ No newline at end of file diff --git a/pwfts.py b/pwfts.py index 2f9996f..8ae644b 100644 --- a/pwfts.py +++ b/pwfts.py @@ -42,8 +42,8 @@ class ProbabilisticWeightedFLRG(hofts.HighOrderFLRG): class ProbabilisticWeightedFTS(ifts.IntervalFTS): - def __init__(self, order, name, **kwargs): - super(ProbabilisticWeightedFTS, self).__init__("PWFTS") + def __init__(self, name, **kwargs): + super(ProbabilisticWeightedFTS, self).__init__(order=1, name=name) self.shortname = "PWFTS " + name self.name = "Probabilistic FTS" self.detail = "Silva, P.; GuimarĂ£es, F.; Sadaei, H." @@ -53,7 +53,7 @@ class ProbabilisticWeightedFTS(ifts.IntervalFTS): self.hasIntervalForecasting = True self.hasDistributionForecasting = True self.isHighOrder = True - self.auto_update = update + self.auto_update = kwargs.get('update',False) def train(self, data, sets, order=1,parameters=None): @@ -468,13 +468,17 @@ class ProbabilisticWeightedFTS(ifts.IntervalFTS): ret = [] + resolution = kwargs.get('resolution',100) + + method = kwargs.get('method',2) + intervals = self.forecastAheadInterval(data, steps) grid = self.getGridClean(resolution) index = SortedCollection.SortedCollection(iterable=grid.keys()) - if parameters == 1: + if method == 1: grids = [] for k in np.arange(0, steps): @@ -522,7 +526,7 @@ class ProbabilisticWeightedFTS(ifts.IntervalFTS): tmp = np.array([grids[k][q] for q in sorted(grids[k])]) ret.append(tmp / sum(tmp)) - elif parameters == 2: + elif method == 2: ret = [] diff --git a/tests/pwfts.py b/tests/pwfts.py index 180aca9..f32cb58 100644 --- a/tests/pwfts.py +++ b/tests/pwfts.py @@ -20,60 +20,43 @@ from numpy import random #gauss_teste = random.normal(0,1.0,400) -os.chdir("/home/petronio/dados/Dropbox/Doutorado/Disciplinas/AdvancedFuzzyTimeSeriesModels/") +os.chdir("/home/petronio/dados/Dropbox/Doutorado/Codigos/") -#enrollments = pd.read_csv("DataSets/Enrollments.csv", sep=";") -#enrollments = np.array(enrollments["Enrollments"]) +enrollments = pd.read_csv("DataSets/Enrollments.csv", sep=";") +enrollments = np.array(enrollments["Enrollments"]) -taiex = pd.read_csv("DataSets/TAIEX.csv", sep=",") -taiex_treino = np.array(taiex["avg"][2500:3900]) -taiex_teste = np.array(taiex["avg"][3901:4500]) +import importlib +import pandas as pd +from pyFTS.partitioners import Grid +from pyFTS.common import FLR, FuzzySet, Membership, SortedCollection +from pyFTS import fts +from pyFTS import hofts +from pyFTS import pwfts +from pyFTS import tree +from pyFTS.benchmarks import benchmarks as bchmk -#nasdaq = pd.read_csv("DataSets/NASDAQ_IXIC.csv", sep=",") -#nasdaq_treino = np.array(nasdaq["avg"][0:1600]) -#nasdaq_teste = np.array(nasdaq["avg"][1601:2000]) +enrollments_fs1 = Grid.GridPartitioner(enrollments, 6).sets +for s in enrollments_fs1: + print(s) + +pfts1_enrollments = pwfts.ProbabilisticWeightedFTS("1") +pfts1_enrollments.train(enrollments, enrollments_fs1, 1) +pfts1_enrollments.shortname = "1st Order" +pfts2_enrollments = pwfts.ProbabilisticWeightedFTS("2") +pfts2_enrollments.dump = False +pfts2_enrollments.shortname = "2nd Order" +pfts2_enrollments.train(enrollments, enrollments_fs1, 2) +pfts3_enrollments = pwfts.ProbabilisticWeightedFTS("3") +pfts3_enrollments.dump = False +pfts3_enrollments.shortname = "3rd Order" +pfts3_enrollments.train(enrollments, enrollments_fs1, 3) + +bchmk.plot_compared_series(enrollments,[pfts1_enrollments,pfts2_enrollments, pfts3_enrollments], + ["red","blue","green"], linewidth=2, + typeonlegend=True,save=True,file="pictures/pwfts_enrollments_interval.png", + tam=[20,7],points=False, intervals=False) -diff = Transformations.Differential(1) -fs = Grid.GridPartitionerTrimf(taiex_treino,10) - -#tmp = chen.ConventionalFTS("") - -pfts1 = pwfts.ProbabilisticWeightedFTS("1") -#pfts1.appendTransformation(diff) -pfts1.train(taiex_treino,fs,1) - -from pyFTS.benchmarks import ProbabilityDistribution as dist - -forecasts = pfts1.forecast(taiex_treino) - -pmf1 = dist.ProbabilityDistribution("Original",100,[min(taiex_treino),max(taiex_treino)],data=taiex_treino) - -#print(pmf1.entropy()) - -pmf2 = dist.ProbabilityDistribution("Original",100,[min(taiex_treino),max(taiex_treino)],data=forecasts) - -#print(pmf2.entropy()) - -#print(pmf2.kullbackleiblerdivergence(pmf1)) - -#print(pmf2.crossentropy(pmf1)) - -print(pmf1.averageloglikelihood(taiex_treino)) - -print(pmf2.averageloglikelihood(taiex_treino)) - -#pfts2 = pfts.ProbabilisticWeightedFTS("n = 2") -#pfts2.appendTransformation(diff) -#pfts2.train(gauss_treino,fs,2) - -#pfts3 = pfts.ProbabilisticWeightedFTS("n = 3") -#pfts3.appendTransformation(diff) -#pfts3.train(gauss_treino,fs,3) - -#densities1 = pfts1.forecastAheadDistribution(gauss_teste[:50],2,1.50, parameters=2) - -#print(bchmk.getDistributionStatistics(gauss_teste[:50], [pfts1,pfts2,pfts3], 20, 1.50))