Domain Generalization by Marginal Transfer Learning - Under Submission at JMLR
 
This compares marginal predictor method with pooling method.
It uses kernel approximation and then liblinear as a solver for speed up.
This code gives comparison of pooling and transfer learning for regression and binary classification. 

%% Instructions - 
1) Download liblinear library and put it in the main workspace. 
2) Compile the library from matlab folder inside it. 
3) For demo, run demo_transfer_pooling. 

%% Files
1) demo_transfer_pooling = Gives demo for both regression and binary classification
2) cross_validation_pooling_transfer = This is a main file and automatically chooses the optimization parameter plus kernel bandwidths. One can also give their own parameters. After choosing bandwiths it gives error comparison of pooling and transfer learning.
3) util_mrg_datasets = merge all datasets 
4) util_mrg_datasets_CV = merge and split training datasets into training and validation sets 
5) pooled_CV = Cross Validation for pooling method
6) transfer_CV = Cross Validation for transfer learning method
7) transfer_test_accuracy_CV = Calculates the accuracy on validtion set for transfer learning method
8) pooled_transfer_comparison = After parameters are set, this file calcualtes the actual training and test error and does comparison
9) pooled_test_accuracy = Calculates error for pooling method
10) transfer_test_accuracy = Calculates error for transfer learning method
11) synth_binary_data = synthtic data for binary classification

%% Demo 
run demo_transfer_pooling. 
This compares marginal predictor method [1] with pooling method.
It uses kernel approximation and then liblinear as a solver for speed up
input - train and test datasets = datasets in cell format.
      - datasets{i}.testx contains all features and Dataset{i}.testy
      contains all labels. Don't get mislead by testx name. It contains
      all datapoints. 
      - numberOfTrainingUser = number of datasets that are used for training
      In datasets First numberOfTrainingUser are considered as training
      datasets
      - numberOfExamplesPerTask 
      - rand_perm_test - datasets to be used as test datasets
      - task_type - it could be 'regression' or 'binary'
      - cross_val  - 1 if you want to do cross val otherwise 0
      - L,Q,D - number of random fourier features to approximate kernel
output -  res_avg_test = test error using marginal predictors method 
       - res_avg_train = train error using marginal predictors method
       - res_avg_test_pooled = test error using pooling method
       - res_avg_train_pooled = train error using pooling method
       - In case of regression - squared error 
       - In case of binary classification - % 0-1 error
Warning - THIS METHOD WORKS ONLY FOR FIVE FOLD CROSS VALIDATION. 
           SO numberOfTrainingUser SHOULD BE ONLY MULTIPLE OF 5