def select_sigma_lambda_cma(Z,
                            num_folds=5,
                            num_repetitions=1,
                            sigma0=1.1,
                            lmbda0=1.1,
                            cma_opts={},
                            disp=False):
    import cma

    start = np.log2(np.array([sigma0, lmbda0]))

    es = cma.CMAEvolutionStrategy(start, 1., cma_opts)
    while not es.stop():
        if disp:
            es.disp()
        solutions = es.ask()

        values = np.zeros(len(solutions))
        for i, (log2_sigma, log2_lmbda) in enumerate(solutions):
            sigma = 2**log2_sigma
            lmbda = 2**log2_lmbda

            K = gaussian_kernel(Z, sigma=sigma)
            folds = xvalidate(Z, num_folds, sigma, lmbda, K)
            values[i] = np.mean(folds)
            logger.info("particle %d/%d, sigma: %.2f, lambda: %.2f, J=%.4f" % \
                        (i + 1, len(solutions), sigma, lmbda, values[i]))

        es.tell(solutions, values)

    return es
def select_sigma_grid(Z,
                      num_folds=5,
                      num_repetitions=1,
                      log2_sigma_min=-3,
                      log2_sigma_max=10,
                      resolution_sigma=25,
                      lmbda=1.,
                      plot_surface=False):

    sigmas = 2**np.linspace(log2_sigma_min, log2_sigma_max, resolution_sigma)

    Js = np.zeros(len(sigmas))
    for i, sigma in enumerate(sigmas):
        K = gaussian_kernel(Z, sigma=sigma)
        folds = xvalidate(Z, num_folds, sigma, lmbda, K)
        Js[i] = np.mean(folds)
        logger.info("sigma trial %d/%d, sigma: %.2f, lambda: %.2f, J=%.2f" % \
            (i + 1, len(sigmas), sigma, lmbda, Js[i]))

    if plot_surface:
        plt.figure()
        plt.plot(np.log2(sigmas), Js)

    best_sigma_idx = Js.argmin()
    best_sigma = sigmas[best_sigma_idx]
    logger.info("Best sigma: %.2f with J=%.2f" %
                (best_sigma, Js[best_sigma_idx]))
    return best_sigma
예제 #3
0
def update_plot(val=None):
    sigma = 2**s_sigma.val
    lmbda = 2**s_lmbda.val

    K = gaussian_kernel(Z, sigma=sigma)
    b = _compute_b_sym(Z, K, sigma)
    C = _compute_C_sym(Z, K, sigma)
    a = score_matching_sym(Z, sigma, lmbda, K, b, C)
    J = _objective_sym(Z, sigma, lmbda, a, K, b, C)
    J_xval = np.mean(xvalidate(Z, 5, sigma, lmbda, K, num_repetitions=3))

    print(a[:5])

    kernel = lambda X, Y=None: gaussian_kernel(X, Y, sigma=sigma)
    kernel_grad = lambda x, X=None: gaussian_kernel_grad(x, X, sigma)
    logq_est = lambda x: log_pdf_estimate(x, a, Z, kernel)
    dlogq_est = lambda x: log_pdf_estimate_grad(x, a, Z, kernel_grad)

    description = "N=%d, sigma: %.2f, lambda: %.2f, J(a)=%.2f, XJ(a)=%.2f" % \
        (N, sigma, lmbda, J, J_xval)

    if plot_pdf:
        D = evaluate_density_grid(Xs, Ys, logq_est)
        description = "log-pdf: " + description
    else:
        D = evaluate_density_grad_grid(Xs, Ys, dlogq_est)
        description = "norm-grad-log-pdf: " + description

    ax.clear()
    ax.plot(Z[:, 0], Z[:, 1], 'bx')
    plot_array(Xs, Ys, D, ax, plot_contour=True)

    ax.set_title(description)

    fig.canvas.draw_idle()
예제 #4
0
def optimise_sigma_surface(val):
    print("sigma")
    log2_lmbda = s_lmbda.val
    lmbda = 2**log2_lmbda

    log2_sigmas = np.linspace(s_sigma.valmin, s_sigma.valmax)
    Js = np.zeros(len(log2_sigmas))
    for i, log2_sigma in enumerate(log2_sigmas):
        sigma = 2**log2_sigma
        K = gaussian_kernel(Z, sigma=sigma)
        Js[i] = np.mean(xvalidate(Z, 5, sigma, lmbda, K, num_repetitions=3))

    log2_sigma_min = log2_sigmas[Js.argmin()]
    log_Js = np.log(Js - (Js.min() if Js.min() < 0 else 0) + 1)

    # update slider
    s_sigma.set_val(log2_sigma_min)
    update_plot()

    plt.figure()
    plt.plot(log2_sigmas, log_Js)
    plt.plot([log2_sigma_min, log2_sigma_min],
             [log_Js.min(), log_Js.max()], 'r')
    plt.title(
        r"$\sigma$ surface for $\log_2 \lambda=%.2f$, best value of $J(\alpha)=%.2f$ at $\log_2 \sigma=%.2f$"
        % (log2_lmbda, Js.min(), log2_sigma_min))

    plt.show()
예제 #5
0
def plot_lmbda_surface(val):
    print("lambda")
    log2_sigma = s_sigma.val
    sigma = 2**log2_sigma

    K = gaussian_kernel(Z, sigma=sigma)
    log2_lambdas = np.linspace(s_lmbda.valmin, s_lmbda.valmax)
    Js = np.array([
        np.mean(xvalidate(Z, 5, sigma, 2**log2_lmbda, K, num_repetitions=3))
        for log2_lmbda in log2_lambdas
    ])

    log2_lambda_min = log2_lambdas[Js.argmin()]
    log_Js = np.log(Js - (Js.min() if Js.min() < 0 else 0) + 1)

    # update slider
    s_lmbda.set_val(log2_lambda_min)
    update_plot()

    plt.figure()
    plt.plot(log2_lambdas, log_Js)
    plt.plot([log2_lambda_min, log2_lambda_min],
             [log_Js.min(), log_Js.max()], 'r')
    plt.title(
        r"$\lambda$ surface for $\log_2 \sigma=%.2f$, best value of $J(\alpha)=%.2f$ at $\log_2 \lambda=%.2f$"
        % (log2_sigma, Js.min(), log2_lambda_min))

    plt.show()
예제 #6
0
def fun(sigma_lmbda, num_repetitions=1):
    log2_sigma = sigma_lmbda[0]
    log2_lmbda = sigma_lmbda[1]

    sigma = 2**log2_sigma
    lmbda = 2**log2_lmbda
    K = gaussian_kernel(Z, sigma=sigma)
    folds = [
        xvalidate(Z, num_folds, sigma, lmbda, K)
        for _ in range(num_repetitions)
    ]
    J = np.mean(folds)
    J_std = np.std(folds)
    print("fun: log2_sigma=%.2f, log_lmbda=%.2f, J(a)=%.2f" %
          (log2_sigma, log2_lmbda, J))
    return J, J_std
예제 #7
0
    dlogq = lambda x: log_gaussian_pdf(x, Sigma=L, is_cholesky=True, compute_grad=True)
    logq = lambda x: log_gaussian_pdf(x, Sigma=L, is_cholesky=True, compute_grad=False)

    # estimate density in rkhs
    N = 200
    mu = np.zeros(D)
    Z = sample_gaussian(N, mu, Sigma=L, is_cholesky=True)
    lmbda = 1.
    sigma = select_sigma_grid(Z, lmbda=lmbda, plot_surface=False)
    
    K = gaussian_kernel(Z, sigma=sigma)
    b = _compute_b_sym(Z, K, sigma)
    C = _compute_C_sym(Z, K, sigma)
    a = score_matching_sym(Z, sigma, lmbda, K, b, C)
    J = _objective_sym(Z, sigma, lmbda, a, K, b, C)
    J_xval = np.mean(xvalidate(Z, 5, sigma, lmbda, K))
    print("N=%d, sigma: %.2f, lambda: %.2f, J(a)=%.2f, XJ(a)=%.2f" % \
            (N, sigma, lmbda, J, J_xval))
    
    kernel = lambda X, Y = None: gaussian_kernel(X, Y, sigma=sigma)
    kernel_grad = lambda x, X = None: gaussian_kernel_grad(x, X, sigma)
    logq_est = lambda x: log_pdf_estimate(x, a, Z, kernel)
    dlogq_est = lambda x: log_pdf_estimate_grad(x, a, Z, kernel_grad)
    
    # momentum
    Sigma_p = np.eye(D)
    L_p = np.linalg.cholesky(Sigma_p)
    logp = lambda x: log_gaussian_pdf(x, Sigma=L_p, compute_grad=False, is_cholesky=True)
    dlogp = lambda x: log_gaussian_pdf(x, Sigma=L_p, compute_grad=True, is_cholesky=True)
    p_sample = lambda: sample_gaussian(N=1, mu=np.zeros(D), Sigma=L_p, is_cholesky=True)[0]
예제 #8
0
from kmc.score_matching.kernel.kernels import gaussian_kernel
from kmc.score_matching.lite.gaussian_rkhs import xvalidate
from kmc.score_matching.lite.gaussian_rkhs_xvalidation import select_sigma_lambda_cma
import numpy as np

if __name__ == "__main__":
    np.random.seed(0)
    N = 200
    Z = np.random.randn(N, 2)
    #     print np.sum(Z) * np.std(Z) * np.sum(Z**2) * np.std(Z**2)

    cma_opts = {
        'tolfun': 1e-2,
        'maxiter': 20,
        'verb_disp': 1,
        'bounds': [-3, 5]
    }

    es = select_sigma_lambda_cma(Z, cma_opts=cma_opts, disp=True)
    log2_sigma = es.best.get()[0][0]
    log2_lmbda = es.best.get()[0][1]
    sigma = 2**log2_sigma
    lmbda = 2**log2_lmbda
    K = gaussian_kernel(Z, sigma=sigma)
    print(log2_sigma, log2_lmbda, np.mean(xvalidate(Z, 5, sigma, lmbda, K)))