Multi-matrix Principle Component Analysis Example
This example uses the convex-concave procedure to solve a multi-matrix principle component analysis problem. That is find the directions that maximize the minimum variance across a set of matrices.
Details can be found in section 5.4 of Variations and Extension of the Convex-Concave Procedure.
This example uses CVX, which is available here. You can download the code mmpca_example.m along with the subroutine solve_mmpca.m.
Contents
clear all close all
Problem generation parameters
p = 3; % number of matrices n = 10; % size of matrices m = 4; % number of principle components sigma_var = 1; % how much to vary the diagonal entries up to +/-sigma_var/2 delta_var = 1; % how much to vary the off diagonal entries up to+/- delta_var/2 rand('state',0);
Algorithm parameters
tau_0 = .5; tau_inc = 1.05; tau_max = 1e4; trials = 5;
Problem generation
% construct a base case temp1 = orth(rand(n)); Base = temp1*diag(rand(n,1))*temp1'; sigma_var = 1; delta_var = 1; lambda = zeros(p,1); % perturb the matrix for i = 1:p while(true) pert = delta_var*2*rand(n)+(1-delta_var); pert = (pert+pert')/2; pert(1:n:end) = sigma_var*rand(n,1)+(1-sigma_var/2); Sigma(:,:,i) = Base.*pert; % make sure the matrix stays positive definite if(min(eig(Sigma(:,:,i))) >= .001) break; end end end
Calculate baseline
% calculate the value from taking the best result from peforming PCA on % each matrix individually Mins = zeros(p,1); for i = 1:p [U S V] = svd(Sigma(:,:,i)); X_test = U(:,1:m); Mins(i) = trace(X_test'*Sigma(:,:,i)*X_test); end % calculate the value by performing PCA on the average Sigma_sum = zeros(n,n); avg_obj = zeros(p,1); for i = 1:p Sigma_sum = Sigma_sum+Sigma(:,:,i); end Sigma_sum = Sigma_sum./p; [U S V] = svd(Sigma_sum); X_guess = U(:,1:m); for j = 1:p avg_obj(j) = trace(X_guess'*Sigma(:,:,j)*X_guess); end % give the best value found (which is a lower bound, and an upper bound on % the best possible value. fprintf('The best known value is %.4f.\nAn upper bound on the optimal value is %.4f.\n',max(min(avg_obj)),min(Mins));
The best known value is 2.7870. An upper bound on the optimal value is 3.1881.
Convex-concave procedure
% use average PCA to initialize result_avg = solve_mmpca(Sigma, m, X_guess, tau_0, tau_inc, tau_max); fprintf('Using the average PCA initialization found a value of %.4f.\n',result_avg); % use random initializaiton result_best = 0; for trial = 1:trials X_c = rand(n,m); result = solve_mmpca(Sigma, m, X_c, tau_0, tau_inc, tau_max); if(result > result_best) result_best = result; end end fprintf('After %d random initializations, a value of %.4f was found.\n',trial, result_best);
Using the average PCA initialization found a value of 2.9600. After 5 random initializations, a value of 2.9428 was found.