Example #1
0
    def forecast(self, ndata, **kwargs):

        if self.partitioner is not None:
            ordered_sets = self.partitioner.ordered_sets
        else:
            ordered_sets = FuzzySet.set_ordered(self.partitioner.sets)

        l = len(ndata)
        npart = len(self.partitioner)

        ret = []

        for k in np.arange(0, l):
            mv = FuzzySet.fuzzyfy_instance(ndata[k], self.partitioner.sets)

            r = [max([ min(self.R[i][j], mv[j]) for j in np.arange(0,npart) ]) for i in np.arange(0,npart)]

            fs = np.ravel(np.argwhere(r == max(r)))

            if len(fs) == 1:
                ret.append(self.partitioner.sets[ordered_sets[fs[0]]].centroid)
            else:
                mp = [self.partitioner.sets[ordered_sets[s]].centroid for s in fs]

                ret.append( sum(mp)/len(mp))

        return ret
Example #2
0
    def forecast(self, ndata, **kwargs):
        l = 1

        if self.partitioner is not None:
            ordered_sets = self.partitioner.ordered_sets
        else:
            ordered_sets = FuzzySet.set_ordered(self.sets)

        ndata = np.array(ndata)
        l = len(ndata)

        ret = []

        for k in np.arange(0, l):

            actual = FuzzySet.get_maximum_membership_fuzzyset(
                ndata[k], self.sets, ordered_sets)

            if actual.name not in self.flrgs:
                ret.append(actual.centroid)
            else:
                flrg = self.flrgs[actual.name]
                mp = flrg.get_midpoints(self.sets)

                ret.append(mp.dot(flrg.weights()))

        return ret
Example #3
0
    def forecast(self, data, **kwargs):
        ordered_sets = FuzzySet.set_ordered(self.sets)

        ret = []

        index = self.indexer.get_season_of_data(data)
        ndata = self.indexer.get_data(data)

        for k in np.arange(0, len(data)):

            if str(index[k]) in self.flrgs:

                flrg = self.flrgs[str(index[k])]

                d = FuzzySet.get_fuzzysets(ndata[k],
                                           self.sets,
                                           ordered_sets,
                                           alpha_cut=self.alpha_cut)

                mp = self.get_midpoints(flrg, d)

                ret.append(sum(mp) / len(mp))
            else:
                ret.append(np.nan)

        return ret
Example #4
0
    def __init__(self, **kwargs):
        """
        Even Length Grid Partitioner
        :param seasonality: Time granularity, from pyFTS.models.seasonal.common.DateTime
        :param data: Training data of which the universe of discourse will be extracted. The universe of discourse is the open interval between the minimum and maximum values of the training data.
        :param npart: The number of universe of discourse partitions, i.e., the number of fuzzy sets that will be created
        :param func: Fuzzy membership function (pyFTS.common.Membership)
        """
        super(TimeGridPartitioner, self).__init__(name="TimeGrid",
                                                  preprocess=False,
                                                  **kwargs)

        self.season = kwargs.get('seasonality', DateTime.day_of_year)
        '''Seasonality, a pyFTS.models.seasonal.common.DateTime object'''
        self.mask = kwargs.get('mask', '%Y-%m-%d %H:%M:%S')
        '''A string with datetime formating mask'''

        data = kwargs.get('data', None)
        if self.season == DateTime.year:
            ndata = [strip_datepart(k, self.season) for k in data]
            self.min = min(ndata)
            self.max = max(ndata)
        else:
            tmp = (self.season.value / self.partitions) / 2
            self.min = tmp
            self.max = self.season.value + tmp

        self.type = kwargs.get('type', 'seasonal')

        self.sets = self.build(None)

        if self.ordered_sets is None and self.setnames is not None:
            self.ordered_sets = self.setnames
        else:
            self.ordered_sets = FS.set_ordered(self.sets)
