def train_phys_gp(pch, pch_phys, snr, snr_phys, pch_pred):
    pch = pch.reshape(-1, 1)  # needed for SK learn input
    pch_phys = pch_phys.reshape(-1, 1)
    pch_pred = pch_pred.reshape(-1, 1)
    snr = snr.reshape(-1, 1)
    snr_phys = snr_phys.reshape(-1, 1)
    kernel_sk = C(1, (1e-5, 1e5)) * RBF(1, (1e-8, 1e5)) + W(1, (1e-5, 1e5))
    gpr_phys = GaussianProcessRegressor(kernel=kernel_sk,
                                        n_restarts_optimizer=20,
                                        normalize_y=True)
    gpr_phys.fit_phys(pch, pch_phys, snr, snr_phys)
    mu_sk_phys, std_sk_phys = gpr_phys.predict(pch_pred, return_std=True)
    std_sk_phys = np.reshape(std_sk_phys, (np.size(std_sk_phys), 1))
    theta_phys = gpr_phys.kernel_.theta
    lml_phys = gpr_phys.log_marginal_likelihood()
    return mu_sk_phys, std_sk_phys, theta_phys, lml_phys