Source code for mud_examples.experiments

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging

import numpy as np
from matplotlib import pyplot as plt

from mud_examples.utils import check_dir

plt.rcParams["figure.figsize"] = 10, 10
plt.rcParams["font.size"] = 16


__author__ = "Mathematical Michael"
__copyright__ = "Mathematical Michael"
__license__ = "mit"

_logger = logging.getLogger(__name__)
_mpl_logger = logging.getLogger("matplotlib")
_mpl_logger.setLevel(logging.WARNING)


[docs]def experiment_measurements(fun, num_measurements, sd, num_trials, seed=21): """ Fixed sensors, varying how much data is incorporated into the solution. """ experiments = {} solutions = {} for ns in num_measurements: _logger.debug(f"Measurement experiment. Num measurements: {ns}") discretizations = [] estimates = [] for t in range(num_trials): np.random.seed(seed + t) _d = fun(sd=sd, num_obs=ns) estimate = _d.estimate() discretizations.append(_d) estimates.append(estimate) experiments[ns] = discretizations solutions[ns] = estimates return experiments, solutions
[docs]def experiment_equipment(fun, num_measure, sd_vals, num_trials, seed=21): """ Fixed number of sensors, varying the quality of equipment. """ experiments = {} solutions = {} for sd in sd_vals: _logger.debug(f"Equipment Experiment. Std Dev: {sd}") discretizations = [] estimates = [] for t in range(num_trials): np.random.seed(seed + t) _d = fun(sd=sd, num_obs=num_measure) estimate = _d.estimate() discretizations.append(_d) estimates.append(estimate) experiments[sd] = discretizations solutions[sd] = estimates return experiments, solutions
[docs]def plot_experiment_equipment( tolerances, res, prefix, fsize=32, linewidth=5, title="Variance of MUD Error", save=True, ): print("Plotting experiments involving equipment differences...") plt.figure(figsize=(10, 10)) for _res in res: _example, _in, _rm, _re, _fname = _res ( regression_err_mean, slope_err_mean, regression_err_vars, slope_err_vars, sd_means, sd_vars, num_sensors, ) = _re plt.plot( tolerances, regression_err_mean, label=f"{_example.upper()} slope: {slope_err_mean:1.4f}", lw=linewidth, ) plt.scatter(tolerances, sd_means, marker="x", lw=20) plt.yscale("log") plt.xscale("log") plt.Axes.set_aspect(plt.gca(), 1) # plt.ylim(2E-3, 2E-2) # plt.ylabel("Absolute Error", fontsize=fsize) plt.xlabel("Tolerance", fontsize=fsize) plt.legend() plt.title(f"Mean of MUD Error for N={num_sensors}", fontsize=1.25 * fsize) if save: fdir = "".join(prefix.split("/")[::-1]) check_dir(f"figures/{_fname}/{fdir}") _logger.info("Saving equipment experiments: mean convergence.") plt.savefig( f"figures/{_fname}/{prefix}_convergence_mud_std_mean.png", bbox_inches="tight", ) else: plt.show() plt.figure(figsize=(10, 10)) for _res in res: _example, _in, _rm, _re, _fname = _res ( regression_err_mean, slope_err_mean, regression_err_vars, slope_err_vars, sd_means, sd_vars, num_sensors, ) = _re plt.plot( tolerances, regression_err_vars, label=f"{_example.upper()} slope: {slope_err_vars:1.4f}", lw=linewidth, ) plt.scatter(tolerances, sd_vars, marker="x", lw=20) plt.xscale("log") plt.yscale("log") # plt.ylim(2E-5, 2E-4) plt.Axes.set_aspect(plt.gca(), 1) # plt.ylabel("Absolute Error", fontsize=fsize) plt.xlabel("Tolerance", fontsize=fsize) plt.legend() plt.title(title, fontsize=1.25 * fsize) if save: _logger.info("Saving equipment experiments: variance convergence.") plt.savefig( f"figures/{_fname}/{prefix}_convergence_mud_std_var.png", bbox_inches="tight", ) else: plt.show()
[docs]def plot_experiment_measurements( res, prefix, fsize=32, linewidth=5, xlabel="Number of Measurements", save=True, legend=True, ): print("Plotting experiments involving increasing # of measurements.") plt.figure(figsize=(10, 10)) for _res in res: _example, _in, _rm, _re, _fname = _res solutions = _in[-1] measurements = list(solutions.keys()) regression_mean, slope_mean, regression_vars, slope_vars, means, variances = _rm plt.plot( measurements[: len(regression_mean)], regression_mean, label=f"{_example.upper()} slope: {slope_mean:1.4f}", lw=linewidth, ) plt.scatter(measurements[: len(means)], means, marker="x", lw=20) plt.xscale("log") plt.yscale("log") plt.Axes.set_aspect(plt.gca(), 1) # plt.ylim(0.9 * min(means), 1.3 * max(means)) # plt.ylim(2E-3, 2E-1) plt.xlabel(xlabel, fontsize=fsize) if legend: plt.legend(fontsize=fsize * 0.8) # plt.ylabel('Absolute Error in MUD', fontsize=fsize) title = "$\\mathrm{\\mathbb{E}}(|\\lambda^* - \\lambda^\\dagger|)$" # noqa E501 plt.title(title, fontsize=1.25 * fsize) if save: fdir = "/".join(prefix.split("/")[:-1]) check_dir(f"figures/{_fname}/{fdir}") _logger.info("Saving measurement experiments: mean convergence.") plt.savefig( f"figures/{_fname}/{prefix}_convergence_obs_mean.png", bbox_inches="tight" ) else: plt.show() plt.figure(figsize=(10, 10)) for _res in res: _example, _in, _rm, _re, _fname = _res regression_mean, slope_mean, regression_vars, slope_vars, means, variances = _rm plt.plot( measurements[: len(regression_vars)], regression_vars, label=f"{_example.upper()} slope: {slope_vars:1.4f}", lw=linewidth, ) plt.scatter(measurements[: len(variances)], variances, marker="x", lw=20) plt.xscale("log") plt.yscale("log") plt.Axes.set_aspect(plt.gca(), 1) # if not len(np.unique(variances)) == 1: # plt.ylim(0.9 * min(variances), 1.3 * max(variances)) # plt.ylim(5E-6, 5E-4) plt.xlabel(xlabel, fontsize=fsize) if legend: plt.legend(fontsize=fsize * 0.8) # plt.ylabel('Absolute Error in MUD', fontsize=fsize) plt.title( "$\\mathrm{Var}(|\\lambda^* - \\lambda^\\dagger|)$", fontsize=1.25 * fsize ) if save: _logger.info("Saving measurement experiments: variance convergence.") plt.savefig( f"figures/{_fname}/{prefix}_convergence_obs_var.png", bbox_inches="tight" ) else: plt.show()