Nonstationary Fuzzy Sets
This commit is contained in:
parent
71cbb84574
commit
fa231740a5
@ -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
|
||||||
"""
|
"""
|
||||||
|
|
||||||
param = self.parameters
|
if t not in self.cache:
|
||||||
param = self.perform_location(t, param)
|
param = self.parameters
|
||||||
param = self.perform_width(t, param)
|
param = self.perform_location(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)
|
||||||
|
25
pyFTS/nonstationary/util.py
Normal file
25
pyFTS/nonstationary/util.py
Normal 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)
|
@ -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)
|
||||||
|
@ -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):
|
||||||
@ -47,4 +48,4 @@ class FuzzySet(FuzzySet.FuzzySet):
|
|||||||
|
|
||||||
def membership(self, x):
|
def membership(self, x):
|
||||||
dp = strip_datepart(x, self.datepart)
|
dp = strip_datepart(x, self.datepart)
|
||||||
return self.mf.membership(dp)
|
return self.mf.membership(dp)
|
||||||
|
20
pyFTS/tests/nonstationary.py
Normal file
20
pyFTS/tests/nonstationary.py
Normal 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)
|
4
setup.py
4
setup.py
@ -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',
|
||||||
|
Loading…
Reference in New Issue
Block a user