{ "cells": [ { "cell_type": "markdown", "id": "title", "metadata": {}, "source": [ "
\n", "\n", "# `BayeSym𝕏`: End-to-End Examples\n", "\n", "
" ] }, { "cell_type": "markdown", "id": "7c6a599f", "metadata": {}, "source": [ "## A toy example\n", "\n", "- $y = 1.25 + 2.5 \\exp(x_0^3) - 0.8 x_1^2 \\sin(x_0) + \\varepsilon$, where $\\varepsilon$ is Gaussian noise with standard deviation $\\sigma = 0.25$.\n", "\n", "- $(n, p) = (2000, 2)$." ] }, { "cell_type": "code", "execution_count": 1, "id": "baa3c0c7", "metadata": {}, "outputs": [], "source": [ "# import everything from BayeSymX\n", "\n", "from BayeSymX import *" ] }, { "cell_type": "markdown", "id": "e0437fdb", "metadata": {}, "source": [ "### Simulated data generation and train-test split" ] }, { "cell_type": "code", "execution_count": 4, "id": "b94b6371", "metadata": {}, "outputs": [], "source": [ "rng = np.random.default_rng(2026)\n", "\n", "# Generate 2000 observations with two features.\n", "X = rng.uniform(-2.0, 2.0, size=(2000, 2))\n", "\n", "# Ground-truth relationship:\n", "y = (\n", " 1.25\n", " + 2.5 * np.exp(X[:, 0] ** 3)\n", " - 0.8 * (X[:, 1] ** 2) * np.sin(X[:, 0])\n", " + rng.normal(0.0, 0.25, size=X.shape[0])\n", ")\n", "\n", "# Reproducible 90%/10% train-test split.\n", "indices = rng.permutation(X.shape[0])\n", "train_indices = indices[:1800]\n", "test_indices = indices[1800:]\n", "\n", "X_train = X[train_indices]\n", "y_train = y[train_indices]\n", "X_test = X[test_indices]\n", "y_test = y[test_indices]" ] }, { "cell_type": "markdown", "id": "6e4648ae", "metadata": {}, "source": [ "### Run `BayeSym𝕏`" ] }, { "cell_type": "code", "execution_count": null, "id": "0410f03e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "╭──────────────────────────────────────────────────────────────────────╮\n", "│ Running BayeSym𝕏 │\n", "├──────────────────────────────────────────────────────────────────────┤\n", "│ Parallel MCMC chains : 5 │\n", "│ MCMC iterations : 2,000 per chain │\n", "│ Trees per forest : 3 │\n", "│ Operator set : [add, neg, mul, inv, sin, cos, exp, sq, cu] │\n", "╰──────────────────────────────────────────────────────────────────────╯\n", "\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2dbb3e92a5ff42cbb11c61b7fd931580", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Chain 1 | seed=101: 0%| | 0/2000 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "╔════════════════════════════════════════════════════════════════════════════════════════════════════╗\n", "║ BayeSym𝕏 ║\n", "║ Summary of Results ║\n", "╚════════════════════════════════════════════════════════════════════════════════════════════════════╝\n", "\n", "Run overview\n", " • Ranked models : 10 returned (10 requested)\n", " • Ranking statistic : log_JMP\n", " • Reduction method : BIC and SymPy\n", " ✓ Evaluation : training and held-out test metrics\n", "\n", " Raw symbolic models ───────────────────────────────────────────────────────────────────────────────\n", " \n", " Rank Raw expression Train RMSE Train MAE Train R^2 Test RMSE Test MAE Test R^2 JMP\n", " 1 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", " 2 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", " 3 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", " 4 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", " 5 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", " 6 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", " 7 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", " 8 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", " 9 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", " 10 1.26 + 1.25*(exp((x0)^3)) - 0.7965*((sin(x0) * (x1)^2)) + 1.25*(exp((x0)^3)) 0.2487 0.1982 1 0.264 0.2153 1 1526\n", "\n", " Final symbolic models ─────────────────────────────────────────────────────────────────────────────\n", " \n", " Rank Final expression Train RMSE Train MAE Train R^2 Test RMSE Test MAE Test R^2 Effective K Model size\n", " 1 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", " 2 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", " 3 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", " 4 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", " 5 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", " 6 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", " 7 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", " 8 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", " 9 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", " 10 -0.7965*x1**2*sin(x0) + 2.5*exp(x0**3) + 1.26 0.2487 0.1982 1 0.264 0.2153 1 2 15\n", "\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "✓ BayeSym𝕏 analysis complete\n", " Parallel-chain runtime: 20.47 seconds\n", " JMP values are reported on the log scale.\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], "source": [ "result_json = run_bayesymx(\n", " X_train = X_train, # train X\n", " y_train = y_train, # train y\n", " K = 3, # symbolic forest size\n", " maxdepth = 3, # max. depth of symbolic trees\n", " seeds = [101, 202, 303, 404, 505], # 5 parallel MCMC chains\n", " prior_params=None, # default prior parameters\n", " add_intercept=True, # add intercept term\n", " wts_init=None, # default weights initialization\n", " wts_prop=None, # default weights proposal distribution\n", " opset=[add, neg, mul, inv, sin, cos, exp, sq, cu], # 9 operators\n", " ftset=[\"x0\", \"x1\"], # 2 features\n", " move_weights=[1, 1, 1, 1, 1, 1, 1], # all moves with equal probability\n", " maxiter=2000, # MCMC iterations per chain\n", " burnin=0, # default; no burn-in \n", " thin=1, # default; no thinning\n", " n_jobs=5, # number of parallel jobs (chains) \n", " show_progress=True, # show progress bar\n", " report_every=10, # report progress every 10 iterations\n", " r=10, # no. of top-ranked JMP symbolic models\n", " X_test=X_test, # test X\n", " y_test=y_test, # test y\n", " force_intercept=False, # force intercept term in final symbolic models \n", " blr_prior=None, # default prior for re-estimation of coefficients \n", " prior_variance=10.0, # default prior variance for re-estimation of coefficients\n", " rcond=None, # default cutoff for least-squares and pseudoinverse computations\n", " significant_digits=4, # significant digits for rounding coefficients in final expressions \n", " print_results=True, # print results to console \n", " show_trace_plot=True, # show trace plot of log(JMP) for all chains\n", " save_trace_plot=False, # save trace plot of log(JMP) for all chains \n", " trace_plot_path=None, # path to save trace plot of log(JMP) for all chains \n", " trace_plot_dpi=300, # dpi for trace plot of log(JMP) for all chains \n", ")" ] }, { "cell_type": "markdown", "id": "15a835fa", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "b8ce5bc7", "metadata": {}, "source": [ "## Learning Feynman equation\n", "\n", "I_50_26 (HOQN): $x = x_1[\\cos(\\omega t) + \\alpha \\cos^{2}(\\omega t)]$ represents the harmonic oscillation with a quadratic nonlinear correction. The features ($p=4$) denote:\n", "\n", "- $x_1$: amplitide/initial displacement scale; \n", "- $\\omega$: angular frequency; \n", "- $t$: time; and\n", "- $\\alpha$: nonlinear correction parameter. \n", "\n", "The target is $x$: position/displacement.\n", "\n", "![Feynman I_50_26](assets/feynman_hoqn_physical_tree.png)" ] }, { "cell_type": "markdown", "id": "46846bab", "metadata": {}, "source": [ "### Loading Feynman I_50_26 data\n", "\n", "Load the data from `feynman_data/feynman_I_50_26.tsv`. The noiseless original target has been used below." ] }, { "cell_type": "code", "execution_count": 8, "id": "6b7b70ea", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded feynman_I_50_26.tsv: 100,000 observations, 4 features.\n", "Features: x1, omega, t, alpha\n", "Using a reproducible sample of 2,000 observations.\n", "Training observations: 1,800\n", "Test observations: 200\n" ] } ], "source": [ "# subsample 2000 observations from the Feynman dataset and split into 90% train and 10% test.\n", "\n", "random_seed = 2026\n", "sample_size = 2000 \n", "test_fraction = 0.10\n", "\n", "data_path = Path(\"feynman_data/feynman_I_50_26.tsv\")\n", "\n", "data = pd.read_csv(data_path, sep=\"\\t\")\n", "\n", "target_column = \"target\"\n", "\n", "if target_column not in data.columns:\n", " raise ValueError(\n", " f\"The dataset must contain a \"\n", " f\"{target_column!r} column.\"\n", " )\n", "\n", "feature_columns = [\n", " column\n", " for column in data.columns\n", " if column != target_column\n", "]\n", "\n", "if not feature_columns:\n", " raise ValueError(\n", " \"No feature columns were found.\"\n", " )\n", "\n", "print(\n", " f\"Loaded {data_path.name}: \"\n", " f\"{len(data):,} observations, \"\n", " f\"{len(feature_columns)} features.\"\n", ")\n", "\n", "print(\"Features: \" + \", \".join(feature_columns))\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Optional reproducible subsampling\n", "# ---------------------------------------------------------\n", "\n", "rng = np.random.default_rng(random_seed)\n", "\n", "if sample_size is not None:\n", " if not isinstance(sample_size, int) or sample_size <= 0:\n", " raise ValueError(\n", " \"sample_size must be a positive integer \"\n", " \"or None.\"\n", " )\n", "\n", " if sample_size > len(data):\n", " raise ValueError(\n", " f\"sample_size={sample_size:,} exceeds the \"\n", " f\"{len(data):,} available observations.\"\n", " )\n", "\n", " sampled_indices = rng.choice(\n", " len(data),\n", " size=sample_size,\n", " replace=False,\n", " )\n", "\n", " data = (\n", " data.iloc[sampled_indices]\n", " .reset_index(drop=True)\n", " )\n", "\n", " print(\n", " f\"Using a reproducible sample of \"\n", " f\"{len(data):,} observations.\"\n", " )\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Construct X and y\n", "# ---------------------------------------------------------\n", "\n", "X = data[feature_columns].to_numpy(dtype=float)\n", "\n", "y = data[target_column].to_numpy(dtype=float)\n", "\n", "if not np.all(np.isfinite(X)):\n", " raise ValueError(\"The feature matrix contains non-finite values.\")\n", "\n", "if not np.all(np.isfinite(y)):\n", " raise ValueError(\"The target vector contains non-finite values.\")\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Reproducible train-test split\n", "# ---------------------------------------------------------\n", "\n", "if not 0.0 < test_fraction < 1.0:\n", " raise ValueError(\n", " \"test_fraction must be between 0 and 1.\"\n", " )\n", "\n", "indices = rng.permutation(X.shape[0])\n", "\n", "n_test = max(\n", " 1,\n", " int(round(test_fraction * X.shape[0])),\n", ")\n", "\n", "test_indices = indices[:n_test]\n", "train_indices = indices[n_test:]\n", "\n", "X_train = X[train_indices]\n", "y_train = y[train_indices]\n", "\n", "X_test = X[test_indices]\n", "y_test = y[test_indices]\n", "\n", "print(\n", " f\"Training observations: {len(y_train):,}\"\n", ")\n", "\n", "print(\n", " f\"Test observations: {len(y_test):,}\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "38300a3d", "metadata": {}, "outputs": [], "source": [ "# import everything from BayeSymX\n", "\n", "from BayeSymX import *" ] }, { "cell_type": "markdown", "id": "3085faa4", "metadata": {}, "source": [ "### Run `BayeSym𝕏`" ] }, { "cell_type": "code", "execution_count": 9, "id": "f7b822c1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "╭──────────────────────────────────────────────────────────────────────╮\n", "│ Running BayeSym𝕏 │\n", "├──────────────────────────────────────────────────────────────────────┤\n", "│ Parallel MCMC chains : 10 │\n", "│ MCMC iterations : 2,000 per chain │\n", "│ Trees per forest : 3 │\n", "│ Operator set : [add, mul, inv, neg, sin, cos, exp, cu, sq] │\n", "╰──────────────────────────────────────────────────────────────────────╯\n", "\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ec8d9a407ab44107bbcc75a40f8196bc", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Chain 1 | seed=101: 0%| | 0/2000 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "╔════════════════════════════════════════════════════════════════════════════════════════════════════╗\n", "║ BayeSym𝕏 ║\n", "║ Summary of Results ║\n", "╚════════════════════════════════════════════════════════════════════════════════════════════════════╝\n", "\n", "Run overview\n", " • Ranked models : 10 returned (10 requested)\n", " • Ranking statistic : log_JMP\n", " • Reduction method : BIC and SymPy\n", " ✓ Evaluation : training and held-out test metrics\n", "\n", " Raw symbolic models ───────────────────────────────────────────────────────────────────────────────\n", " \n", " Rank Raw expression Train RMSE Train MAE Train R^2 Test RMSE Test MAE Test R^2 JMP\n", " 1 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", " 2 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", " 3 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", " 4 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", " 5 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", " 6 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", " 7 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", " 8 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", " 9 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", " 10 7.74e-06 + 0.5*((cos((t * omega)) * (x1 + x1))) + 0.25*((cos(((omega + omega) * t)) * ((alpha + alpha) * x1))) + 0.25*((x1 * (alpha + alpha))) 1.18e-05 8.82e-06 1 1.22e-05 9.03e-06 1 7.92e+03\n", "\n", " Final symbolic models ─────────────────────────────────────────────────────────────────────────────\n", " \n", " Rank Final expression Train RMSE Train MAE Train R^2 Test RMSE Test MAE Test R^2 Effective K Model size\n", " 1 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", " 2 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", " 3 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", " 4 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", " 5 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", " 6 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", " 7 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", " 8 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", " 9 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", " 10 1.0*x1*(0.5*alpha*cos(2*omega*t) + 0.5*alpha + 1.0*cos(omega*t)) 1.15e-05 8.34e-06 1 1.17e-05 8.42e-06 1 3 21\n", "\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "✓ BayeSym𝕏 analysis complete\n", " Parallel-chain runtime: 51.2 seconds\n", " JMP values are reported on the log scale.\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], "source": [ "result_json = run_bayesymx(\n", " X_train=X_train,\n", " y_train=y_train,\n", " X_test=X_test,\n", " y_test=y_test,\n", "\n", " K=3,\n", " maxdepth=5,\n", "\n", " seeds=[\n", " 101,\n", " 202,\n", " 303,\n", " 404,\n", " 505,\n", " 606,\n", " 707,\n", " 808,\n", " 909,\n", " 1010\n", " ],\n", "\n", " maxiter=2000,\n", " burnin=0,\n", " thin=1,\n", "\n", " # Use the original Feynman variable names in the\n", " # resulting symbolic expressions.\n", " ftset=feature_columns,\n", "\n", " significant_digits=3,\n", " print_results=True,\n", " \n", " # Trace plots\n", " show_trace_plot=True,\n", " save_trace_plot=False,\n", " report_every=20,\n", " n_jobs=10,\n", " opset=[add, mul, inv, neg, sin, cos, exp, cu, sq]\n", ")" ] }, { "cell_type": "markdown", "id": "add1dad1", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "b385626c", "metadata": {}, "source": [ "## Descriptor discovery for oxide perovskites catalysts" ] }, { "cell_type": "markdown", "id": "fe7ab637", "metadata": {}, "source": [ "The dataset is based on the oxide perovskite catalyst OER study of Weng et al. (2020) [https://doi.org/10.1038/s41467-020-17263-9], where the response variable is the OER potential $V_{\\mathrm{RHE}}$ measured for perovskite catalysts of the form $ABO_{3}$. The original study synthesized $18$ known perovskites, prepared $4$ samples per material, repeated the OER measurement $3$ times per sample, and recorded $V_{\\mathrm{RHE}}$ at $5$ current densities, yielding $n = 18\\times 4\\times 3\\times 5 = 1080$ observations.\n", "\n", "The features were chemically motivated descriptors including $R_A$ [weighted averaged ionic radii of cation A; note that for oxide pervskites $(A_x^1 A_{1-x}^2)(B_y^1 B_{1-y}^2)O_3$, the weighted averaged ionic radii of cation $A$ is $R_A = x\\cdot R_{A^1} + (1-x)\\cdot R_{A^{2}}$], $Q_A$ [weighted averaged charged state of cation A], $N_d$ [weighted averaged number of $d$ electrons of cation A], $\\chi_A$ [weighted averaged atomic radii of A], $\\chi_B$ [weighted averaged atomic radii of B], the tolerance factor $t = \\tfrac{R_A + R_O}{\\sqrt{2}(R_B + R_O)}$ [$R_B$ is the weighted averaged ionic radii of cation $B$ and $R_O$ is the ionic radii of anion $O^{2-}$] and the octahedral factor $\\mu = \\frac{R_B}{R_O}$. We also include the $5$ current densities, i.e., $50\\mu \\mathrm{A}/\\mathrm{cm}^2$, $5 \\mathrm{mA}/\\mathrm{cm}^{2}$, $10 \\mathrm{mA}/\\mathrm{cm}^{2}$, $15 \\mathrm{mA}/\\mathrm{cm}^{2}$, and $20 \\mathrm{mA}/\\mathrm{cm}^{2}$, in the feature set to model $V_{\\mathrm{RHE}}$, i.e., $(n, p) = (1080, 8)$.\n", "\n", "The figure below illustrates the landscape of all $V_{\\mathrm{RHE}}$ data produced by experiments.\n", "\n", "

\n", "\"VRHE\n", "

\n" ] }, { "cell_type": "markdown", "id": "39633f5e", "metadata": {}, "source": [ "### Ablation study as a practical diagnostic to choose $K$\n", "\n", "We consider the $K$ grid values `K_GRID = [6, 7, 8, 10, 12]`. For a particular 90/10 train-test split of the oxide perovskite catalyst dataset, the test RMSE and MAE (corresponding to the top-ranked JMP descriptor expression) along with the parallel-chain compute runtime of `BayeSym𝕏` are recorded across the $K$ values. This serves as a practical guideline in choosing the nominal symbolic forest size $K$." ] }, { "cell_type": "markdown", "id": "b0069c1c", "metadata": {}, "source": [ "#### 90/10 train-test split of the dataset" ] }, { "cell_type": "code", "execution_count": 13, "id": "70bf37b6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total observations: 1,080\n", "Training observations: 972\n", "Test observations: 108\n" ] } ], "source": [ "from BayeSymX import *\n", "\n", "# ---------------------------------------------------------\n", "# Data configuration\n", "# ---------------------------------------------------------\n", "\n", "data_path = Path(\n", " \"perovskites_data/processed_data.csv\"\n", ")\n", "\n", "target_column = \"VRHE\"\n", "\n", "feature_columns = [\n", " \"current_Density\",\n", " \"RA\",\n", " \"RB\",\n", " \"t\",\n", " \"mu\",\n", " \"XA\",\n", " \"XB\",\n", " \"QA\",\n", " \"Nd\",\n", "]\n", "\n", "random_seed = 2026\n", "train_fraction = 0.90\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Load the data\n", "# ---------------------------------------------------------\n", "\n", "data = pd.read_csv(data_path)\n", "\n", "data = data.rename(\n", " columns={\n", " \"current_density\": \"current_Density\",\n", " }\n", ")\n", "\n", "X = data[\n", " feature_columns\n", "].to_numpy(dtype=float)\n", "\n", "y = data[\n", " target_column\n", "].to_numpy(dtype=float)\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Fixed random 90%/10% train-test split\n", "#\n", "# This exact split is reused for every K.\n", "# ---------------------------------------------------------\n", "\n", "rng = np.random.default_rng(\n", " random_seed\n", ")\n", "\n", "indices = rng.permutation(\n", " len(data)\n", ")\n", "\n", "n_train = int(\n", " train_fraction * len(data)\n", ")\n", "\n", "train_indices = indices[:n_train]\n", "test_indices = indices[n_train:]\n", "\n", "X_train = X[train_indices]\n", "y_train = y[train_indices]\n", "\n", "X_test = X[test_indices]\n", "y_test = y[test_indices]\n", "\n", "print(f\"Total observations: {len(data):,}\")\n", "print(f\"Training observations: {len(y_train):,}\")\n", "print(f\"Test observations: {len(y_test):,}\")" ] }, { "cell_type": "markdown", "id": "edaef1b7", "metadata": {}, "source": [ "#### Ablation configuration" ] }, { "cell_type": "code", "execution_count": 14, "id": "dd9bbedd", "metadata": {}, "outputs": [], "source": [ "# ---------------------------------------------------------\n", "# K ablation grid\n", "# ---------------------------------------------------------\n", "\n", "K_GRID = [\n", " 6,\n", " 7,\n", " 8,\n", " 10,\n", " 12,\n", "]\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Fixed BayeSymX settings\n", "# ---------------------------------------------------------\n", "\n", "MAXDEPTH = 6\n", "MAXITER = 2_000\n", "TOP_R = 10\n", "\n", "CHAIN_SEEDS = [\n", " 123,\n", " 124,\n", " 125,\n", " 126,\n", " 127,\n", "]\n", "\n", "OPERATOR_SET = [\n", " add,\n", " mul,\n", " neg,\n", " inv,\n", " sqrt_op,\n", "]\n", "\n", "MOVE_WEIGHTS = {\n", " \"grow\": 1.0,\n", " \"prune\": 1.0,\n", " \"change_feature\": 1.0,\n", " \"change_operator\": 1.0,\n", " \"subtree_replace\": 1.0,\n", " \"delete_node\": 1.0,\n", " \"insert_node\": 1.0,\n", "}" ] }, { "cell_type": "markdown", "id": "c108aff4", "metadata": {}, "source": [ "#### Run the $K$ ablation study for `BayeSym𝕏`" ] }, { "cell_type": "code", "execution_count": 17, "id": "9bd41cd5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "========================================================================\n", "Running BayeSym𝕏 with K=6\n", "========================================================================\n", "K=6: raw test RMSE=0.0863514, final test RMSE=0.0862059, runtime=46.37 s\n", "\n", "========================================================================\n", "Running BayeSym𝕏 with K=7\n", "========================================================================\n", "K=7: raw test RMSE=0.0857238, final test RMSE=0.0858361, runtime=56.21 s\n", "\n", "========================================================================\n", "Running BayeSym𝕏 with K=8\n", "========================================================================\n", "K=8: raw test RMSE=0.0861459, final test RMSE=0.0860327, runtime=69.21 s\n", "\n", "========================================================================\n", "Running BayeSym𝕏 with K=10\n", "========================================================================\n", "K=10: raw test RMSE=0.0833682, final test RMSE=0.0837535, runtime=84.66 s\n", "\n", "========================================================================\n", "Running BayeSym𝕏 with K=12\n", "========================================================================\n", "K=12: raw test RMSE=0.0846055, final test RMSE=0.0844784, runtime=112.75 s\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Klog_JMPraw_expressionfinal_expressionraw_test_RMSEfinal_test_RMSEraw_test_MAEfinal_test_MAEparallel_runtime_secondssource_chain_seedsource_iteration
061670.7270760.737806 + 0.219244*(((1/(XB)) * current_Density)) - 0.290623*((-RB)) + 0.592908*((1/(t))) - 0.2...0.859672*(0.031522*Nd*XB*current_Density*t - 0.129812*XB*current_Density*t*Abs(Nd)**0.5 + 1.0*XB...0.0863510.0862060.0596680.05960446.365378123820
171655.2753080.42618 + 0.291023*(((1/(XB)) * current_Density)) - 0.380016*((-XA)) + 0.40597*(sqrt(abs(XA))) -...1.07427*(0.00475908*Nd*XB*current_Density - 0.0355997*XA*XB*current_Density + 0.496809*XA*XB - 0...0.0857240.0858360.0599890.05999656.209531124582
281641.1462950.484962 + 0.0136505*((current_Density * Nd)) + 0.445553*((1/(t))) + 0.445553*((1/(t))) + 0.2646...0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t ...0.0861460.0860330.0585990.05858269.2093431271592
3101607.3974900.360838 - 0.112702*(sqrt(abs((QA * current_Density)))) + 0.485804*(((1/(XB)) * current_Density)...1.9229*(0.00269433*Nd**2*XB*current_Density + 0.205407*Nd*XB**2*Abs(current_Density)**0.5 - 0.15...0.0833680.0837540.0570210.05764884.663174125321
4121577.7385640.262302 + 0.397544*((1/(Nd))) + 0.107833*((1/(current_Density))) + 0.397544*((1/(Nd))) + 0.2531...0.925135*(0.00621517*Nd**2*RB*XB*current_Density**2*t + 0.535218*Nd*RB*XB**2*current_Density*t -...0.0846060.0844780.0578600.057610112.748693125616
\n", "
" ], "text/plain": [ " K log_JMP \\\n", "0 6 1670.727076 \n", "1 7 1655.275308 \n", "2 8 1641.146295 \n", "3 10 1607.397490 \n", "4 12 1577.738564 \n", "\n", " raw_expression \\\n", "0 0.737806 + 0.219244*(((1/(XB)) * current_Density)) - 0.290623*((-RB)) + 0.592908*((1/(t))) - 0.2... \n", "1 0.42618 + 0.291023*(((1/(XB)) * current_Density)) - 0.380016*((-XA)) + 0.40597*(sqrt(abs(XA))) -... \n", "2 0.484962 + 0.0136505*((current_Density * Nd)) + 0.445553*((1/(t))) + 0.445553*((1/(t))) + 0.2646... \n", "3 0.360838 - 0.112702*(sqrt(abs((QA * current_Density)))) + 0.485804*(((1/(XB)) * current_Density)... \n", "4 0.262302 + 0.397544*((1/(Nd))) + 0.107833*((1/(current_Density))) + 0.397544*((1/(Nd))) + 0.2531... \n", "\n", " final_expression \\\n", "0 0.859672*(0.031522*Nd*XB*current_Density*t - 0.129812*XB*current_Density*t*Abs(Nd)**0.5 + 1.0*XB... \n", "1 1.07427*(0.00475908*Nd*XB*current_Density - 0.0355997*XA*XB*current_Density + 0.496809*XA*XB - 0... \n", "2 0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t ... \n", "3 1.9229*(0.00269433*Nd**2*XB*current_Density + 0.205407*Nd*XB**2*Abs(current_Density)**0.5 - 0.15... \n", "4 0.925135*(0.00621517*Nd**2*RB*XB*current_Density**2*t + 0.535218*Nd*RB*XB**2*current_Density*t -... \n", "\n", " raw_test_RMSE final_test_RMSE raw_test_MAE final_test_MAE \\\n", "0 0.086351 0.086206 0.059668 0.059604 \n", "1 0.085724 0.085836 0.059989 0.059996 \n", "2 0.086146 0.086033 0.058599 0.058582 \n", "3 0.083368 0.083754 0.057021 0.057648 \n", "4 0.084606 0.084478 0.057860 0.057610 \n", "\n", " parallel_runtime_seconds source_chain_seed source_iteration \n", "0 46.365378 123 820 \n", "1 56.209531 124 582 \n", "2 69.209343 127 1592 \n", "3 84.663174 125 321 \n", "4 112.748693 125 616 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ablation_rows = []\n", "ablation_results_by_k = {}\n", "\n", "number_of_operators = len(\n", " OPERATOR_SET\n", ")\n", "\n", "number_of_features = len(\n", " feature_columns\n", ")\n", "\n", "\n", "for K in K_GRID:\n", " print()\n", " print(\"=\" * 72)\n", " print(f\"Running BayeSym𝕏 with K={K}\")\n", " print(\"=\" * 72)\n", "\n", " # K tree coefficients plus one intercept.\n", " number_of_coefficients = K + 1\n", "\n", " prior_params = (\n", " # Operator Dirichlet concentrations\n", " np.ones(\n", " number_of_operators,\n", " dtype=float,\n", " ),\n", "\n", " # Feature Dirichlet concentrations\n", " np.ones(\n", " number_of_features,\n", " dtype=float,\n", " ),\n", "\n", " # Tree split-probability parameter\n", " 0.95,\n", "\n", " # Tree depth penalty\n", " 2.00,\n", "\n", " # Regression coefficient prior mean\n", " np.zeros(\n", " number_of_coefficients,\n", " dtype=float,\n", " ),\n", "\n", " # Regression coefficient prior covariance\n", " 10.0 * np.eye(\n", " number_of_coefficients,\n", " dtype=float,\n", " ),\n", "\n", " # Inverse-gamma parameters\n", " 0.05,\n", " 0.05,\n", " )\n", "\n", " wts_init = [\n", " np.ones(\n", " number_of_operators,\n", " dtype=float,\n", " ),\n", " np.ones(\n", " number_of_features,\n", " dtype=float,\n", " ),\n", " ]\n", "\n", " wts_prop = [\n", " np.ones(\n", " number_of_operators,\n", " dtype=float,\n", " ),\n", " np.ones(\n", " number_of_features,\n", " dtype=float,\n", " ),\n", " ]\n", "\n", " result_json = run_bayesymx(\n", " # Fixed training and test data\n", " X_train=X_train,\n", " y_train=y_train,\n", " X_test=X_test,\n", " y_test=y_test,\n", "\n", " # Forest configuration\n", " K=K,\n", " maxdepth=MAXDEPTH,\n", " seeds=CHAIN_SEEDS,\n", "\n", " # Priors\n", " prior_params=prior_params,\n", " add_intercept=True,\n", "\n", " # Initial and proposal weights\n", " wts_init=wts_init,\n", " wts_prop=wts_prop,\n", "\n", " # Search space\n", " opset=OPERATOR_SET,\n", " ftset=feature_columns,\n", "\n", " # Tree moves\n", " move_weights=MOVE_WEIGHTS,\n", "\n", " # MCMC settings\n", " maxiter=MAXITER,\n", " burnin=0,\n", " thin=1,\n", " n_jobs=len(CHAIN_SEEDS),\n", " show_progress=False,\n", " report_every=20,\n", "\n", " # Ranked forests\n", " r=TOP_R,\n", "\n", " # BIC reduction\n", " force_intercept=False,\n", " prior_variance=10.0,\n", "\n", " # Output\n", " significant_digits=6,\n", " print_results=False,\n", "\n", " # Disable individual trace plots during ablation\n", " show_trace_plot=False,\n", " save_trace_plot=False,\n", " )\n", "\n", " results = json.loads(\n", " result_json\n", " )\n", "\n", " ablation_results_by_k[K] = results\n", "\n", " # The first entry is the top log-JMP-ranked forest.\n", " top_ranked_model = results[\n", " \"models\"\n", " ][0]\n", "\n", " raw_model = top_ranked_model[\n", " \"raw_model\"\n", " ]\n", "\n", " final_model = top_ranked_model[\n", " \"final_model\"\n", " ]\n", "\n", " raw_test_metrics = raw_model[\n", " \"test_metrics\"\n", " ]\n", "\n", " final_test_metrics = final_model[\n", " \"test_metrics\"\n", " ]\n", "\n", " ablation_rows.append({\n", " \"K\": K,\n", " \"log_JMP\": raw_model[\"log_JMP\"],\n", " \"raw_expression\": raw_model[\n", " \"expression\"\n", " ],\n", " \"final_expression\": final_model[\n", " \"expression\"\n", " ],\n", " \"raw_test_RMSE\": raw_test_metrics[\n", " \"RMSE\"\n", " ],\n", " \"final_test_RMSE\": final_test_metrics[\n", " \"RMSE\"\n", " ],\n", " \"raw_test_MAE\": raw_test_metrics[\n", " \"MAE\"\n", " ],\n", " \"final_test_MAE\": final_test_metrics[\n", " \"MAE\"\n", " ],\n", " \"parallel_runtime_seconds\": results[\n", " \"parallel_chains_runtime_seconds\"\n", " ],\n", " \"source_chain_seed\": top_ranked_model[\n", " \"source\"\n", " ][\"chain_seed\"],\n", " \"source_iteration\": top_ranked_model[\n", " \"source\"\n", " ][\"iteration\"],\n", " })\n", "\n", " print(\n", " f\"K={K}: \"\n", " f\"raw test RMSE={raw_test_metrics['RMSE']:.6g}, \"\n", " f\"final test RMSE={final_test_metrics['RMSE']:.6g}, \"\n", " f\"runtime={results['parallel_chains_runtime_seconds']:.2f} s\"\n", " )\n", "\n", "\n", "ablation_table = pd.DataFrame(\n", " ablation_rows\n", ").sort_values(\n", " \"K\"\n", ").reset_index(\n", " drop=True\n", ")\n", "\n", "pd.set_option(\n", " \"display.max_colwidth\",\n", " 100,\n", ")\n", "\n", "display(ablation_table)" ] }, { "cell_type": "markdown", "id": "a681cc39", "metadata": {}, "source": [ "#### Plot the ablation results: test RMSE, test MAE, and parallel-chain runtime " ] }, { "cell_type": "code", "execution_count": 25, "id": "bb8236aa", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABksAAAHrCAYAAABvkKrzAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XVYVEsfB/Dv0iENUlJ292t3YVyv3d3tVexuvffa3d3dqJgYKAqI1y5QFEGaJRdY9v0DObIsDYrC9/M8PHpm58yZc5bdM8zvzIxIJpPJQEREREREREREREREVEgp5XcFiIiIiIiIiIiIiIiI8hODJUREREREREREREREVKgxWEJERERERERERERERIUagyVERERERERERERERFSoMVhCRERERERERERERESFGoMlRERERERERERERERUqDFYQkREREREREREREREhRqDJUREREREREREREREVKgxWEJERERERERERERERIWaSn5XgIiIKLc++X5Bw5ad03xNXV0dhgZ6KFWyOFq3aIKuHdtBTU31J9cw73z6/AU79x7GvQdu8P3ij4SEBOjp6cLQQB8l7GxQvmwptGreGKVLFc/vqipITExEzwGj8dDdU0jT1dXBlTMHYW5WVCG/JC4OHboPQulSJbBu+cJsHcv3iz9Wb9iOew8eISgoBPEJCQCALh3bYuXSubk6D/ru+OkLmDJrsbB9eM9G1K1VIx9rlHd6DBgF10ePAQCWFma4d+3MT9k3tybNXIiTZxyF7Q8vHvy0Yxcm+fke/wpyc/71W3SE7xd/AEDt/1XD0b2bf0QVKQ+lbmf9NXoIJo4dlul+9x+6o9fAMcL28iWz0a3THz+kjnnNtnwd4f9sOxARERUeHFlCREQFmkQigZ9/AG7ffYCZ8/9GjwGjECuR5He1cuSOiyvsO/TBnoPH8fa9N6JjYhAXH4/AoGC8fvsejk43sGLdVly8cj2/q5omJSUlrFw2F9paWujcoS2uXTiCWjWqYvLMhZDJZAr5V6zZgrBwMRbNnpyt48TGxqLHgFE4ceYi/PwDhEBJQfXJ9wtsy9cRflZv2J7fVaIf4P5Dd7n3+fjpC/ldpQLp+OkLctf5/kP3/K4SUYHVY8Ao4bNWv0XH/K7OD7d6w3a575dPvl/yu0o5Vr9FR+E8egwYld/VISIiyjMcWUJERAWOoYE+av+v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PyXNVT514miMHtY/n2tFRET0Y9mW/z5ipUvHtli5NGtTFBIRERFR4cGRJURERDl06859vHrzDm/fe+PU2e9PIA7u1yMfa5W2w8fPICQkDHcfPBICJdpaWujR5edPwUVERERERERE9KthsISIiCiHzl+6KowmSda6ZRM0aVg3n2qUvg1b9wjz0iebMmFktqYPIiIiIiIiIiIqqBgsISIiyiUVFWVYmpujwx/2GD38157SSkNDHSXsbDB0QC90ymABUyIiIiIiIiKiwoRrlhARERERERERERERUaGmlN8VICIiIiIiIiIiIiIiyk8MlhARERERERERERERUaHGYAkRERERERERERERERVqDJYQEREREREREREREVGhxmAJEREREREREREREREVagyWEBERERERERERERFRocZgCRERERERERERERERFWoq+V0BIvpx1mzcgTUbd8DYyAB3nE5DU1Mj22UMGumAm7ddUK92TRzavSHT/PVbdITvF/8slb18yWx06/RHtuuUkeOnL+Czrx8AYHD/ntDT1cl0n/sP3dFr4Bi5NJFIhCLaWihZwg6d/2yNPj06Q0npe3x59YbtWLtpp7Bdt3YNHN69Ua4Mz/+eo2PPIXJprx47Q0NdXdi+fPUm9h06iecv3yAqOgpFtLVhaGiAUiVs0bJZI3Tt2E7I22PAKLg+epzuebRs1gjbN/yb6fkSERHllbTaGp98v6Bhy84AgNr/q4ajezdnWIaffwAat+6KuLg4rFw2F106tM0wf1r37Yx8ePEgy3mzIlwcgV37jgAAilmaZ7ktM2nmQpw84yhsd+v0B5YvmS2X5/ylqxg3aY6wbWxkCLc7jkjN94s/GrbqjMTERACAtpYWHt2+CC0tTbl8Kd+L9Gxd9w/sWzTO0jkQEdGPkZu/3bN7H02W1t/uysrKMDTQR83qlTFySD9UqVQ+W+fxI6S8fx7esxF1a9UAANiWrwMAsLQww71rZ3JUdl6UkZb06vyrl53fnr98A6frzgCAOrWqK5xbyj6RO1dPwcrS4qfXkQo+jiwhKqC++H3Flp37AQAjBvfNUaAEACaMGQoAcHF1wyWnG3lWvx/lxJmLWLtpJ9Zu2glxRESOy5HJZIiIjMLjJ88wZ9EK/L1yY4b577u64/Xb93Jpew4cy3CfXfuPYuRfM+Di6oZwsRgJCVKEhYvh5f0R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aLaqXs/bSJQEuIQGYX5JglRVXFycdu7cqYsuusir/LPPPlPLlqdfNwi4kD0z+lV/h3Ba4+cN9XcIAAKAuaoVY2NjNWHCBG3dulVvvPGGCgsL1aNHD/Xs2VPPP/+83O7TD7cFAACorsjISKWkpOjLL7/Uxo0bdemll+rxxx/3d1gAEBAaDRwnyThNLUONBoyr/WCAs3Dvvfdq7Nix+vLLL2UymfTzzz/rH//4h+677z6lpqb6OzwAAFAHVDlZcqLLLrtMGRkZ2rFjh8LCwpSSksKwVQAAUOs6deqk9PR07d2719+hAEBACEnooqb3vCyZLZL5VxMTmK2S2aKm97yskIQu/gkQqKIHHnhA119/va644godPXpUl19+ue666y7de++9Gj16tL/DAwAAdcAZLTyydu1aLVmyRP/617/Upk0bzZ8/X/Xr16/h0AAAQCBatmzZaeuYTCYNHz78HEQDAKiXfKtsTdvrwOp02de9JsPpkMlqU1TyrWo0YByJEpw3HnvsMU2ePFlbtmyR2+1W+/btFRER4e+wAABAHVHlZElubq6WLVumpUuXqrCwUMOGDdPatWvVoUOH2owPAAAEmDvuuEMRERGyWq0yjMqnfiFZAgDnVkhCFzW9a6niR2bIKC+RKTiMNUpwXgoLC1NSUpLsdrvef/99tWnThrVYAQCApGokS1q0aKH4+HiNGDFC1113nYKCguRyufTdd9951evcuXONBwkAAAJHu3bttG/fPt12220aOXIkfQsAqENMZrNMtnB/hwFU280336zLL79co0ePVklJiX77298qOztbhmHo9ddf1+DBg/0dIgAA8LMqr1nidDqVk5OjRx55RJdeeqm6deumrl27er26detWm7ECAIAAsHnzZr333nsqKSnR5ZdfrqSkJC1cuFB2u93foQEAgPPUJ598oj59+kiS3nrrLbndbh06dEhz587Vo48+6ufoAABAXVDlkSXZ2dm1GQcAAIBHjx491KNHD6Wnp+tf//qXli5dqvvuu0/XX3+9lixZIpvN5u8QAQDAeeTw4cNq2LChJGnlypUaPHiwwsLCdM011+j+++/3c3QAAKAuqNY0XAAAAOdSaGiobr/9dl100UV6+OGH9frrr2vevHkkSwAAQLU0b95c69atU8OGDbVy5Uq9/vrrkqTCwkKFhIT4OToAAFAXVHkartNZsWLF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UytXrtTtt9+ugoICn30mk0kuV82t+zF+/Hj16tVLM2fO1M0336z169dr8eLFWrx4sed848aN08yZM9WqVSu1atVKM2fOVFhYmIYOHVpjcQAAgOoxV/eA4/OHu1wurVy5UldddZUk5g8HAAA1y+Vy6ZFHHlHTpk0VERGhXbt2SZKmTJmijIwMP0cHAADOJ6NHj9ZNN92k3Nxcud1ur1dNJkok6be//a3eeustvfbaa+rYsaMeeeQRpaena9iwYZ46DzzwgMaNG6fU1FQlJSVp7969Wr16tSIjI2s0FgAAUHXVTpYcnz+8Y8eOzB8OAABqzWOPPaYXX3xRTzzxhIKDgz3lnTp10gsvvODHyAAAwPkmPz9faWlpJ10TpKb94Q9/0H//+1+VlpZq69atuvvuu732m0wmTZs2Tbm5uSotLdWaNWvUsWPHcxIbAACoXLWTJdOmTdMLL7yge+65R59//jnzhwMAgFqxbNkyLV68WMOGDfMavdq5c2d9//33fowMAACcb2688UZ9/PHH/g4DAADUYdVes0Ri/nAAAFD79u7dq0suucSn3O12q7y83A8RAQCA89W8efN000036dNPP1WnTp0UFBTktX/MmDF+igwAANQV1U6WuFwuzZw5U4sWLdK+ffu0fft2tWzZUlOmTNFFF12kO++8szbiBAAAAaZDhw769NNP1aJFC6/yf/3rX+rWrZufogIAAOejV199VatWrVJoaKg+/vhjmUwmzz6TyUSyBAAAVD9Z8thjj+mll17SE0884TXnZqdOnfTMM8+QLAEAAGdl5MiRevbZZ/Xwww9r+PDh2rt3r9xut1asWKFt27Zp2bJl+ve//+3vMAEAwHnkoYce0owZMzRx4kSZzdWekRwAAASAaidLjs8ffuWVVyolJcVTzvzhAACgJrz00kt6/PHHde2112r58uWaOXOmTCaTpk6dqt/85jd699131b9/f3+HCQAAziNlZWUaMmQIiRKc1DOjX/V3CKc1ft5Qf4cAABe0aidLmD8cAADUJsMwPO8HDhyogQMH+jEaAABwIRgxYoSWL1+uBx980N+hAACAOqrayRLmDwcAALXtxHnEAQAAzpbL5dITTzyhVatWqXPnzj4LvM+ZM8dPkQEAgLqiyskS5g8HAADnSuvWrU+bMDl48OA5igYAAJzv/vvf/3oe8Pzf//7ntY+HNAAAgFSNZAnzhwMAgHNl+vTpqlevnr/DAAAAF4iPPvrI3yEAAIA6rsrJEuYPBwAA58ott9yiJk2a+DsMAAAAAAAQIKq1ZglDUwEAQG2jvwEAAGrCDTfcoBdffFFRUVG64YYbTll3xYoV5ygqAABQV1UrWcL84QAAoLadOJoVAADgTNWrV8/zHUZUVBQPZAAAgFOqVrKE+cMBAEBtc7vd/g4BAABcAJYuXep5/+KLL/ovEAAAcF6oVrKE+cMBAMD5bMGCBXryySeVm5urDh06KD09XX369Dlp/TVr1igtLU2bN29WfHy8HnjgAaWkpHj2v/jii/rzn//sc1xJSYlCQkJq5RoAAED1/e53v9OKFStUv359r3K73a7rr79eH374oX8CAwAAdYa5qhUZrgoAAM5ny5cv17hx4zR58mRt3LhRffr00aBBg5STk1Np/ezsbF199dXq06ePNm7cqAcffFBjxozRm2++6VUvKipKubm5Xi8SJQAA1C0ff/yxysrKfMpLS0v16aef+iEiAABQ11R5ZAnzhwMAgPPZnDlzdOedd+quu+6SJKWnp2vVqlVauHChZs2a5VN/0aJFSkhIUHp6uiSpXbt2+vrrr/XUU09p8ODBnnomk0mxsbHn5BoAAED1fPfdd573W7ZsUV5enmfb5XJp5cqVatq0qT9CAwAAdUyVkyXMHw4AAM5XZWVl2rBhgyZOnOhVPmDAAK1du7bSY9atW6cBAwZ4lQ0cOFAZGRkqLy9XUFCQJOno0aNq0aKFXC6XunbtqkceeUTdunU7aSwOh0MOh8OzbbfbJUlutyG3m4dTAAA4FbO5erNedO3aVSaTSSaTSb/73e989oeGhuq5556rqfACRklJiTp16qSCggIdOnTIU/7OO+9o6tSp2rFjh+rVq6epU6d6TWFanbYAADjXqrVmCQAAwPmooKBALpdLMTExXuUxMTFeT5ieKC8vr9L6TqdTBQUFiouLU9u2bfXiiy+qU6dOstvtevbZZ9W7d299++23atWqVaXtzpo1S9OnT/cp35tfKHuJ6wyvEACAwJAQ17Ba9bOzs2UYhlq2bKn169crOjrasy84OFhNmjSRxWKp6TAveFOnTlWzZs1UUFDgKVu5cqVSU1P1yiuvqE+fPrLb7dq3b98ZtQUAgD+QLAEAAAHj12uwGYZxynXZKqt/YnnPnj3Vs2dPz/7evXvrN7/5jZ577jnNnTu30jYnTZqktLQ0z7bdblfz5s3VtEkDRUVFVe+CAADAKbVo0UISs2XUpG+++UaZmZmaM2eOhgwZ4imfMmWKpk6dqn79+kmSGjRooAYNGpxRWwAA+APJEgAAcMFr3LixLBaLzyiS/Px8n9Ejx8XGxlZa32q1qlGjRpUeYzab9dvf/lY7duw4aSw2m002m62SY03VnloEAABU3fbt2/Xxxx8rPz/fJ3kydepUP0V1fnE6nbr77rs1f/58r/KioiJt2LBBQ4YMUdu2bXXo0CH17dtXzz777EnXdjtZWwAA+IvZ3wEAAADUtuDgYHXv3l1ZWVle5VlZWerVq1elxyQnJ/vUX716tZKSkjzrlfyaYRjatGmT4uLiaiZwAABQI55//nm1b99eU6dO1RtvvKG33nrL83r77bf9Hd554+mnn1bnzp09o0eOKywslGEYevnll7Vq1Srt3LlTQUFBGj58eLXbAgDAXxhZAgAAAkJaWpqGDx+upKQkJScna/HixcrJyfEsOjpp0iTt3btXy5YtkySlpKRo3rx5SktL0913361169YpIyNDr732mqfN6dOnq2fPnmrVqpXsdrvmzp2rTZs28YQkAAB1zKOPPqrHHntMEyZM8Hco560ffvhB8+fP18aNG332RURESJLGjBnjmfps+vTpatWqlYqKihQeHl7ltgAA8Be/jyxZsGCBEhMTFRISou7du+vTTz89Zf01a9aoe/fuCgkJUcuWLbVo0SKv/f369ZPJZPJ5XXPNNZ4606ZN89l/smGhAADgwjBkyBClp6drxowZ6tq1qz755BNlZmZ6/kOfm5urnJwcT/3ExERlZmbq448/VteuXfXII49o7ty5Gjx4sKfOoUOHdM8996hdu3YaMGCA9u7dq08++USXXnrpOb8+AABwcoWFhbrpppv8HcZ57dNPP9X+/fvVoUMHxcbG6oYbbpDdbldsbKy2b9+uhISESteCO77mW1XbWr9+/bm4HAAAfPh1ZMny5cs1btw4LViwQL1799bf//53DRo0SFu2bFFCQoJP/ezsbF199dW6++679corr+jzzz9XamqqoqOjPV9crFixQmVlZZ5jDhw4oC5duvh0ijp06KD333/fs22xWGrpKgEAQF2Rmpqq1NTUSve9+OKLPmV9+/bVN998c9L2nnnmGT3zzDM1FR4A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qLp06aI33nijWtf3xhtvqFOnTgoNDVWjRo101VVXqaioqNJrPBXDMPTXv/5Vzz77rFavXq2rr7662m0AAHAy9CnoUwAAUF30H+g/AOcrkiXABchisWjmzJl67rnn9NNPP51VWx9++KF+/vlnffLJJ5ozZ46mTZumP/zhD2rQoIG+/PJLpaSkKCUlRT/++KPXcffff7/+9re/aePGjerVq5euu+46HThwQJKUm5urvn37qmvXrvr666+1cuVK7du3TzfffLNXGy+99JKsVqs+//xz/f3vf680vmeffVZPP/20nnrqKX333XcaOHCgrrvuOu3YscNzrg4dOuhvf/ubcnNzdd9991XaRnJysu6++27l5uYqNzdXzZs39+x/4IEHNGvWLG3dulWdO3fWQw89pKVLl2rhwoXavHmzxo8fr9tuu01r1qyp0vXl5ubq1ltv1ciRI7V161Z9/PHHuuGGG2QYRrXujdPp1PDhw/Wvf/1La9as0WWXXVat4wEAOB36FPQpAACoLvoP9B+A85YB4IIyYsQI449//KNhGIbRs2dPY+TIkYZhGMZbb71lnPhH/uGHHza6dOnidewzzzxjtGjRwqutFi1aGC6Xy1PWpk0bo0+fPp5tp9NphIeHG6+99pphGIaRnZ1tSDIef/xxT53y8nKjWbNmxuzZsw3DMIwpU6YYAwYM8Dr3jz/+aEgytm3bZhiGYfTt29fo2rXraa83Pj7eeOyxx7zKfvvb3xqpqame7S5duhgPP/zwKdvp27evMXbsWK+yjz76yJBkvP32256yo0ePGiEhIcbatWu96t55553GrbfeWqXr27BhgyHJ2L1792mv71TxBgcHG8HBwcbWrVvPuB0AAE6GPgV9CgAAqov+A/0H4HzGyBLgAjZ79my99NJL2rJlyxm30aFDB5nNv/xVERMTo06dOnm2LRaLGjVqpPz8fK/jkpOTPe+tVquSkpK0detWSdKGDRv00UcfKSIiwvNq27atpIq5PI9LSko6ZWx2u10///yzevfu7VXeu3dvz7lqwolxbNmyRaWlperfv79X/MuWLfPEfrrr69Kli6688kp16tRJN910k55//vkzmsv1sssuU0REhB566KE6O28pAODCQJ+iZtCnAAAEEvoPNYP+A3DuWP0dAG9d+5oAAAQaSURBVIDac/nll2vgwIF68MEHdccdd3jtM5vNPkMsy8vLfdoICgry2jaZTJWWud3u08ZjMpkkVczpee2112r27Nk+deLi4jzvw8PDT9vmie0eZxiGT9nZODGO49f53nvvqWnTpl71bDabp86prs9isSgrK0tr167V6tWr9dxzz2ny5Mn68ssvlZiYWOW4OnXqpKefflpXXXWVbr75Zi1fvtzn3gAAUBPoU9QM+hQAgEBC/6Fm0H8Azh1GlgAXuMcff1zvvvuu1q5d61UeHR2tvLw8r87Jpk2bauy8X3zxhee90+nUhg0bPE8y/OY3v9HmzZt10UUX6ZJLLvF6VbUzIklRUVGKj4/XZ5995lW+du1atWvXrlrxBgcHy+VynbZe+/btZbPZlJOT4xP78TlFq3J9JpNJvXv31vTp07Vx40YFBwfrrbfeqlbMktS1a1d9+OGH+uyzz3TTTTdV2rkEAKAm0KeoGvoUAAD8gv5D1dB/AOoGkiXABa5Tp04aNmyYnnvuOa/yfv36af/+/XriiSf0ww8/aP78+frPf/5TY+edP3++3nrrLX3//fcaNWqUCgsLNXLkSEnSqFGjdPDgQd16661av369du3apdWrV2vkyJFV6hyc6P7779fs2bO1fPlybdu2TRMnTtSmTZs0duzYarVz0UUX6csvv9Tu3btVUFBw0qdSIiMjdd9992n8+PF66aWX9MMPP2jjxo2aP3++XnrppSpd35dffqmZM2fq66+/Vk5OjlasWKH9+/dXuzN1XOfOnfXRRx9p3bp1uvHGG1VWVnZG7QAAcCr0KaqGPgUAAL+g/1A19B+AuoFkCRAAHnnkEZ/hre3atdOCBQs0f/58denSRf/fzt2jJhaFYQB+Jb1ptEmvEH/IMiS22YcWWoqNGLXIHtyCSWOnGGxcgLVkH2GmG8jAYJwfJnCfpz6ce09zeOHlO4fDIcPh8K99cz6fZ7FY5O7uLq+vr1mtVqlUKkmSm5ub7Pf7vL+/p9PppNVqpd/v5/r6+sNbpJ/R6/UyGAwyGAzSbrezXq/z/PycWq120T7D4TBXV1dpNBqpVqt5e3v75drJZJLxeJzZbJbb29t0Op28vLz8GFc9d75yuZzdbpdut5t6vZ7RaJSnp6fc398nSbbbbUqlUk6n06f/v9lsZrPZ5HA45OHhQTgB4J+QKc6TKQDgI/nhPPkBvobSt59vKwD+q+Vymel0muPx6L1PAOC3yRQAwKXkB4rMZAnAF7Ner/P4+CiUAAB/RKYAAC4lP1BkJksAAAAAAIBCM1kCAAAAAAAUmrIEAAAAAAAoNGUJAAAAAABQaMoSAAAAAACg0JQlAAAAAABAoSlLAAAAAACAQlOWAAAAAAAAhaYsAQAAAAAACk1ZAgAAAAAAFNp3OVjPoOPfBf0AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_data = ablation_table.sort_values(\n", " \"K\"\n", ")\n", "\n", "k_values = plot_data[\n", " \"K\"\n", "].to_numpy()\n", "\n", "raw_rmse = plot_data[\n", " \"raw_test_RMSE\"\n", "].to_numpy()\n", "\n", "final_rmse = plot_data[\n", " \"final_test_RMSE\"\n", "].to_numpy()\n", "\n", "raw_mae = plot_data[\n", " \"raw_test_MAE\"\n", "].to_numpy()\n", "\n", "final_mae = plot_data[\n", " \"final_test_MAE\"\n", "].to_numpy()\n", "\n", "runtime = plot_data[\n", " \"parallel_runtime_seconds\"\n", "].to_numpy()\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Plot style\n", "# ---------------------------------------------------------\n", "\n", "RAW_COLOR = \"#D55E00\"\n", "FINAL_COLOR = \"#0072B2\"\n", "RUNTIME_COLOR = \"#7A5195\"\n", "GRID_COLOR = \"#D7DEE7\"\n", "TEXT_COLOR = \"#1F2937\"\n", "\n", "\n", "fig, axes = plt.subplots(\n", " 1,\n", " 3,\n", " figsize=(16, 4.8),\n", " constrained_layout=True,\n", ")\n", "\n", "ax_rmse, ax_mae, ax_runtime = axes\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Test RMSE\n", "# ---------------------------------------------------------\n", "\n", "ax_rmse.plot(\n", " k_values,\n", " raw_rmse,\n", " color=RAW_COLOR,\n", " marker=\"o\",\n", " markersize=7,\n", " linewidth=2.0,\n", " label=\"Raw expression\",\n", ")\n", "\n", "ax_rmse.plot(\n", " k_values,\n", " final_rmse,\n", " color=FINAL_COLOR,\n", " marker=\"s\",\n", " markersize=7,\n", " linewidth=2.0,\n", " label=\"Final expression\",\n", ")\n", "\n", "ax_rmse.set_title(\n", " \"(a) Test RMSE\",\n", " color=TEXT_COLOR,\n", " fontweight=\"semibold\",\n", ")\n", "\n", "ax_rmse.set_xlabel(\n", " \"Number of trees, K\"\n", ")\n", "\n", "ax_rmse.set_ylabel(\n", " \"Test RMSE\"\n", ")\n", "\n", "ax_rmse.set_xticks(\n", " k_values\n", ")\n", "\n", "ax_rmse.legend(\n", " frameon=False\n", ")\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Test MAE\n", "# ---------------------------------------------------------\n", "\n", "ax_mae.plot(\n", " k_values,\n", " raw_mae,\n", " color=RAW_COLOR,\n", " marker=\"o\",\n", " markersize=7,\n", " linewidth=2.0,\n", " label=\"Raw expression\",\n", ")\n", "\n", "ax_mae.plot(\n", " k_values,\n", " final_mae,\n", " color=FINAL_COLOR,\n", " marker=\"s\",\n", " markersize=7,\n", " linewidth=2.0,\n", " label=\"Final expression\",\n", ")\n", "\n", "ax_mae.set_title(\n", " \"(b) Test MAE\",\n", " color=TEXT_COLOR,\n", " fontweight=\"semibold\",\n", ")\n", "\n", "ax_mae.set_xlabel(\n", " \"Number of trees, K\"\n", ")\n", "\n", "ax_mae.set_ylabel(\n", " \"Test MAE\"\n", ")\n", "\n", "ax_mae.set_xticks(\n", " k_values\n", ")\n", "\n", "ax_mae.legend(\n", " frameon=False\n", ")\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Parallel-chain runtime\n", "# ---------------------------------------------------------\n", "\n", "runtime_bars = ax_runtime.bar(\n", " k_values,\n", " runtime,\n", " color=RUNTIME_COLOR,\n", " width=0.65,\n", " alpha=0.85,\n", ")\n", "\n", "ax_runtime.set_title(\n", " \"(c) Parallel-chain runtime\",\n", " color=TEXT_COLOR,\n", " fontweight=\"semibold\",\n", ")\n", "\n", "ax_runtime.set_xlabel(\n", " \"Number of trees, K\"\n", ")\n", "\n", "ax_runtime.set_ylabel(\n", " \"Runtime (seconds)\"\n", ")\n", "\n", "ax_runtime.set_xticks(\n", " k_values\n", ")\n", "\n", "ax_runtime.set_ylim(\n", " 0,\n", " 1.15 * runtime.max(),\n", ")\n", "\n", "ax_runtime.bar_label(\n", " runtime_bars,\n", " labels=[\n", " f\"{value:.1f}\"\n", " for value in runtime\n", " ],\n", " padding=4,\n", " fontsize=9,\n", ")\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Shared formatting\n", "# ---------------------------------------------------------\n", "\n", "for axis in axes:\n", " axis.grid(\n", " axis=\"y\",\n", " color=GRID_COLOR,\n", " linewidth=0.8,\n", " alpha=0.75,\n", " )\n", "\n", " axis.spines[\n", " \"top\"\n", " ].set_visible(False)\n", "\n", " axis.spines[\n", " \"right\"\n", " ].set_visible(False)\n", "\n", "\n", "fig.suptitle(\n", " \"BayeSym𝕏 forest-size ablation on the oxide-perovskite dataset\",\n", " fontsize=15,\n", " color=TEXT_COLOR,\n", " fontweight=\"semibold\",\n", ")\n", "\n", "# Test RMSE axis limits\n", "ax_rmse.set_ylim(\n", " 0.06, # lower limit\n", " 0.10, # upper limit\n", ")\n", "\n", "# Test MAE axis limits\n", "ax_mae.set_ylim(\n", " 0.03, # lower limit\n", " 0.08, # upper limit\n", ")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "518404d7", "metadata": {}, "source": [ "The preceding ablation results show that beyond $K=8$, there is no significant increase in the predictive accuracy. However, as expected the compute runtime increases linearly, hence to balance predictive performance with computational efficiency, we choose $K=8$ for the following `BayeSym𝕏` experiment." ] }, { "cell_type": "markdown", "id": "596f93b4", "metadata": {}, "source": [ "### Run `BayeSym𝕏` on one 90/10 train-test split of the oxide perovskite catalyst dataset" ] }, { "cell_type": "code", "execution_count": 12, "id": "be6b14a6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training observations: 972\n", "Test observations: 108\n", "\n", "╭────────────────────────────────────────────────────────────╮\n", "│ Running BayeSym𝕏 │\n", "├────────────────────────────────────────────────────────────┤\n", "│ Parallel MCMC chains : 5 │\n", "│ MCMC iterations : 2,000 per chain │\n", "│ Trees per forest : 8 │\n", "│ Operator set : [add, mul, neg, inv, sqrt] │\n", "╰────────────────────────────────────────────────────────────╯\n", "\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8e47609c85df4466bf602f7ff7ce9d84", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Chain 1 | seed=123: 0%| | 0/2000 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "╔════════════════════════════════════════════════════════════════════════════════════════════════════╗\n", "║ BayeSym𝕏 ║\n", "║ Summary of Results ║\n", "╚════════════════════════════════════════════════════════════════════════════════════════════════════╝\n", "\n", "Run overview\n", " • Ranked models : 10 returned (10 requested)\n", " • Ranking statistic : log_JMP\n", " • Reduction method : BIC and SymPy\n", " ✓ Evaluation : training and held-out test metrics\n", "\n", " Raw symbolic models ───────────────────────────────────────────────────────────────────────────────\n", " \n", " Rank Raw expression Train RMSE Train MAE Train R^2 Test RMSE Test MAE Test R^2 JMP\n", " 1 0.484962 + 0.0136505*((current_Density * Nd)) + 0.445553*((1/(t))) + 0.445553*((1/(t))) + 0.264697*(sqrt(abs(mu))) - 0.197534*((-RB)) + 0.0154372*((1/(Nd))) - 0.0653593*((XB * current_Density)) + 0.323983*((current_Density * (1/(Nd)))) 0.093392 0.0623951 0.694596 0.0861459 0.0585991 0.585872 1641.15\n", " 2 0.476932 + 0.0140861*((current_Density * Nd)) + 0.383145*((1/(t))) + 0.177661*(sqrt(abs(XA))) + 0.383145*((1/(t))) + 0.139529*((-XA)) + 0.383145*((1/(t))) - 0.0677114*((XB * current_Density)) + 0.334358*((current_Density * (1/(Nd)))) 0.0933647 0.0622022 0.694775 0.0860224 0.0585974 0.587059 1641.01\n", " 3 0.503843 + 0.0138945*((current_Density * Nd)) + 0.447384*((1/(t))) + 0.0242582*(sqrt(abs(XA))) + 0.447384*((1/(t))) + 0.0242582*(sqrt(abs(XA))) + 0.325941*(sqrt(abs(mu))) - 0.06668*((XB * current_Density)) + 0.329817*((current_Density * (1/(Nd)))) 0.0934087 0.0623202 0.694487 0.0860814 0.0585902 0.586492 1640.85\n", " 4 0.554836 + 0.013628*((current_Density * Nd)) + 0.45562*((1/(t))) + 0.45562*((1/(t))) - 0.161786*((-mu)) - 0.218411*((-RB)) + 0.0256536*((1/(Nd))) - 0.0652317*((XB * current_Density)) + 0.323393*((current_Density * (1/(Nd)))) 0.0933919 0.0624008 0.694597 0.0861492 0.0585815 0.58584 1640.85\n", " 5 0.336938 + 0.461799*((1/(t))) + 0.340414*((current_Density * (1/(Nd)))) - 0.197622*((-t)) + 0.0415716*(sqrt(abs(XA))) + 0.461799*((1/(t))) - 0.0694336*((XB * current_Density)) + 0.0144571*((Nd * current_Density)) + 0.211026*((1/(RA))) 0.0934545 0.0621432 0.694187 0.085997 0.0585246 0.587302 1640.49\n", " 6 0.306456 + 0.538618*((1/(t))) + 0.328193*((current_Density * (1/(Nd)))) - 0.0390075*((-t)) + 0.17738*(sqrt(abs(t))) + 0.538618*((1/(t))) - 0.0670728*((XB * current_Density)) + 0.014083*((Nd * current_Density)) + 0.104686*((1/(XB))) 0.0934094 0.0621768 0.694482 0.086063 0.0585012 0.586669 1640.44\n", " 7 0.465164 + 0.0137658*((current_Density * Nd)) + 0.176577*(mu) + 0.322349*((1/(RA))) + 0.28174*(sqrt(abs(mu))) + 0.327352*(sqrt(abs(RB))) + 0.456392*((1/(t))) - 0.0660047*((XB * current_Density)) + 0.326946*((current_Density * (1/(Nd)))) 0.0933979 0.0623595 0.694558 0.0861061 0.058604 0.586254 1640.41\n", " 8 0.465164 + 0.0137658*((current_Density * Nd)) + 0.176577*(mu) + 0.322349*((1/(RA))) + 0.28174*(sqrt(abs(mu))) + 0.327352*(sqrt(abs(RB))) + 0.456392*((1/(t))) - 0.0660047*((XB * current_Density)) + 0.326946*((current_Density * (1/(Nd)))) 0.0933979 0.0623595 0.694558 0.0861061 0.058604 0.586254 1640.41\n", " 9 0.465164 + 0.0137658*((current_Density * Nd)) + 0.176577*(mu) + 0.322349*((1/(RA))) + 0.28174*(sqrt(abs(mu))) + 0.327352*(sqrt(abs(RB))) + 0.456392*((1/(t))) - 0.0660047*((XB * current_Density)) + 0.326946*((current_Density * (1/(Nd)))) 0.0933979 0.0623595 0.694558 0.0861061 0.058604 0.586254 1640.41\n", " 10 0.465164 + 0.0137658*((current_Density * Nd)) + 0.176577*(mu) + 0.322349*((1/(RA))) + 0.28174*(sqrt(abs(mu))) + 0.327352*(sqrt(abs(RB))) + 0.456392*((1/(t))) - 0.0660047*((XB * current_Density)) + 0.326946*((current_Density * (1/(Nd)))) 0.0933979 0.0623595 0.694558 0.0861061 0.058604 0.586254 1640.41\n", "\n", " Final symbolic models ─────────────────────────────────────────────────────────────────────────────\n", " \n", " Rank Final expression Train RMSE Train MAE Train R^2 Test RMSE Test MAE Test R^2 Effective K Model size\n", " 1 0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t + 1.0*Nd + 0.351406*current_Density*t)/(Nd*t) 0.0934079 0.0621423 0.694492 0.0860327 0.0585818 0.586959 4 33\n", " 2 0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t + 1.0*Nd + 0.351406*current_Density*t)/(Nd*t) 0.0934079 0.0621423 0.694492 0.0860327 0.0585818 0.586959 4 33\n", " 3 0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t + 1.0*Nd + 0.351406*current_Density*t)/(Nd*t) 0.0934079 0.0621423 0.694492 0.0860327 0.0585818 0.586959 4 33\n", " 4 0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t + 1.0*Nd + 0.351406*current_Density*t)/(Nd*t) 0.0934079 0.0621423 0.694492 0.0860327 0.0585818 0.586959 4 33\n", " 5 -2.13313*(-0.00739467*Nd**2*current_Density + 0.0349929*Nd*XB*current_Density + 0.227648*Nd*t - 1.0*Nd - 0.165705*current_Density)/Nd 0.0940208 0.0623105 0.69047 0.0867225 0.0596713 0.58031 4 27\n", " 6 1.95945*(0.00862314*Nd**2*current_Density - 0.0403972*Nd*XB*current_Density - 0.163002*Nd*Abs(t)**0.5 + 1.0*Nd + 0.186314*current_Density)/Nd 0.0953416 0.0639761 0.681712 0.0881241 0.0616988 0.566634 4 30\n", " 7 0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t + 1.0*Nd + 0.351406*current_Density*t)/(Nd*t) 0.0934079 0.0621423 0.694492 0.0860327 0.0585818 0.586959 4 33\n", " 8 0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t + 1.0*Nd + 0.351406*current_Density*t)/(Nd*t) 0.0934079 0.0621423 0.694492 0.0860327 0.0585818 0.586959 4 33\n", " 9 0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t + 1.0*Nd + 0.351406*current_Density*t)/(Nd*t) 0.0934079 0.0621423 0.694492 0.0860327 0.0585818 0.586959 4 33\n", " 10 0.959899*(0.0149484*Nd**2*current_Density*t - 0.0716644*Nd*XB*current_Density*t + 0.726721*Nd*t + 1.0*Nd + 0.351406*current_Density*t)/(Nd*t) 0.0934079 0.0621423 0.694492 0.0860327 0.0585818 0.586959 4 33\n", "\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n", "✓ BayeSym𝕏 analysis complete\n", " Parallel-chain runtime: 1 min 4.25668 sec\n", " JMP values are reported on the log scale.\n", "────────────────────────────────────────────────────────────────────────────────────────────────────\n" ] } ], "source": [ "# Import everything from BayeSymX.\n", "from BayeSymX import *\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Configuration\n", "# ---------------------------------------------------------\n", "\n", "data_path = Path(\n", " \"perovskites_data/processed_data.csv\"\n", ")\n", "\n", "target_column = \"VRHE\"\n", "\n", "feature_columns = [\n", " \"current_Density\",\n", " \"RA\",\n", " \"RB\",\n", " \"t\",\n", " \"mu\",\n", " \"XA\",\n", " \"XB\",\n", " \"QA\",\n", " \"Nd\",\n", "]\n", "\n", "random_seed = 2026\n", "train_fraction = 0.90\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Load the data\n", "# ---------------------------------------------------------\n", "\n", "data = pd.read_csv(data_path)\n", "\n", "data = data.rename(\n", " columns={\n", " \"current_density\": \"current_Density\",\n", " }\n", ")\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Construct X and y\n", "# ---------------------------------------------------------\n", "\n", "X = data[\n", " feature_columns\n", "].to_numpy(dtype=float)\n", "\n", "y = data[\n", " target_column\n", "].to_numpy(dtype=float)\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Random 90% training and 10% test split\n", "# ---------------------------------------------------------\n", "\n", "rng = np.random.default_rng(\n", " random_seed\n", ")\n", "\n", "indices = rng.permutation(\n", " len(data)\n", ")\n", "\n", "n_train = int(\n", " train_fraction * len(data)\n", ")\n", "\n", "train_indices = indices[\n", " :n_train\n", "]\n", "\n", "test_indices = indices[\n", " n_train:\n", "]\n", "\n", "X_train = X[\n", " train_indices\n", "]\n", "\n", "y_train = y[\n", " train_indices\n", "]\n", "\n", "X_test = X[\n", " test_indices\n", "]\n", "\n", "y_test = y[\n", " test_indices\n", "]\n", "\n", "print(\n", " f\"Training observations: {len(y_train):,}\"\n", ")\n", "\n", "print(\n", " f\"Test observations: {len(y_test):,}\"\n", ")\n", "\n", "\n", "# ---------------------------------------------------------\n", "# BayeSymX settings\n", "# ---------------------------------------------------------\n", "\n", "K = 8\n", "maxdepth = 6\n", "top_r = 10\n", "maxiter = 2_000\n", "\n", "chain_seeds = [\n", " 123,\n", " 124,\n", " 125,\n", " 126,\n", " 127,\n", "]\n", "\n", "operator_set = [\n", " add,\n", " mul,\n", " neg,\n", " inv,\n", " sqrt_op,\n", "]\n", "\n", "move_weights = {\n", " \"grow\": 1.0,\n", " \"prune\": 1.0,\n", " \"change_feature\": 1.0,\n", " \"change_operator\": 1.0,\n", " \"subtree_replace\": 1.0,\n", " \"delete_node\": 1.0,\n", " \"insert_node\": 1.0,\n", "}\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Prior parameters\n", "# ---------------------------------------------------------\n", "\n", "number_of_operators = len(\n", " operator_set\n", ")\n", "\n", "number_of_features = len(\n", " feature_columns\n", ")\n", "\n", "number_of_coefficients = K + 1\n", "\n", "prior_params = (\n", " np.ones(\n", " number_of_operators,\n", " dtype=float,\n", " ),\n", " np.ones(\n", " number_of_features,\n", " dtype=float,\n", " ),\n", " 0.95,\n", " 2.00,\n", " np.zeros(\n", " number_of_coefficients,\n", " dtype=float,\n", " ),\n", " 10.0 * np.eye(\n", " number_of_coefficients,\n", " dtype=float,\n", " ),\n", " 0.05,\n", " 0.05,\n", ")\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Initial and proposal weights\n", "# ---------------------------------------------------------\n", "\n", "wts_init = [\n", " np.ones(\n", " number_of_operators,\n", " dtype=float,\n", " ),\n", " np.ones(\n", " number_of_features,\n", " dtype=float,\n", " ),\n", "]\n", "\n", "wts_prop = [\n", " np.ones(\n", " number_of_operators,\n", " dtype=float,\n", " ),\n", " np.ones(\n", " number_of_features,\n", " dtype=float,\n", " ),\n", "]\n", "\n", "\n", "# ---------------------------------------------------------\n", "# Run BayeSymX\n", "# ---------------------------------------------------------\n", "\n", "result_json = run_bayesymx(\n", " X_train=X_train,\n", " y_train=y_train,\n", " X_test=X_test,\n", " y_test=y_test,\n", "\n", " K=K,\n", " maxdepth=maxdepth,\n", " seeds=chain_seeds,\n", "\n", " prior_params=prior_params,\n", " add_intercept=True,\n", "\n", " wts_init=wts_init,\n", " wts_prop=wts_prop,\n", "\n", " opset=operator_set,\n", " ftset=feature_columns,\n", "\n", " move_weights=move_weights,\n", "\n", " maxiter=maxiter,\n", " burnin=0,\n", " thin=1,\n", " n_jobs=len(chain_seeds),\n", " show_progress=True,\n", " report_every=20,\n", "\n", " r=top_r,\n", "\n", " force_intercept=False,\n", " prior_variance=10.0,\n", "\n", " significant_digits=6,\n", " print_results=True,\n", "\n", " show_trace_plot=True,\n", " save_trace_plot=False,\n", ")" ] } ], "metadata": { "kernelspec": { "display_name": "base", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }