예제 #1
0
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
예제 #2
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
예제 #3
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)
예제 #4
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 = 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)
예제 #5
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