pyFTS/hwang.py

56 lines
1.8 KiB
Python
Raw Normal View History

"""
High Order Fuzzy Time Series by Hwang, Chen and Lee (1998)
Jeng-Ren Hwang, Shyi-Ming Chen, and Chia-Hoang Lee, Handling forecasting problems using fuzzy time series,
Fuzzy Sets Syst., no. 100, pp. 217228, 1998.
"""
import numpy as np
from pyFTS.common import FuzzySet,FLR,Transformations
from pyFTS import fts
class HighOrderFTS(fts.FTS):
def __init__(self, name, **kwargs):
super(HighOrderFTS, self).__init__(1, name)
self.is_high_order = True
self.min_order = 2
self.name = "Hwang High Order FTS"
self.shortname = "Hwang" + name
self.detail = "Hwang"
def forecast(self, data, **kwargs):
ndata = self.doTransformations(data)
cn = np.array([0.0 for k in range(len(self.sets))])
ow = np.array([[0.0 for k in range(len(self.sets))] for z in range(self.order - 1)])
rn = np.array([[0.0 for k in range(len(self.sets))] for z in range(self.order - 1)])
ft = np.array([0.0 for k in range(len(self.sets))])
ret = []
for t in np.arange(self.order-1, len(ndata)):
for s in range(len(self.sets)):
cn[s] = self.sets[s].membership(ndata[t])
for w in range(self.order - 1):
ow[w, s] = self.sets[s].membership(ndata[t - w])
rn[w, s] = ow[w, s] * cn[s]
ft[s] = max(ft[s], rn[w, s])
mft = max(ft)
out = 0.0
count = 0.0
for s in range(len(self.sets)):
if ft[s] == mft:
out = out + self.sets[s].centroid
count += 1.0
ret.append(out / count)
ret = self.doInverseTransformations(ret, params=[data[self.order - 1:]])
return ret
def train(self, data, sets, order=1, parameters=None):
self.sets = sets
self.order = order