def get_symbolic_model(f, dim_x, n_points=100, x_range=[0, 1]): H = load_H() loss_tol = load_hyperparameters()['loss_tol'] faithful_models = [] losses = [] for k in range(len(H)): for l in range(len(H)): print("===================================================================================================") print("Testing Hyperparameter Configuration k = ", k + 1 , " ; l = ", l+1) faithful_model, loss = symbolic_modeling(f, dim_x, H['hyper_' + str(k + 1)][1], H['hyper_' + str(l + 1)][1], H['hyper_' + str(k + 1)][0], H['hyper_' + str(l + 1)][0], n_points=n_points, x_range=x_range) faithful_models.append(faithful_model) losses.append(loss) if losses[-1] <= loss_tol: print("==========The desired loss was achieved so the algorithm stopped==========") break best_model = np.argmin(np.array(losses)) X = np.random.uniform(x_range[0], x_range[1], dim_x * n_points) X = X.reshape((n_points, dim_x)) Y_true = f(X).reshape((-1, 1)) Y_est = faithful_models[best_model].evaluate(X).reshape((-1, 1)) R2_perf = compute_Rsquared(Y_true, Y_est) return faithful_models[best_model], R2_perf
def symbolic_regressor(f, npoints, xrange): X = np.linspace(xrange[0], xrange[1], npoints).reshape((-1, 1)) y = f(X) est_gp = SymbolicRegressor(population_size=5000, generations=20, stopping_criteria=0.01, p_crossover=0.7, p_subtree_mutation=0.1, p_hoist_mutation=0.05, p_point_mutation=0.1, max_samples=0.9, verbose=1, parsimony_coefficient=0.01, random_state=0) est_gp.fit(X, y) sym_expr = str(est_gp._program) converter = { 'sub': lambda x, y: x - y, 'div': lambda x, y: x / y, 'mul': lambda x, y: x * y, 'add': lambda x, y: x + y, 'neg': lambda x: -x, 'pow': lambda x, y: x ** y } x, X0 = symbols('x X0') sym_reg = simplify(sympify(sym_expr, locals=converter)) sym_reg = sym_reg.subs(X0, x) Y_true = y.reshape((-1, 1)) Y_est = np.array([sympify(str(sym_reg)).subs(x, X[k]) for k in range(len(X))]).reshape((-1, 1)) R2_perf = compute_Rsquared(Y_true, Y_est) return sym_reg, R2_perf
def get_symbolic_model(f, npoints, xrange): hyperparameter_space = load_hyperparameter_config() loss_threshold = 10e-5 symbol_exprs = [] losses_ = [] for k in range(len(hyperparameter_space)): symbolic_model, Loss_ = symbolic_modeling( f, hyperparameter_space['hyper_' + str(k + 1)][1], hyperparameter_space['hyper_' + str(k + 1)][0], npoints, xrange) symbol_exprs.append(symbolic_model) losses_.append(Loss_) if losses_[-1] <= loss_threshold: break best_model = np.argmin(np.array(losses_)) X = np.linspace(xrange[0], xrange[1], npoints).reshape((-1, 1)) Y_true = f(X).reshape((-1, 1)) Y_est = symbol_exprs[best_model].evaluate(X).reshape((-1, 1)) R2_perf = compute_Rsquared(Y_true, Y_est) return symbol_exprs[best_model], R2_perf