コード例 #1
0
    def setUp(self):
        self.SymbolTree = SymbolTree
        self.pset = SymbolSet()

        from sklearn.datasets import fetch_california_housing

        data = fetch_california_housing()
        x = data["data"][:100]
        y = data["target"][:100]

        self.x = x
        self.y = y
        # self.pset.add_features(x, y, )
        self.pset.add_features(x, y, x_group=[[1, 2], [4, 5]])
        self.pset.add_constants([6, 3, 4],
                                c_dim=[dless, dless, dless],
                                c_prob=None)
        self.pset.add_operations(power_categories=(2, 3, 0.5),
                                 categories=("Add", "Mul", "Neg", "Abs"),
                                 self_categories=None)

        from sklearn.metrics import r2_score, mean_squared_error

        self.cp = CalculatePrecisionSet(self.pset,
                                        scoring=[r2_score, mean_squared_error],
                                        score_pen=[1, -1],
                                        dim_type=None,
                                        filter_warning=True)
コード例 #2
0
    def setUp(self):
        self.SymbolTree = SymbolTree
        self.pset = SymbolSet()

        from sklearn.datasets import load_boston

        data = load_boston()
        x = data["data"]
        y = data["target"]
        # No = Normalizer()
        # y=y/max(y)
        # x = No.fit_transform(x)
        self.x = x
        self.y = y
        # self.pset.add_features(x, y, )
        self.pset.add_features(x, y, x_group=[[1, 2], [4, 5]])
        self.pset.add_constants([6, 3, 4],
                                c_dim=[dless, dless, dless],
                                c_prob=None)
        self.pset.add_operations(power_categories=(2, 3, 0.5),
                                 categories=("Add", "Mul", "Self", "Abs"),
                                 self_categories=None)

        from sklearn.metrics import r2_score, mean_squared_error
        self.cp = CalculatePrecisionSet(self.pset,
                                        scoring=[r2_score, mean_squared_error],
                                        score_pen=[1, -1],
                                        filter_warning=True)
コード例 #3
0
    #
    #     plt.show()

    X = q1[:, :-1]
    y = q1[:, -1]
    X = np.concatenate((X, (X[:, 1] / X[:, 0]**2).reshape(-1, 1)), axis=1)

    X_train, X_test, y_train, y_test = train_test_split(X,
                                                        y,
                                                        test_size=0.20,
                                                        random_state=0)

    store = Store()

    # symbolset
    pset0 = SymbolSet()
    pset0.add_features(X_train, y_train)
    pset0.add_constants(c=[
        1,
    ])

    pset0.add_operations(
        power_categories=(2, ),
        categories=("Add", "exp", "Neg"),
    )
    h_bgp = 3

    # stop = None
    # This random_state is under Linux system. For others system ,the random_state maybe different。
    # try with different random_state.
    stop = lambda ind: ind.fitness.values[0] >= 0.99
コード例 #4
0
import numpy as np
import sympy

from bgp.base import SymbolSet, SymbolTree
from bgp.calculation.translate import general_expr_dict, compile_context

if __name__ == "__main__":
    x = np.full((10, 4), fill_value=0.1)
    y = np.ones((10, ))

    height = 2
    hbgp = 1
    # bgp
    group = 2
    pset = SymbolSet()
    pset.add_features(
        x,
        y,
        x_group=group,
    )
    pset.add_accumulative_operation(categories=("MAdd", "MMul", "MSub", "MDiv",
                                                "Conv", "Self"),
                                    special_prob={
                                        "MAdd": 0.16,
                                        "MMul": 0.16,
                                        "MSub": 0.16,
                                        "MDiv": 0.16,
                                        "Conv": 0.16,
                                        "Self": 0.16
                                    })
