Source code for pyFTS.models.multivariate.grid
from pyFTS.models.multivariate import partitioner
from pyFTS.models.multivariate.common import MultivariateFuzzySet, fuzzyfy_instance_clustered
from itertools import product
from scipy.spatial import KDTree
import numpy as np
import pandas as pd
[docs]class GridCluster(partitioner.MultivariatePartitioner):
"""
A cartesian product of all fuzzy sets of all variables
"""
def __init__(self, **kwargs):
super(GridCluster, self).__init__(**kwargs)
self.name="GridCluster"
self.build(None)
[docs] def build(self, data):
fsets = [[x for x in k.partitioner.sets.values()]
for k in self.explanatory_variables]
c = 0
for k in product(*fsets):
mvfset = MultivariateFuzzySet(target_variable=self.target_variable)
for fset in k:
mvfset.append_set(fset.variable, fset)
self.sets[mvfset.name] = mvfset
c += 1
self.build_index()
[docs]class IncrementalGridCluster(partitioner.MultivariatePartitioner):
"""
Create combinations of fuzzy sets of the variables on demand, incrementally increasing the
multivariate fuzzy set base.
"""
def __init__(self, **kwargs):
super(IncrementalGridCluster, self).__init__(**kwargs)
self.name="IncrementalGridCluster"
self.build(None)
[docs] def fuzzyfy(self, data, **kwargs):
if isinstance(data, pd.DataFrame):
ret = []
for index, inst in data.iterrows():
mv = self.fuzzyfy(inst, **kwargs)
ret.append(mv)
return ret
if self.kdtree is not None:
fsets = self.search(data, type='name')
else:
fsets = self.incremental_search(data, type='name')
mode = kwargs.get('mode', 'sets')
if mode == 'sets':
return fsets
elif mode == 'vector':
raise NotImplementedError()
elif mode == 'both':
ret = []
for key in fsets:
mvfset = self.sets[key]
ret.append((key, mvfset.membership(data)))
return ret
[docs] def incremental_search(self, data, **kwargs):
alpha_cut = kwargs.get('alpha_cut', 0.)
mode = kwargs.get('mode', 'sets')
fsets = {}
ret = []
for var in self.explanatory_variables:
ac = alpha_cut if alpha_cut > 0. else var.alpha_cut
fsets[var.name] = var.partitioner.fuzzyfy(data[var.name], mode='sets', alpha_cut=ac)
fset = [val for key, val in fsets.items()]
for p in product(*fset):
key = ''.join(p)
if key not in self.sets:
mvfset = MultivariateFuzzySet(target_variable=self.target_variable)
for ct, fs in enumerate(p):
mvfset.append_set(self.explanatory_variables[ct].name,
self.explanatory_variables[ct].partitioner[fs])
mvfset.name = key
self.sets[key] = mvfset
ret.append(key)
return ret
[docs] def prune(self):
self.build_index()