Example #5
0
    def __init__(self, **kwargs):
        """
        Universe of Discourse partitioner scheme. Split data on several fuzzy sets
        :param name: partitioner name
        :param data: Training data of which the universe of discourse will be extracted. The universe of discourse is the open interval between the minimum and maximum values of the training data.
        :param npart: The number of universe of discourse partitions, i.e., the number of fuzzy sets that will be created
        :param func: Fuzzy membership function (pyFTS.common.Membership)
        :param names: list of partitions names. If None is given the partitions will be auto named with prefix
        :param prefix: prefix of auto generated partition names
        :param transformation: data transformation to be applied on data
        """
        self.name = kwargs.get('name', "")
        self.partitions = kwargs.get('npart', 10)
        self.sets = {}
        self.membership_function = kwargs.get('func', Membership.trimf)
        self.setnames = kwargs.get('names', None)
        self.prefix = kwargs.get('prefix', 'A')
        self.transformation = kwargs.get('transformation', None)
        self.indexer = kwargs.get('indexer', None)
        self.variable = kwargs.get('variable', None)
        self.type = kwargs.get('type', 'common')
        self.ordered_sets = None

        if kwargs.get('preprocess', True):

            data = kwargs.get('data', [None])

            if self.indexer is not None:
                ndata = self.indexer.get_data(data)
            else:
                ndata = data

            if self.transformation is not None:
                ndata = self.transformation.apply(ndata)
            else:
                ndata = data

            if self.indexer is not None:
                ndata = self.indexer.get_data(ndata)

            _min = np.nanmin(ndata)
            if _min == -np.inf:
                ndata[ndata == -np.inf] = 0
                _min = np.nanmin(ndata)

            self.min = float(_min * 1.1 if _min < 0 else _min * 0.9)

            _max = max(ndata)
            self.max = float(_max * 1.1 if _max > 0 else _max * 0.9)

            self.sets = self.build(ndata)

            if self.ordered_sets is None and self.setnames is not None:
                self.ordered_sets = self.setnames
            else:
                self.ordered_sets = FuzzySet.set_ordered(self.sets)

            del (ndata)
Example #6
0
    def flr_membership_matrix(self, flr):
        ordered_set = FuzzySet.set_ordered(self.partitioner.sets)
        centroids = [self.partitioner.sets[k].centroid for k in ordered_set]
        lm = [self.partitioner.sets[flr.LHS].membership(k) for k in centroids]
        rm = [self.partitioner.sets[flr.RHS].membership(k) for k in centroids]

        l = len(ordered_set)
        r = np.zeros((l, l))
        for k in range(0,l):
            for l in range(0, l):
                r[k][l] = min(lm[k], rm[l])

        return r
Example #7
0
File: yu.py Project: bekti7/pmi
    def forecast(self, ndata, **kwargs):

        explain = kwargs.get('explain', False)

        if self.partitioner is not None:
            ordered_sets = self.partitioner.ordered_sets
        else:
            ordered_sets = FuzzySet.set_ordered(self.sets)

        ndata = np.array(ndata)

        l = len(ndata) if not explain else 1

        ret = []

        for k in np.arange(0, l):

            actual = FuzzySet.get_maximum_membership_fuzzyset(
                ndata[k], self.sets, ordered_sets)

            if explain:
                print("Fuzzyfication:\n\n {} -> {} \n\n".format(
                    ndata[k], actual.name))

            if actual.name not in self.flrgs:
                ret.append(actual.centroid)

                if explain:
                    print("Rules:\n\n {} -> {} (Naïve)\t Midpoint: {}  \n\n".
                          format(actual.name, actual.name, actual.centroid))

            else:
                flrg = self.flrgs[actual.name]
                mp = flrg.get_midpoints(self.sets)

                final = mp.dot(flrg.weights(self.sets))

                ret.append(final)

                if explain:
                    print("Rules:\n\n {} \n\n ".format(str(flrg)))
                    print("Midpoints: \n\n {}\n\n".format(mp))

                    print("Deffuzyfied value: {} \n".format(final))

        return ret
Example #8
0
    def __init__(self, data, part, **kwargs):
        """"""
        super(SimpleNonStationaryPartitioner,
              self).__init__(name=part.name,
                             data=data,
                             npart=part.partitions,
                             func=part.membership_function,
                             names=part.setnames,
                             prefix=part.prefix,
                             transformation=part.transformation,
                             indexer=part.indexer)  #, preprocess=False)

        for key in part.sets.keys():
            set = part.sets[key]
            tmp = common.FuzzySet(set.name, set.mf, set.parameters, **kwargs)
            tmp.centroid = set.centroid

            self.sets[key] = tmp

        self.ordered_sets = stationary_fs.set_ordered(self.sets)
Example #9
0
    def forecast(self, data, **kwargs):
        ordered_sets = FuzzySet.set_ordered(self.sets)

        ret = []

        index = self.indexer.get_season_of_data(data)
        ndata = self.indexer.get_data(data)

        for k in np.arange(0, len(data)):

            flrg = self.flrgs[str(index[k])]

            d = FuzzySet.get_maximum_membership_fuzzyset(
                ndata[k], self.sets, ordered_sets)

            mp = self.get_midpoints(flrg, d)

            ret.append(sum(mp) / len(mp))

        return ret
