Symmetric CP Decomposition for Symmetric Tensors
The function cp_sym computes the symmetric CP decomposition of a symmetric tensor. A symmetric tensor is invariant under any permutation of the indices. For a general dense tensor, we can verify its symmetry via the issymmetric function. An arbitrary dense tensor can be symmetrized by the symmetrize function. A symmetric tensor can also be stored as a symtensor. The symmetric CP decomposition needs only a single factor matrix (which is reused in every mode) and a weight/sign vector. This can be stored as a symktensor object. The symmetric CP decompsition is described in the following reference:
- T. G. Kolda, Numerical Optimization for Symmetric Tensor Decomposition, Mathematical Programming B, 151:225-248, 2015, https://doi.org/10.1007/s10107-015-0895-0
Contents
Requirements
Some of these codes requires an optimizaton solver to use. We recommend installing at least one of the following:
Create a sample problem
d = 3; % order n = 10; % size r = 2; % true rank rng(5); % Set random number generator state for consistent results info = create_problem('Size', n*ones(d,1), 'Num_Factors', r, ... 'Symmetric', 1:d, 'Factor_Generator', @rand, 'Lambda_Generator', @rand, 'Noise', 0.1); X = info.Data; M_true = info.Soln; S_true = symktensor(M_true); % Convert from ktensor to symktensor
Check that the tensor is symmetric
issymmetric(X)
ans = logical 1
With even a small amount of noise, the gradient at the ideal solution can actually be large. This should be kept in mind when setting optimization termination conditions.
[f,g] = fg_explicit(S_true, X, norm(X)^2); fprintf('Relative error || full(S_true) - X || / || X ||: %g\n', norm(full(M_true)-X)/norm(X)); fprintf('Function value at true solution: %g\n', f); fprintf('Gradient norm at true solution: %g\n', norm(g));
Relative error || full(S_true) - X || / || X ||: 0.0997308 Function value at true solution: 0.379907 Gradient norm at true solution: 1.06846
Run CP-SYM using L-BFGS from Poblano Toolbox
The default cp_sym uses a special objective function where each unique entry is only counted once in the sum-of-squared-error objective function. This really slows things down without much impact, so it's a good idea to set 'unique' to false. Likewise, the 'l1param' defaults to 10 but should be set to 0 for most problems. This is the recommended way to run the method:
optparams = lbfgs('defaults'); % Get the optimization parameters optparams.RelFuncTol = 1e-10; % Tighten the stopping tolerance optparams.StopTol = 1e-6; % Tighten the stopping tolerance rng(5); % Set random number generator state for consistent results [S,info] = cp_sym(X,r,'unique',false,'l1param',0,'alg_options',optparams); fprintf('\n'); fprintf('Final function value: %.2g\n', fg_explicit(S, X, norm(X)^2)); fprintf('Stopping condition: %s\n', info.optout.ExitDescription); fprintf('Check similarity score (1=perfect): %.2f\n', score(S,S_true)); fprintf('\n');
Iter FuncEvals F(X) ||G(X)||/N
------ --------- ---------------- ----------------
0 1 7.34429496 3.10499258
1 8 0.40258352 0.08233575
2 10 0.37608104 0.04310174
3 12 0.36658247 0.01555076
4 14 0.36528638 0.00530333
5 16 0.36488180 0.00311884
6 18 0.36484022 0.00174885
7 21 0.36477178 0.00360656
8 23 0.36472681 0.00208400
9 26 0.36467068 0.00313366
10 28 0.36461167 0.00116220
11 30 0.36460241 0.00025735
12 32 0.36460199 0.00012652
13 34 0.36460188 0.00014958
14 36 0.36460181 0.00004645
15 38 0.36460180 0.00000968
16 40 0.36460180 0.00000896
17 42 0.36460180 0.00000387
18 44 0.36460180 0.00000214
19 46 0.36460180 0.00000117
Final function value: 0.36
Stopping condition: Relative change in F < RelFuncTol
Check similarity score (1=perfect): 0.99
Run CP-SYM using FMINCON from Optimization Toolbox
We can also run a version with nonnegativity constraints. In this case, we want to remove lambda from the optimization because otherwise there will be a scaling ambiguity. We need to use FMINCON because it accepts constraints.
rng(5); % Set random number generator state for consistent results [S,info] = cp_sym(X,r,'unique',false,'l1param',0,'nonneg',true,'nolambda',true,'alg','fmincon'); fprintf('\n'); fprintf('Final function value: %.2g\n', fg_explicit(S, X, norm(X)^2)); fprintf('Check similarity score (1=perfect): %.2f\n', score(S,S_true)); %fprintf('Stopping condition: %s\n', info.optout.message); fprintf('\n');
First-order Norm of
Iter F-count f(x) Feasibility optimality step
0 1 7.344295e+00 0.000e+00 1.083e+01
1 4 3.436772e+00 0.000e+00 2.409e+01 5.062e-01
2 5 2.263213e+00 0.000e+00 1.100e+01 3.203e-01
3 8 2.234300e+00 0.000e+00 9.444e+00 3.504e-01
4 12 1.839139e+00 0.000e+00 5.815e+00 1.416e-01
5 15 4.820525e-01 0.000e+00 3.146e+00 1.588e-01
6 18 4.694919e-01 0.000e+00 2.648e+00 9.253e-02
7 21 4.048671e-01 0.000e+00 1.957e+00 7.309e-02
8 25 4.146153e-01 0.000e+00 1.602e+00 4.574e-02
9 29 4.155776e-01 0.000e+00 1.366e+00 2.359e-02
10 32 4.093077e-01 0.000e+00 1.198e+00 3.531e-02
11 35 3.887468e-01 0.000e+00 5.824e-01 2.213e-02
12 39 3.899451e-01 0.000e+00 6.062e-01 1.360e-02
13 43 3.900105e-01 0.000e+00 4.950e-01 9.302e-03
14 45 3.925853e-01 0.000e+00 2.848e-01 2.235e-02
15 49 3.935844e-01 0.000e+00 2.627e-01 6.053e-03
16 51 3.938832e-01 0.000e+00 1.700e-01 1.382e-02
17 54 3.894562e-01 0.000e+00 1.524e-01 8.280e-03
18 58 3.895712e-01 0.000e+00 1.459e-01 2.473e-03
19 61 3.914050e-01 0.000e+00 1.344e-01 4.341e-03
20 63 3.784584e-01 0.000e+00 5.684e-01 3.939e-02
21 66 3.685269e-01 0.000e+00 5.085e-01 3.048e-02
22 70 3.652146e-01 0.000e+00 5.221e-01 2.030e-02
23 72 3.658792e-01 0.000e+00 2.656e-01 1.457e-02
24 75 3.666182e-01 0.000e+00 1.041e-01 9.337e-03
25 77 3.665715e-01 0.000e+00 4.623e-02 5.424e-03
26 79 3.661260e-01 0.000e+00 4.772e-02 5.769e-03
27 81 3.659356e-01 0.000e+00 5.116e-02 4.427e-03
28 83 3.661514e-01 0.000e+00 2.088e-02 2.802e-03
29 85 3.654314e-01 0.000e+00 8.162e-02 1.306e-02
30 87 3.649481e-01 0.000e+00 1.453e-01 2.118e-02
First-order Norm of
Iter F-count f(x) Feasibility optimality step
31 88 3.646972e-01 0.000e+00 1.482e-02 1.440e-02
32 90 3.646946e-01 0.000e+00 7.036e-03 2.067e-03
33 93 3.646966e-01 0.000e+00 8.418e-03 2.123e-03
34 94 3.646841e-01 0.000e+00 4.000e-03 6.961e-04
35 95 3.646086e-01 0.000e+00 3.484e-03 4.203e-03
36 96 3.646061e-01 0.000e+00 2.228e-03 9.426e-04
37 97 3.646052e-01 0.000e+00 8.000e-04 8.338e-04
38 98 3.646020e-01 0.000e+00 2.946e-04 1.100e-03
39 99 3.646019e-01 0.000e+00 1.600e-04 7.326e-05
40 100 3.646018e-01 0.000e+00 4.683e-05 3.008e-04
41 101 3.646018e-01 0.000e+00 4.104e-06 3.462e-06
42 102 3.646018e-01 0.000e+00 1.600e-06 4.315e-07
43 103 3.646018e-01 0.000e+00 3.200e-07 2.429e-06
44 104 3.646018e-01 0.000e+00 1.472e-08 6.060e-07
Local minimum possible. Constraints satisfied.
fmincon stopped because the size of the current step is less than
the default value of the step size tolerance and constraints are
satisfied to within the default value of the constraint tolerance.
Final function value: 0.36
Check similarity score (1=perfect): 0.99