コード例 #5
0
    def fit(self,
            X=None,
            y=None,
            c=None,
            x_group=None,
            x_dim=1,
            y_dim=1,
            c_dim=1,
            x_prob=None,
            c_prob=None,
            pset=None,
            power_categories=(2, 3, 0.5),
            categories=("Add", "Mul", "Sub", "Div"),
            warm_start=False,
            new_gen=None):
        """
        Method 1. fit with x, y.

        Examples::

            sl = SymbolLearning()
            sl..fit(x,y,...)

        Method 2. fit with customized pset. If need more self-definition, use one defined SymbolSet object to ``pset``.

        Examples::

            pset = SymbolSet()
            pset.add_features_and_constants(...)
            pset.add_operations(...)
            ...
            sl = SymbolLearning()
            sl..fit(pset=pset)

        Parameters
        ----------
        X:np.ndarray
            data.
        y:np.ndarray
            y.
        c:list of float, None
            constants.
        x_dim: 1 or list of Dim
            the same size wih x.shape[1], default 1 is dless for all x.
        y_dim: 1,Dim
            dim of y.
        c_dim: 1,list of Dim
            the same size wih c.shape, default 1 is dless for all c.

        x_prob: None,list of float
            the same size wih x.shape[1].
        c_prob: None,list of float
            the same size wih c.
        x_group:list of list
            Group of x.

            Examples:

                x_group=[[1,2],]
                or
                x_group=2

            See Also :py:func:`bgp.base.SymbolSet.add_features`

        power_categories: Sized,tuple, None
            Examples:(0.5,2,3)
        categories: tuple of str
            map table:
                    {"Add": sympy.Add, 'Sub': Sub, 'Mul': sympy.Mul, 'Div': Div}
                    {"sin": sympy.sin, 'cos': sympy.cos, 'exp': sympy.exp, 'ln': sympy.ln,
                    {'Abs': sympy.Abs, "Neg": functools.partial(sympy.Mul, -1.0),
                    "Rec": functools.partial(sympy.Pow, e=-1.0)}

                    Others:  \n
                    "Rem":  f(x)=1-x,if x true \n
                    "Self":  f(x)=x,if x true \n

        pset:SymbolSet
            See Also SymbolSet.
        warm_start: bool
            warm start or not.

            Note:
                If you offer pset in advance by user, please check carefully the feature numbers,especially when use ``re_Tree``.
                because the new features are add.
            Reference:
                CalculatePrecisionSet.update_with_X_y.
        new_gen: None,int
            warm_start generation.

        """

        # try to find pest form args,kwargs
        psets = [i for i in self.args if isinstance(i, SymbolSet)]
        if len(psets) > 0:
            self.args.remove(psets[0])
        if "pset" in self.kwargs:
            psets.append(self.kwargs["pset"])
            del self.kwargs["pset"]

        if pset is None:
            if len(psets) > 0:
                pset = psets[0]

        if pset is None:
            # one simple pset are generate with no dimension calculation, But just with x_group.\n

            if X is not None and y is not None:
                pset = SymbolSet()
                pset.add_features_and_constants(X,
                                                y,
                                                c,
                                                x_dim=x_dim,
                                                y_dim=y_dim,
                                                c_dim=c_dim,
                                                x_prob=x_prob,
                                                c_prob=c_prob,
                                                x_group=x_group,
                                                feature_name=None)
                pset.add_operations(power_categories=power_categories,
                                    categories=categories)

            elif hasattr(self.loop, "gen"):
                pass
            else:
                raise ValueError(
                    "The pset should be defined or the X and Y should be offered."
                )
        ####################################

        if warm_start:
            assert hasattr(
                self.loop,
                "gen"), "Before the warm_start, Need fit at least one time"
            if X is not None and y is not None:
                self.loop.cpset.update_with_X_y(X, y)
            elif pset:
                # the warm_start are not compacting with "re_Tree"
                self.loop.cpset.update(pset)
            else:
                raise ValueError(
                    "The pset should be defined or the X and Y should be offered."
                )

            self.loop.re_fresh_by_name()

            hall = self.loop.run(warm_start=True, new_gen=new_gen)
        else:
            if hasattr(self.loop, "gen"):
                loops = self.loop.__class__
                self.loop = loops(pset, *self.args, **self.kwargs)
            else:
                self.loop = self.loop(pset, *self.args, **self.kwargs)

            hall = self.loop.run()

        self.best_one = hall.items[0]
        try:
            expr = general_expr(self.best_one.coef_expr, self.loop.cpset)
            self.expr_type = "single"
        except (RecursionError, RuntimeWarning):
            expr = self.best_one.coef_expr
            self.expr_type = "group"

        self.expr = expr
        self.y_dim = self.best_one.y_dim
        self.fitness = self.best_one.fitness.values[0]