Nonstationary Fuzzy Sets

This commit is contained in:
Petrônio Cândido 2017-09-29 16:00:51 -03:00
parent 71cbb84574
commit fa231740a5
7 changed files with 75 additions and 11 deletions

View File

@ -36,12 +36,19 @@ class MembershipFunction(object):
self.width_params = kwargs.get("width_params", None) self.width_params = kwargs.get("width_params", None)
self.noise = kwargs.get("noise", None) self.noise = kwargs.get("noise", None)
self.noise_params = kwargs.get("noise_params", None) self.noise_params = kwargs.get("noise_params", None)
self.cache = {}
def perform_location(self, t, param): def perform_location(self, t, param):
if self.location is None: if self.location is None:
return param return param
inc = self.location(t, self.location_params) if not isinstance(self.location, (list,set)):
self.location = [self.location]
self.location_params = [self.location_params]
l = len(self.location)
inc = sum([self.location[k](t, self.location_params[k]) for k in np.arange(0,l)] )
if self.mf == Membership.gaussmf: if self.mf == Membership.gaussmf:
#changes only the mean parameter #changes only the mean parameter
@ -59,7 +66,13 @@ class MembershipFunction(object):
if self.width is None: if self.width is None:
return param return param
inc = self.width(t, self.width_params) if not isinstance(self.width, (list, set)):
self.width = [self.width]
self.width_params = [self.width_params]
l = len(self.width)
inc = sum([self.width[k](t, self.width_params[k]) for k in np.arange(0, l)])
if self.mf == Membership.gaussmf: if self.mf == Membership.gaussmf:
#changes only the variance parameter #changes only the variance parameter
@ -68,12 +81,12 @@ class MembershipFunction(object):
#changes only the smooth parameter #changes only the smooth parameter
return [param[0] + inc, param[1]] return [param[0] + inc, param[1]]
elif self.mf == Membership.trimf: elif self.mf == Membership.trimf:
return [param[0] + inc, param[1], param[2] - inc] return [param[0] - inc, param[1], param[2] + inc]
elif self.mf == Membership.trapmf: elif self.mf == Membership.trapmf:
l = (param[3]-param[0]) l = (param[3]-param[0])
rab = (param[1] - param[0]) / l rab = (param[1] - param[0]) / l
rcd = (param[3] - param[2]) / l rcd = (param[3] - param[2]) / l
return [param[0] + inc, param[1] + inc*rab, param[2] - inc*rcd, param[3] - inc] return [param[0] - inc, param[1] - inc*rab, param[2] + inc*rcd, param[3] + inc]
else: else:
return param return param
@ -84,11 +97,13 @@ class MembershipFunction(object):
:return: membership value of x at this fuzzy set :return: membership value of x at this fuzzy set
""" """
if t not in self.cache:
param = self.parameters param = self.parameters
param = self.perform_location(t, param) param = self.perform_location(t, param)
param = self.perform_width(t, param) param = self.perform_width(t, param)
self.cache[t] = param
tmp = self.mf(x, param) tmp = self.mf(x, self.cache[t])
if self.noise is not None: if self.noise is not None:
tmp += self.noise(t, self.noise_params) tmp += self.noise(t, self.noise_params)

View File

@ -0,0 +1,25 @@
import numpy as np
import pandas as pd
import matplotlib as plt
import matplotlib.colors as pltcolors
import matplotlib.pyplot as plt
from pyFTS.common import Membership, Util
def plot_sets(uod, sets, num=10, tam=[5, 5], colors=None, save=False, file=None):
ticks = []
fig, axes = plt.subplots(nrows=1, ncols=1, figsize=tam)
for t in np.arange(0,num,1):
for ct, set in enumerate(sets):
x = [2*t + set.membership(v, t) for v in uod]
if colors is not None: c = colors[ct]
axes.plot(x, uod, c=c)
ticks.extend(["t+"+str(t),""])
axes.set_ylabel("Universe of Discourse")
axes.set_xlabel("Time")
plt.xticks([k for k in np.arange(0,2*num,1)], ticks, rotation='vertical')
plt.tight_layout()
Util.showAndSaveImage(fig, file, save)

View File

@ -11,6 +11,7 @@ all_methods = [Grid.GridPartitioner, Entropy.EntropyPartitioner, FCM.FCMPartitio
mfs = [Membership.trimf, Membership.gaussmf, Membership.trapmf] mfs = [Membership.trimf, Membership.gaussmf, Membership.trapmf]
def plot_sets(data, sets, titles, tam=[12, 10], save=False, file=None): def plot_sets(data, sets, titles, tam=[12, 10], save=False, file=None):
num = len(sets) num = len(sets)
#fig = plt.figure(figsize=tam) #fig = plt.figure(figsize=tam)

View File

@ -1,7 +1,8 @@
import numpy as np import numpy as np
import pandas as pd import pandas as pd
from enum import Enum from enum import Enum
from pyFTS.common import FuzzySet from pyFTS.common import FuzzySet, Membership
from pyFTS.partitioners import partitioner, Grid
class DateTime(Enum): class DateTime(Enum):

View File

@ -0,0 +1,20 @@
import numpy as np
from pyFTS.common import Membership
from pyFTS.nonstationary import common,pertubation,util
import importlib
importlib.reload(util)
uod = np.arange(0,20,0.1)
kwargs = {'location': pertubation.linear, 'location_params': [1,0],
'width': pertubation.linear, 'width_params': [1,0]}
mf1 = common.MembershipFunction('A1',Membership.trimf,[0,1,2], **kwargs)
mf2 = common.MembershipFunction('A2',Membership.trimf,[1,2,3], **kwargs)
mf3 = common.MembershipFunction('A3',Membership.trimf,[2,3,4], **kwargs)
mf4 = common.MembershipFunction('A4',Membership.trimf,[3,4,5], **kwargs)
sets = [mf1, mf2, mf3, mf4]
util.plot_sets(uod, sets)

View File

@ -1,7 +1,9 @@
from distutils.core import setup from distutils.core import setup
setup( setup(
name = 'pyFTS', name = 'pyFTS',
packages = ['pyFTS','pyFTS.benchmarks','pyFTS.common','pyFTS.data', 'pyFTS.ensemble','pyFTS.models','pyFTS.models.seasonal','pyFTS.partitioners','pyFTS.probabilistic','pyFTS.tests'], packages = ['pyFTS','pyFTS.benchmarks','pyFTS.common','pyFTS.data', 'pyFTS.ensemble',
'pyFTS.models','pyFTS.seasonal','pyFTS.partitioners','pyFTS.probabilistic',
'pyFTS.tests','pyFTS.nonstationary'],
package_data = {'benchmarks':['*'], 'common':['*'], 'data':['*'], 'ensemble':['*'], 'models':['*'], 'seasonal':['*'], 'partitioners':['*'], 'probabilistic':['*'], 'tests':['*']}, package_data = {'benchmarks':['*'], 'common':['*'], 'data':['*'], 'ensemble':['*'], 'models':['*'], 'seasonal':['*'], 'partitioners':['*'], 'probabilistic':['*'], 'tests':['*']},
version = '1.1.1', version = '1.1.1',
description = 'Fuzzy Time Series for Python', description = 'Fuzzy Time Series for Python',