Skip to content

Commit 4281545

Browse files
committed
ENH: added variance for reconstruction
1 parent bab4204 commit 4281545

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

pysensors/reconstruction/_sspor.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ def __init__(self, basis=None, optimizer=None, n_sensors=None):
9595
else:
9696
raise ValueError("n_sensors must be a positive integer.")
9797
self.n_basis_modes = None
98+
self.sigma = None
9899

99100
def fit(self, x, quiet=False, prefit_basis=False, seed=None, **optimizer_kws):
100101
"""
@@ -514,3 +515,28 @@ def _validate_n_sensors(self):
514515
"Number of sensors exceeds number of samples, which may cause CCQR to "
515516
"select sensors in constrained regions."
516517
)
518+
519+
def variance(self, eta=None):
520+
"""
521+
Computes the uncertainty of the reconstructed state.
522+
523+
Parameters
524+
----------
525+
eta: float (default None)
526+
527+
Returns
528+
-------
529+
sigma:
530+
531+
"""
532+
check_is_fitted(self, "basis_matrix_")
533+
if eta is None:
534+
eta = 0.01
535+
s = self.get_selected_sensors()
536+
C = np.zeros((s.size, self.basis_matrix_.shape[0]))
537+
C[np.arange(s.size), s] = 1
538+
theta = C @ self.basis_matrix_
539+
A = np.eye(self.basis_matrix_.shape[1]) + (theta.T @ theta) / (eta**2)
540+
B = self.basis_matrix_ @ np.linalg.inv(A) @ theta.T / (eta**2)
541+
self.sigma = 3 * eta * np.sqrt(np.sum(B**2, axis=1))
542+
return self.sigma

0 commit comments

Comments
 (0)