Example #10
0
    def __init__(self, data, part, **kwargs):
        """"""
        super(PolynomialNonStationaryPartitioner,
              self).__init__(name=part.name,
                             data=data,
                             npart=part.partitions,
                             func=part.membership_function,
                             names=part.setnames,
                             prefix=part.prefix,
                             transformation=part.transformation,
                             indexer=part.indexer,
                             preprocess=False)

        self.sets = {}

        loc_params, wid_params = self.get_polynomial_perturbations(
            data, **kwargs)

        if self.ordered_sets is None and self.setnames is not None:
            self.ordered_sets = part.setnames
        else:
            self.ordered_sets = stationary_fs.set_ordered(part.sets)

        for ct, key in enumerate(self.ordered_sets):
            set = part.sets[key]
            loc_roots = np.roots(loc_params[ct])[0]
            wid_roots = np.roots(wid_params[ct])[0]
            tmp = common.FuzzySet(
                set.name,
                set.mf,
                set.parameters,
                location=perturbation.polynomial,
                location_params=loc_params[ct],
                location_roots=loc_roots,  #**kwargs)
                width=perturbation.polynomial,
                width_params=wid_params[ct],
                width_roots=wid_roots,
                **kwargs)

            self.sets[set.name] = tmp
Example #11
0
    def forecast(self, ndata, **kwargs):

        if self.sets == None:
            self.sets = self.partitioner.sets
            ordered_sets = self.partitioner.ordered_sets
        else:
            ordered_sets = FuzzySet.set_ordered(self.sets)

        l = len(self.sets)

        cn = np.array([0.0 for k in range(l)])
        ow = np.array([[0.0 for k in range(l)] for z in range(self.order - 1)])
        rn = np.array([[0.0 for k in range(l)] for z in range(self.order - 1)])
        ft = np.array([0.0 for k in range(l)])

        ret = []

        for t in np.arange(self.order - 1, len(ndata)):

            for ix in range(l):
                s = ordered_sets[ix]
                cn[ix] = self.sets[s].membership(
                    FuzzySet.grant_bounds(ndata[t], self.sets, ordered_sets))
                for w in range(self.order - 1):
                    ow[w, ix] = self.sets[s].membership(
                        FuzzySet.grant_bounds(ndata[t - w], self.sets,
                                              ordered_sets))
                    rn[w, ix] = ow[w, ix] * cn[ix]
                    ft[ix] = max(ft[ix], rn[w, ix])
            mft = max(ft)
            out = 0.0
            count = 0.0
            for ix in range(l):
                s = ordered_sets[ix]
                if ft[ix] == mft:
                    out = out + self.sets[s].centroid
                    count += 1.0
            ret.append(out / count)

        return ret
Example #12
0
    def __init__(self, **kwargs):
        """
        Fixed UoD with Even Length Grid Partitioner
        """

        kwargs['preprocess'] = False

        super(GridPartitioner, self).__init__(name="Grid", **kwargs)

        self.max = kwargs.get('max', None)
        self.min = kwargs.get('min', None)

        if self.max is None or self.min is None:
            raise Exception(
                "It is mandatory to inform the max and min parameters!")

        self.sets = self.build(None)

        self.partitions = len(self.sets)

        if self.ordered_sets is None and self.setnames is not None:
            self.ordered_sets = self.setnames[:len(self.sets)]
        else:
            self.ordered_sets = FuzzySet.set_ordered(self.sets)
