├── README.md └── mdr_tcca.m /README.md: -------------------------------------------------------------------------------- 1 | # Multi-view dimensionality reduction using tensor canonical correlation analysis 2 | 3 | MATLAB implementation of multi-view dimensionality reduction using Tensor Canonical Correlation Analysis, presented by Luo et al. in https://arxiv.org/pdf/1502.02330.pdf 4 | -------------------------------------------------------------------------------- /mdr_tcca.m: -------------------------------------------------------------------------------- 1 | % mdr_tcca - MATLAB implementation of multi-view dimensionality reduction using 2 | % Tensor Canonical Correlation Analysis, presented by Luo et al. in 3 | % https://arxiv.org/pdf/1502.02330.pdf 4 | % 5 | % Syntax: [reduction] = mdr_tcca(views,d,epsilon) 6 | % 7 | % Inputs: 8 | % views - Cell array of NxM matrices 9 | % d - Final dimensionality 10 | % epsilon - Regularization trade-off factor, non-negative. 11 | % maxiters - Maximum number of ALS iterations in CP decomposition 12 | % verbosity - Fit error verbosity. If zero no info is printed, 13 | % otherwise info is printed every n iterations. 14 | % 15 | % Outputs: 16 | % reduction - Multi-view dimensionality reduction 17 | % f - Factorization as ktensor 18 | % 19 | % Example: 20 | % mvdr_tcca({first_view, second_view}) 21 | % 22 | % Requires: Tensor Toolbox for MATLAB by Sandia National Labs. 23 | % https://gitlab.com/tensors/tensor_toolbox 24 | % 25 | % Author: Robert Ciszek 26 | % July 2016; Last revision: 24-June-2017 27 | 28 | function [Z,f] = mdr_tcca(views,varargin) 29 | %Parse inputs 30 | params = inputParser; 31 | params.addRequired('views',@iscell); 32 | params.addParameter('d',2,@(x) isscalar(x) & x > 0); 33 | params.addParameter('epsilon',1,@(x) isscalar(x) & x > 0); 34 | params.addParameter('maxiters', 50,@(x) isscalar(x) & x > 0); 35 | params.addParameter('verbosity', 1,@(x) isscalar(x)); 36 | 37 | params.parse(views,varargin{:}); 38 | 39 | views = params.Results.views; 40 | d = params.Results.d; 41 | epsilon = params.Results.epsilon; 42 | maxiters = params.Results.maxiters; 43 | verbosity = params.Results.verbosity; 44 | 45 | 46 | %All views are assumed to contain equal number of samples 47 | n_samples = size(views{1},1); 48 | n_views = length(views); 49 | 50 | %Center each view 51 | for i=1:n_views 52 | views{i} = tensor(views{i} - repmat(mean(views{i} ), n_samples,1)); 53 | end 54 | 55 | %Calculate variances 56 | variances = cell(size(views)); 57 | for i=1:n_views 58 | variances{i} = (double(views{i})'*double(views{i}))/n_samples; 59 | variances{i} = variances{i} + epsilon*ones(size(variances{i})); 60 | end 61 | %Calculate covariances 62 | covariances = []; 63 | for i=1:n_samples 64 | outer_product = views{1}(i,:); 65 | for j=2:length(views) 66 | outer_product = ttt(outer_product,views{j}(i,:)); 67 | end 68 | if isempty(covariances) 69 | covariances = outer_product; 70 | else 71 | covariances = covariances+outer_product; 72 | end 73 | end 74 | covariances = covariances / n_samples; 75 | 76 | M = covariances; 77 | for i=1:length(variances) 78 | M = ttm(M,pinv(variances{i})^1/2,i); 79 | end 80 | 81 | f = cp_als(M,d,'maxiters',maxiters,'printitn',verbosity); 82 | Z = zeros(n_samples,d*2); 83 | for i=1:n_views 84 | Z(:,(1+(i-1)*d):(i*d)) = double(views{i})*(pinv(variances{i})^1/2)*f.U{i}; 85 | end 86 | 87 | end 88 | --------------------------------------------------------------------------------