def _fit_poly(X, y): try: N, d = X.shape myParameters = [] for dimension in range(d): values = X[:,dimension] values_min = np.amin(values) values_max = np.amax(values) if (values_min - values_max) ** 2 < 0.01: myParameters.append(Parameter(distribution='Uniform', lower=values_min-0.01, upper=values_max+0.01, order=self.order)) else: myParameters.append(Parameter(distribution='Uniform', lower=values_min, upper=values_max, order=self.order)) if self.basis == "hyperbolic-basis": myBasis = Basis(self.basis, orders=[self.order for _ in range(d)], q=0.5) else: myBasis = Basis(self.basis, orders=[self.order for _ in range(d)]) container["index_node_global"] += 1 poly = Poly(myParameters, myBasis, method=self.poly_method, sampling_args={'sample-points':X, 'sample-outputs':y}, solver_args=self.poly_solver_args) poly.set_model() mse = np.linalg.norm(y - poly.get_polyfit(X).reshape(-1)) ** 2 / N except Exception as e: print("Warning fitting of Poly failed:", e) print(d, values_min, values_max) mse, poly = np.inf, None return mse, poly
def _calculate_subspace(self, S, f): parameters = [Parameter(distribution='uniform', lower=np.min(S[:,i]), upper=np.max(S[:,i]), order=1) for i in range(0, self.n)] self.poly = Poly(parameters, basis=Basis('total-order'), method='least-squares', \ sampling_args={'sample-points': S, 'sample-outputs': f}) self.poly.set_model() self.Subs = Subspaces(full_space_poly=self.poly, method='active-subspace', subspace_dimension=self.d) if self.subspace_method == 'variable-projection': U0 = self.Subs.get_subspace()[:,:self.d] self.Subs = Subspaces(method='variable-projection', sample_points=S, sample_outputs=f, \ subspace_init=U0, subspace_dimension=self.d, polynomial_degree=2, max_iter=300, tol=1.0e-8) self.U = self.Subs.get_subspace()[:, :self.d] elif self.subspace_method == 'active-subspaces': U0 = self.Subs.get_subspace()[:,1].reshape(-1,1) U1 = null_space(U0.T) self.U = U0 for i in range(self.d-1): R = [] for j in range(U1.shape[1]): U = np.hstack((self.U, U1[:, j].reshape(-1,1))) Y = np.dot(S, U) myParameters = [Parameter(distribution='uniform', lower=np.min(Y[:,k]), upper=np.max(Y[:,k]), \ order=2) for k in range(Y.shape[1])] myBasis = Basis('total-order') poly = Poly(myParameters, myBasis, method='least-squares', \ sampling_args={'sample-points':Y, 'sample-outputs':f}) poly.set_model() f_eval = poly.get_polyfit(Y) _,_,r,_,_ = linregress(f_eval.flatten(),f.flatten()) R.append(r**2) index = np.argmax(R) self.U = np.hstack((self.U, U1[:, index].reshape(-1,1))) U1 = np.delete(U1, index, 1)
def _fit_poly(X, y): N, d = X.shape myParameters = [] for dimension in range(d): values = [X[i,dimension] for i in range(N)] values_min = min(values) values_max = max(values) if (values_min - values_max) ** 2 < 0.01: myParameters.append(Parameter(distribution='Uniform', lower=values_min-0.01, upper=values_max+0.01, order=self.order)) else: myParameters.append(Parameter(distribution='Uniform', lower=values_min, upper=values_max, order=self.order)) myBasis = Basis('total-order') y = np.reshape(y, (y.shape[0], 1)) poly = Poly(myParameters, myBasis, method='least-squares', sampling_args={'sample-points':X, 'sample-outputs':y}) poly.set_model() mse = ((y-poly.get_polyfit(X))**2).mean() return mse, poly