Example #13
0
    def __init__(self, **kwargs):
        """
        Universe of Discourse partitioner scheme. Split data on several fuzzy sets
        """
        self.name = kwargs.get('name', "")
        """partitioner name"""
        self.partitions = kwargs.get('npart', 10)
        """The number of universe of discourse partitions, i.e., the number of fuzzy sets that will be created"""
        self.sets = {}
        self.membership_function = kwargs.get('func', Membership.trimf)
        """Fuzzy membership function (pyFTS.common.Membership)"""
        self.setnames = kwargs.get('names', None)
        """list of partitions names. If None is given the partitions will be auto named with prefix"""
        self.prefix = kwargs.get('prefix', 'A')
        """prefix of auto generated partition names"""
        self.transformation = kwargs.get('transformation', None)
        """data transformation to be applied on data"""
        self.indexer = kwargs.get('indexer', None)
        self.variable = kwargs.get('variable', None)
        """In a multivariate context, the variable that contains this partitioner"""
        self.type = kwargs.get('type', 'common')
        """The type of fuzzy sets that are generated by this partitioner"""
        self.ordered_sets = None
        """A ordered list of the fuzzy sets names, sorted by their middle point"""
        self.kdtree = None
        """A spatial index to help in fuzzyfication"""
        self.margin = kwargs.get("margin", 0.1)
        """The upper and lower exceeding margins for the known UoD. The default value is .1"""
        self.lower_margin = kwargs.get("lower_margin", self.margin)
        """Specific lower exceeding margins for the known UoD. The default value is the self.margin parameter"""
        self.upper_margin = kwargs.get("lower_margin", self.margin)
        """Specific upper exceeding margins for the known UoD. The default value is the self.margin parameter"""

        if kwargs.get('preprocess', True):

            data = kwargs.get('data', [None])

            if self.indexer is not None:
                ndata = self.indexer.get_data(data)
            else:
                ndata = data

            if self.transformation is not None:
                ndata = self.transformation.apply(ndata)
            else:
                ndata = data

            if self.indexer is not None:
                ndata = self.indexer.get_data(ndata)

            _min = np.nanmin(ndata)
            if _min == -np.inf:
                ndata[ndata == -np.inf] = 0
                _min = np.nanmin(ndata)

            self.min = float(_min *
                             (1 + self.lower_margin) if _min < 0 else _min *
                             (1 - self.lower_margin))

            _max = np.nanmax(ndata)
            self.max = float(_max *
                             (1 + self.upper_margin) if _max > 0 else _max *
                             (1 - self.upper_margin))

            self.sets = self.build(ndata)

            self.partitions = len(self.sets)

            if self.ordered_sets is None and self.setnames is not None:
                self.ordered_sets = self.setnames[:len(self.sets)]
            else:
                self.ordered_sets = FuzzySet.set_ordered(self.sets)

            del (ndata)
Example #14
0
    def __init__(self, **kwargs):
        """
        Universe of Discourse partitioner scheme. Split data on several fuzzy sets
        """
        self.name = kwargs.get('name',"")
        """partitioner name"""
        self.partitions = kwargs.get('npart', 10)
        """The number of universe of discourse partitions, i.e., the number of fuzzy sets that will be created"""
        self.sets = {}
        self.membership_function = kwargs.get('func', Membership.trimf)
        """Fuzzy membership function (pyFTS.common.Membership)"""
        self.setnames = kwargs.get('names', None)
        """list of partitions names. If None is given the partitions will be auto named with prefix"""
        self.prefix = kwargs.get('prefix', 'A')
        """prefix of auto generated partition names"""
        self.transformation = kwargs.get('transformation', None)
        """data transformation to be applied on data"""
        self.indexer = kwargs.get('indexer', None)
        self.variable = kwargs.get('variable', None)
        """In a multivariate context, the variable that contains this partitioner"""
        self.type = kwargs.get('type', 'common')
        """The type of fuzzy sets that are generated by this partitioner"""
        self.extractor = kwargs.get('extractor', lambda x: x)
        """Anonymous function used to extract a single primitive type from an object instance"""
        self.ordered_sets = None
        """A ordered list of the fuzzy sets names, sorted by their middle point"""
        self.kdtree = None
        """A spatial index to help in fuzzyfication"""

        if kwargs.get('preprocess',True):

            data = kwargs.get('data',[None])

            if self.indexer is not None:
                ndata = self.indexer.get_data(data)
            else:
                ndata = data

            if self.transformation is not None:
                ndata = self.transformation.apply(ndata)
            else:
                ndata = data

            if self.indexer is not None:
                ndata = self.indexer.get_data(ndata)

            _min = np.nanmin(ndata)
            if _min == -np.inf:
                ndata[ndata == -np.inf] = 0
                _min = np.nanmin(ndata)

            self.min = float(_min * 1.1 if _min < 0 else _min * 0.9)

            _max = np.nanmax(ndata)
            self.max = float(_max * 1.1 if _max > 0 else _max * 0.9)

            self.sets = self.build(ndata)

            if self.ordered_sets is None and self.setnames is not None:
                self.ordered_sets = self.setnames[:len(self.sets)]
            else:
                self.ordered_sets = FuzzySet.set_ordered(self.sets)

            del(ndata)