Skip to article frontmatterSkip to article content

8. Model selection

Authors
Affiliations
TNO
TNO
TNO

Imports

import numpy as np

# Problem definition
from probeye.definition.inverse_problem import InverseProblem
from probeye.definition.forward_model import ForwardModelBase
from probeye.definition.distribution import Normal
from probeye.definition.sensor import Sensor
from probeye.definition.likelihood_model import GaussianLikelihoodModel
from probeye.definition.correlation_model import ExpModel

# Inference
from probeye.inference.dynesty.solver import DynestySolver

Problem setup

# Fixed parameters
I = 1e9  # mm^4
L = 10_000  # mm
Q_loc = 2500  # mm

# Measurements
x_sensors = [2500, 5000]  # mm  (always from lower to higher, bug in inv_cov_vec_1D in tripy)
d_sensors = [35, 50]  # mm
sigma_model = 2.5  # mm
pearson = 0.5
l_corr = -np.abs(x_sensors[1] - x_sensors[0]) / np.log(pearson)  # mm (assuming exponential correlation)

# Prior
E_mean = 60  # GPa
E_std = 20  # GPa
Q_mean = 60  # kN
Q_std = 30  # kN

Define forward model

def beam_deflection(E, Q, a, x):  # a is load position, x is sensor position
    if x < a:
        b = L - a
        return Q * b * x * (L ** 2 - b ** 2 - x ** 2) / (6 * E * I * L)
    
    return Q * a * (L - x) * (2 * L * x - x ** 2 - a ** 2) / (6 * E * I * L)
## Write your code where the three dots are

class BeamModel(ForwardModelBase):
    def interface(self):
        ...

    def response(self, inp: dict) -> dict:
        ...

Define inverse problem

## Write your code where the three dots are

# Instantiate the inverse problem
problem = InverseProblem("Beam model with two sensors", print_header=False)

...

Solve with Dynesty

dynesty_solver = DynestySolver(problem, show_progress=True)
inference_data = dynesty_solver.run(estimation_method='static', nlive=250)

Model comparison

## Write your code where the three dots are

log_evidence_1 = ...  # See value in previous notebook
log_evidence_2 = ...  # See value in this notebook

prior_M_1 = ...
prior_M_2 = ...

denominator = ...

posterior_M_1 = ...
posterior_M_2 = ...

print(f"Posterior probability model 1: {posterior_M_1}")
print(f"Posterior probability model 2: {posterior_M_2}")

bayes_factor = ...
print(f"Bayes factor: {bayes_factor}")