ProbabilisticLinearSolver

class probnum.linalg.solvers.ProbabilisticLinearSolver(policy, information_op, belief_update, stopping_criterion)

Bases: ProbabilisticNumericalMethod[LinearSystem, LinearSystemBelief]

Compose a custom probabilistic linear solver.

Class implementing probabilistic linear solvers. Such (iterative) solvers infer solutions to problems of the form

\[Ax=b,\]

where \(A \in \mathbb{R}^{n \times n}\) and \(b \in \mathbb{R}^{n}\). They return a probability measure which quantifies uncertainty in the output arising from finite computational resources or stochastic input. This class unifies and generalizes probabilistic linear solvers as described in the literature. 1 2 3 4

Parameters
  • policy – Policy returning actions taken by the solver.

  • information_op – Information operator defining how information about the linear system is obtained given an action.

  • belief_update – Belief update defining how to update the QoI beliefs given new observations.

  • stopping_criterion – Stopping criterion determining when a desired terminal condition is met.

References

1

Hennig, P., Probabilistic Interpretation of Linear Solvers, SIAM Journal on Optimization, 2015, 25, 234-260

2

Cockayne, J. et al., A Bayesian Conjugate Gradient Method, Bayesian Analysis, 2019, 14, 937-1012

3

Bartels, S. et al., Probabilistic Linear Solvers: A Unifying View, Statistics and Computing, 2019

4

Wenger, J. and Hennig, P., Probabilistic Linear Solvers for Machine Learning, Advances in Neural Information Processing Systems (NeurIPS), 2020

See also

problinsolve

Solve linear systems in a Bayesian framework.

bayescg

Solve linear systems with prior information on the solution.

Examples

Define a linear system.

>>> import numpy as np
>>> from probnum.problems import LinearSystem
>>> from probnum.problems.zoo.linalg import random_spd_matrix
>>> rng = np.random.default_rng(42)
>>> n = 100
>>> A = random_spd_matrix(rng=rng, dim=n)
>>> b = rng.standard_normal(size=(n,))
>>> linsys = LinearSystem(A=A, b=b)

Create a custom probabilistic linear solver from pre-defined components.

>>> from probnum.linalg.solvers import (
...     ProbabilisticLinearSolver,
...     belief_updates,
...     beliefs,
...     information_ops,
...     policies,
...     stopping_criteria,
... )
>>> pls = ProbabilisticLinearSolver(
...     policy=policies.ConjugateGradientPolicy(),
...     information_op=information_ops.ProjectedResidualInformationOp(),
...     belief_update=belief_updates.solution_based.ProjectedResidualBeliefUpdate(),
...     stopping_criterion=(
...         stopping_criteria.MaxIterationsStoppingCriterion(100)
...         | stopping_criteria.ResidualNormStoppingCriterion(atol=1e-5, rtol=1e-5)
...     ),
... )

Define a prior over the solution.

>>> from probnum import linops, randvars
>>> prior = beliefs.LinearSystemBelief(
...     x=randvars.Normal(
...         mean=np.zeros((n,)),
...         cov=np.eye(n),
...     ),
... )

Solve the linear system using the custom solver.

>>> belief, solver_state = pls.solve(prior=prior, problem=linsys)
>>> np.linalg.norm(linsys.A @ belief.x.mean - linsys.b) / np.linalg.norm(linsys.b)
7.1886e-06

Methods Summary

solve(prior, problem[, rng])

Solve the linear system.

solve_iterator(prior, problem[, rng])

Generator implementing the solver iteration.

Methods Documentation

solve(prior, problem, rng=None)[source]

Solve the linear system.

Parameters
Returns

  • belief – Posterior belief \((\mathsf{x}, \mathsf{A}, \mathsf{H}, \mathsf{b})\) over the solution \(x\), the system matrix \(A\), its (pseudo-)inverse \(H=A^\dagger\) and the right hand side \(b\).

  • solver_state – Final state of the solver.

Return type

Tuple[LinearSystemBelief, LinearSolverState]

solve_iterator(prior, problem, rng=None)[source]

Generator implementing the solver iteration.

This function allows stepping through the solver iteration one step at a time and exposes the internal solver state.

Parameters
Yields

solver_state – State of the probabilistic linear solver.

Return type

Generator[LinearSolverState, None, None]