def covariance_matrix(self, x, y, names=None, cov=None): """build a pyemu.Cov instance from Vario2d Parameters ---------- x : iterable of floats x locations y : iterable of floats y locations names : iterable of str (optional) names of location. If None, generic names will be used cov : pyemu.Cov instance (optional) an existing Cov instance to add contribution to Returns ------- pyemu.Cov """ if not isinstance(x, np.ndarray): x = np.array(x) if not isinstance(y, np.ndarray): y = np.array(y) assert x.shape[0] == y.shape[0] if names is not None: assert x.shape[0] == len(names) c = np.zeros((len(names), len(names))) np.fill_diagonal(c, self.contribution) cov = Cov(x=c, names=names) elif cov is not None: assert cov.shape[0] == x.shape[0] names = cov.row_names c = np.zeros((len(names), 1)) + self.contribution cont = Cov(x=c, names=names, isdiagonal=True) cov += cont else: raise Exception("Vario2d.covariance_matrix() requires either" + "names or cov arg") for i1, (n1, x1, y1) in enumerate(zip(names, x, y)): dx = x1 - x[i1 + 1:] dy = y1 - y[i1 + 1:] dxx = (dx * self.rotation_coefs[0]) +\ (dy * self.rotation_coefs[1]) dyy = ((dx * self.rotation_coefs[2]) +\ (dy * self.rotation_coefs[3])) *\ self.anisotropy h = np.sqrt(dxx * dxx + dyy * dyy) h[h < 0.0] = 0.0 h = self.h_function(h) if np.any(np.isnan(h)): raise Exception("nans in h for i1 {0}".format(i1)) cov.x[i1, i1 + 1:] += h for i in range(len(names)): cov.x[i + 1:, i] = cov.x[i, i + 1:] return cov
def schur_test_nonpest(): import numpy as np from pyemu import Matrix, Cov, Schur, Jco #non-pest pnames = ["p1", "p2", "p3"] onames = ["o1", "o2", "o3", "o4"] npar = len(pnames) nobs = len(onames) j_arr = np.random.random((nobs, npar)) jco = Jco(x=j_arr, row_names=onames, col_names=pnames) parcov = Cov(x=np.eye(npar), names=pnames) obscov = Cov(x=np.eye(nobs), names=onames) forecasts = "o2" s = Schur(jco=jco, parcov=parcov, obscov=obscov, forecasts=forecasts) print(s.get_parameter_summary()) print(s.get_forecast_summary()) #this should fail passed = False try: print(s.get_par_group_contribution()) passed = True except Exception as e: print(str(e)) if passed: raise Exception("should have failed") #this should fail passed = False try: print(s.get_removed_obs_group_importance()) passed = True except Exception as e: print(str(e)) if passed: raise Exception("should have failed") print(s.get_par_contribution({"group1": ["p1", "p3"]})) print(s.get_removed_obs_importance({"group1": ["o1", "o3"]})) print(s.pandas) forecasts = Matrix(x=np.random.random((1, npar)), row_names=[forecasts], col_names=pnames) sc = Schur(jco=jco, forecasts=forecasts.T, parcov=parcov, obscov=obscov) ffile = os.path.join("temp", "forecasts.jcb") forecasts.to_binary(ffile) sc = Schur(jco=jco, forecasts=ffile, parcov=parcov, obscov=obscov)
def errvar_test_nonpest(): import numpy as np from pyemu import ErrVar, Matrix, Cov #non-pest pnames = ["p1","p2","p3"] onames = ["o1","o2","o3","o4"] npar = len(pnames) nobs = len(onames) j_arr = np.random.random((nobs,npar)) jco = Matrix(x=j_arr,row_names=onames,col_names=pnames) parcov = Cov(x=np.eye(npar),names=pnames) obscov = Cov(x=np.eye(nobs),names=onames) forecasts = "o2" omitted = "p3" e = ErrVar(jco=jco,parcov=parcov,obscov=obscov,forecasts=forecasts, omitted_parameters=omitted) svs = [0,1,2,3,4,5] print(e.get_errvar_dataframe(svs))
def covariance_matrix(self, x, y, names=None, cov=None): """build a pyemu.Cov instance from GeoStruct Parameters ---------- x : iterable of floats x locations y : iterable of floats y locations names : iterable of str (optional) names of location. If None, generic names will be used cov : pyemu.Cov instance (optional) an existing Cov instance to add contribution to Returns ------- pyemu.Cov """ if not isinstance(x, np.ndarray): x = np.array(x) if not isinstance(y, np.ndarray): y = np.array(y) assert x.shape[0] == y.shape[0] if names is not None: assert x.shape[0] == len(names) c = np.zeros((len(names), len(names))) np.fill_diagonal(c, self.nugget) cov = Cov(x=c, names=names) elif cov is not None: assert cov.shape[0] == x.shape[0] names = cov.row_names c = np.zeros((len(names), 1)) c += self.nugget cont = Cov(x=c, names=names, isdiagonal=True) cov += cont else: raise Exception("GeoStruct.covariance_matrix() requires either " + "names or cov arg") for v in self.variograms: v.covariance_matrix(x, y, cov=cov) return cov
def covariance_matrix(self, x, y, names=None, cov=None): if not isinstance(x, np.ndarray): x = np.array(x) if not isinstance(y, np.ndarray): y = np.array(y) assert x.shape[0] == y.shape[0] if names is not None: assert x.shape[0] == len(names) c = np.zeros((len(names), len(names))) np.fill_diagonal(c, self.contribution) cov = Cov(x=c, names=names) elif cov is not None: assert cov.shape[0] == x.shape[0] names = cov.row_names c = np.zeros((len(names), 1)) + self.contribution cont = Cov(x=c, names=names, isdiagonal=True) cov += cont else: raise Exception("Vario2d.covariance_matrix() requires either" + "names or cov arg") for i1, (n1, x1, y1) in enumerate(zip(names, x, y)): dx = x1 - x[i1 + 1:] dy = y1 - y[i1 + 1:] dxx = (dx * self.rotation_coefs[0]) +\ (dy * self.rotation_coefs[1]) dyy = ((dx * self.rotation_coefs[2]) +\ (dy * self.rotation_coefs[3])) *\ self.anisotropy h = np.sqrt(dxx * dxx + dyy * dyy) h[h < 0.0] = 0.0 cov.x[i1, i1 + 1:] += self.h_function(h) for i in range(len(names)): cov.x[i + 1:, i] = cov.x[i, i + 1:] return cov
def covariance_matrix(self, x, y, names=None, cov=None): if not isinstance(x, np.ndarray): x = np.array(x) if not isinstance(y, np.ndarray): y = np.array(y) assert x.shape[0] == y.shape[0] if names is not None: assert x.shape[0] == len(names) c = np.zeros((len(names), len(names))) np.fill_diagonal(c, self.nugget) cov = Cov(x=c, names=names) elif cov is not None: assert cov.shape[0] == x.shape[0] names = cov.row_names c = np.zeros((len(names), 1)) + self.nugget cont = Cov(x=c, names=names, isdiagonal=True) cov += cont else: raise Exception("GeoStruct.covariance_matrix() requires either" + "names or cov arg") for v in self.variograms: v.covariance_matrix(x, y, cov=cov) return cov
def diagonal_cov_draw_test(): import os import numpy as np from pyemu import MonteCarlo, Cov, Pst jco = os.path.join("pst", "pest.jcb") pst = Pst(jco.replace(".jcb", ".pst")) mc = MonteCarlo(jco=jco, pst=pst) num_reals = 10 mc.draw(num_reals, obs=True) print(mc.obsensemble) pe1 = mc.parensemble.copy() cov = Cov(x=mc.parcov.as_2d, names=mc.parcov.row_names) #print(type(cov)) mc = MonteCarlo(jco=jco, pst=pst) mc.parensemble.reseed() mc.draw(num_reals, cov=cov) pe2 = mc.parensemble