Example #1
0
         (train_id[dur1:], train_id[:dur1])]

X1_prior = spatial_priors.SphericalPrior(X1train, hyparams=ratios)
X2_prior = spatial_priors.SphericalPrior(X2train, hyparams=ratios)
X3_prior = spatial_priors.SphericalPrior(X3train, hyparams=ratios)

temporal_prior = temporal_priors.SphericalPrior(delays=[0])  # no delays

# 5. [ banded ridge ] banded ridge regression _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

fit_banded_polar = models.estimate_stem_wmvnp(
    [X1train, X2train, X3train],
    Ytrain, [X1test_stim, X2test_stim, X3test_stim],
    Ytest,
    feature_priors=[X1_prior, X2_prior, X3_prior],
    temporal_prior=temporal_prior,
    ridges=alphas,
    folds=loro1,
    performance=True,
    weights=True,
    verbosity=False)

voxelwise_optimal_hyperparameters = fit_banded_polar['optima']
print('\nVoxelwise optimal hyperparameter shape: {0}'.format(
    voxelwise_optimal_hyperparameters.shape))

# Faster conversion of kernel weights to primal weights via matrix multiplication
# each vector (new_alphas, lamda_ones, lamda_twos) contains v number of entries (e.g. voxels)
new_alphas = voxelwise_optimal_hyperparameters[:, -1]
lambda_ones = voxelwise_optimal_hyperparameters[:, 1]
lambda_twos = voxelwise_optimal_hyperparameters[:, 2]
Example #2
0
def test_fullfit(n=100, p=50, population_optimal=False):
    ridges = np.logspace(-3, 3, 10)
    nridges = len(ridges)
    ndelays = 5
    delays = range(ndelays)

    oo = get_abc_data(banded=True, n=n, p=p)
    features_train, features_test, responses_train, responses_test = oo
    features_sizes = [fs.shape[1] for fs in features_train]

    hyparams = np.logspace(0, 3, 5)
    spatial_priors = [
        sps.SphericalPrior(features_sizes[0], hyparams=[1.]),
        sps.SphericalPrior(features_sizes[1], hyparams=hyparams),
        sps.SphericalPrior(features_sizes[2], hyparams=hyparams),
    ]

    temporal_prior = tps.SphericalPrior(delays)
    folds = tikutils.generate_trnval_folds(
        responses_train.shape[0],
        sampler='bcv',
        nfolds=(1, 5),
    )
    folds = list(folds)

    res = models.estimate_stem_wmvnp(
        features_train,
        responses_train,
        features_test,
        responses_test,
        ridges=ridges,
        normalize_kernel=True,
        temporal_prior=temporal_prior,
        feature_priors=spatial_priors,
        weights=True,
        performance=True,
        predictions=True,
        population_optimal=population_optimal,
        folds=(1, 5),
        method='SVD',
        verbosity=1,
        cvresults=None,
    )

    for rdx in range(responses_train.shape[-1]):
        if population_optimal:
            assert res['optima'].shape[0] == 1
            optima = res['optima'][0]
        else:
            optima = res['optima'][rdx]

        temporal_opt, spatial_opt, ridge_scale = optima[0], optima[
            1:-1], optima[-1]

        Ktrain = 0.
        Ktest = 0.
        this_temporal_prior = temporal_prior.get_prior(hhparam=temporal_opt)
        for fdx, (fs_train, fs_test, fs_prior, fs_hyper) in enumerate(
                zip(features_train, features_test, spatial_priors,
                    spatial_opt)):
            Ktrain += models.kernel_spatiotemporal_prior(
                fs_train,
                this_temporal_prior,
                fs_prior.get_prior(fs_hyper),
                delays=temporal_prior.delays)

            if fs_test is not None:
                Ktest += models.kernel_spatiotemporal_prior(
                    fs_train,
                    this_temporal_prior,
                    fs_prior.get_prior(fs_hyper),
                    delays=temporal_prior.delays,
                    Xtest=fs_test)

        if np.allclose(Ktest, 0.0):
            Ktest = None

        # solve for this response
        response_solution = models.solve_l2_dual(Ktrain,
                                                 responses_train[:, [rdx]],
                                                 Ktest=Ktest,
                                                 Ytest=responses_test[:,
                                                                      [rdx]],
                                                 ridges=[ridge_scale],
                                                 performance=True,
                                                 predictions=True,
                                                 weights=True,
                                                 verbose=1,
                                                 method='SVD')

        for k, v in response_solution.items():
            # compare each vector output
            assert np.allclose(res[k][:, rdx].squeeze(),
                               response_solution[k].squeeze())
    #         solution_svd_bandstd2tik = np.dot(Cinv, solution_svd_standard)
    #
    #         print(np.rad2deg(angle), ratio, alpha, lambda_one, lambda_two)

    # Use tikreg to find the solution
    X1_prior = spatial_priors.SphericalPrior(X1train, hyparams=ratios)
    X2_prior = spatial_priors.SphericalPrior(X2train, hyparams=ratios)
    # A temporal prior is unnecessary, so we specify no delays
    temporal_prior = temporal_priors.SphericalPrior(delays=[0])  # no delays

    fit_banded_polar = models.estimate_stem_wmvnp(
        [X1train, X2train],
        Ytrain,
        [X1test_stim, X2test_stim],
        Ytest,
        feature_priors=[X1_prior, X2_prior],
        temporal_prior=temporal_prior,
        ridges=alphas,
        folds=(1, 5),  # 1x 5-fold cross-validation
        performance=True,
        weights=True,
        verbosity=False)
    voxelwise_optimal_hyperparameters = fit_banded_polar['optima']
    print('\nVoxelwise optimal hyperparameter shape:',
          voxelwise_optimal_hyperparameters.shape)
    # kernel_weights = fit_banded_polar['weights']
    # primal_weights = []
    # for voxid, (temporal_lambda, lambda_one, lambda_two, alpha) in enumerate(voxelwise_optimal_hyperparameters):
    #     ws = np.dot(np.hstack([X1train/lambda_one**2, X2train/lambda_two**2]).T, kernel_weights[:,voxid]*alpha)
    #     primal_weights.append(ws)
    # primal_weights = np.asarray(primal_weights).T
    # print(primal_weights.shape)