def test_unit_box(): ackley = Ackley(dim=1) np.random.seed(0) x = np.random.rand(30, 1) fX = np.expand_dims([ackley.eval(y) for y in x], axis=1) xx = np.expand_dims(np.linspace(0, 1, 100), axis=1) # RBF with internal scaling to unit hypercube rbf1 = RBFInterpolant(dim=1, lb=np.zeros(1), ub=100 * np.ones(1), eta=1e-6) rbf1.add_points(x, fX) # Normal RBF rbf2 = RBFInterpolant(dim=1, lb=np.zeros(1), ub=100 * np.ones(1), eta=1e-6) rbf2.add_points(x, fX) assert np.max(np.abs(rbf1.predict(xx) - rbf2.predict(xx))) < 1e-10 assert np.max( np.abs(rbf1.predict_deriv(x[0, :]) - rbf2.predict_deriv(x[0, :]))) < 1e-10 assert np.max(np.abs(rbf1.X - rbf2.X)) < 1e-10 assert np.max(np.abs(rbf1.fX - rbf2.fX)) < 1e-10 rbf1.reset() assert rbf1.num_pts == 0 and rbf1.dim == 1 assert rbf1.X.size == 0 and rbf1.fX.size == 0
def test_capped(): def ff(x): return (6 * x - 2)**2 * np.sin(12 * x - 4) np.random.seed(0) x = np.random.rand(30, 1) fX = ff(x) xx = np.expand_dims(np.linspace(0, 1, 100), axis=1) # RBF with capping adapter rbf1 = RBFInterpolant(dim=1, lb=np.zeros(1), ub=np.ones(1), output_transformation=median_capping, eta=1e-6) rbf1.add_points(x, fX) # RBF fitted to capped value fX_capped = fX.copy() fX_capped[fX > np.median(fX)] = np.median(fX) rbf2 = RBFInterpolant(dim=1, lb=np.zeros(1), ub=np.ones(1), eta=1e-6) rbf2.add_points(x, fX_capped) assert np.max(np.abs(rbf1.predict(xx) - rbf2.predict(xx))) < 1e-10 assert np.max( np.abs(rbf1.predict_deriv(x[0, :]) - rbf2.predict_deriv(x[0, :]))) < 1e-10 rbf1.reset() assert rbf1.num_pts == 0 and rbf1.dim == 1 assert rbf1.X.size == 0 and rbf1.fX.size == 0
class RBF: """ Radial Basis Function """ def __init__(self, kernel='cubic', tail='linear'): self.kernel = kernel self.tail = tail self.name = 'rbf' self.model = None def fit(self, train_data, train_label): if self.kernel == 'cubic': kernel = CubicKernel elif self.kernel == 'tps': kernel = TPSKernel else: raise NotImplementedError("unknown RBF kernel") if self.tail == 'linear': tail = LinearTail elif self.tail == 'constant': tail = ConstantTail else: raise NotImplementedError("unknown RBF tail") self.model = RBFInterpolant(dim=train_data.shape[1], kernel=kernel(), tail=tail(train_data.shape[1])) for i in range(len(train_data)): self.model.add_points(train_data[i, :], train_label[i]) def predict(self, test_data): assert self.model is not None, "RBF model does not exist, call fit to obtain rbf model first" return self.model.predict(test_data)
def test_capped(): def ff(x): return (6 * x - 2)**2 * np.sin(12 * x - 4) np.random.seed(0) x = np.random.rand(30, 1) fX = ff(x) xx = np.expand_dims(np.linspace(0, 1, 100), axis=1) # RBF with capping adapter rbf1 = SurrogateCapped(RBFInterpolant(dim=1, eta=1e-6)) rbf1.add_points(x, fX) # RBF fitted to capped value fX_capped = fX.copy() fX_capped[fX > np.median(fX)] = np.median(fX) rbf2 = RBFInterpolant(dim=1, eta=1e-6) rbf2.add_points(x, fX_capped) assert (np.max(np.abs(rbf1.predict(xx) - rbf2.predict(xx))) < 1e-10) assert (np.max( np.abs(rbf1.predict_deriv(x[0, :]) - rbf2.predict_deriv(x[0, :]))) < 1e-10) rbf1.reset() assert (rbf1.num_pts == 0 and rbf1.dim == 1) assert (rbf1.X.size == 0 and rbf1.fX.size == 0)
def test_rbf(): X = make_grid(30) # Make uniform grid with 30 x 30 points rbf = RBFInterpolant(dim=2, lb=np.zeros(2), ub=np.ones(2), eta=1e-6) assert isinstance(rbf, Surrogate) fX = f(X) rbf.add_points(X, fX) # Derivative at random points np.random.seed(0) Xs = np.random.rand(10, 2) fhx = rbf.predict(Xs) dfhx = rbf.predict_deriv(Xs) fx = f(Xs) dfx = df(Xs) assert np.max(np.abs(fx - fhx)) < 1e-4 assert la.norm(dfx - dfhx) < 1e-2 # Derivative at previous points dfhx = rbf.predict_deriv(X[0, :]) assert la.norm(df(np.atleast_2d(X[0, :])) - dfhx) < 1e-1 # Reset the surrogate rbf.reset() assert rbf.num_pts == 0 and rbf.dim == 2 # Now add 100 points at a time and test reallocation + LU for i in range(9): rbf.add_points(X[i * 100:(i + 1) * 100, :], fX[i * 100:(i + 1) * 100]) rbf.predict(Xs) # Force fit # Derivative at random points np.random.seed(0) Xs = np.random.rand(10, 2) fhx = rbf.predict(Xs) dfhx = rbf.predict_deriv(Xs) fx = f(Xs) dfx = df(Xs) assert np.max(np.abs(fx - fhx)) < 1e-4 assert la.norm(dfx - dfhx) < 1e-2 # Derivative at previous points dfhx = rbf.predict_deriv(X[0, :]) assert la.norm(df(np.atleast_2d(X[0, :])) - dfhx) < 1e-1