# Alternating Poisson Regression for fitting CP to sparse count data

Reference: E. C. Chi, T. G. Kolda, On Tensors, Sparsity, and Nonnegative Factorizations, SIAM J. Matrix Analysis and Applications, 33:1272-1299, 2012, https://doi.org/10.1137/110859063.

## Set up a sample problem

We follow the general procedure outlined by Chi and Kolda (2013).

```% Pick the size and rank
sz = [100 80 60];
R = 5;

% Generate factor matrices with a few large entries in each column; this
% will be the basis of our soln.
A = cell(3,1);
for n = 1:length(sz)
A{n} = rand(sz(n), R);
for r = 1:R
p = randperm(sz(n));
nbig = round( (1/R)*sz(n) );
A{n}(p(1:nbig),r) = 100 * A{n}(p(1:nbig),r);
end
end
lambda = rand(R,1);
S = ktensor(lambda, A);
S = normalize(S,'sort',1);

% Create sparse test problem based on provided solution.
nz = prod(sz) * .05;
info = create_problem('Soln', S, 'Sparse_Generation', nz);

% Extract data and solution
X = info.Data;
M_true = info.Soln;
```

## Call CP-APR

```% Compute a solution
M = cp_apr(X, R, 'printitn', 10);

% Score the solution
factor_match_score = score(M, M_true, 'greedy', true)
```
```CP_PQNR (alternating Poisson regression using quasi-Newton)
Precomputing sparse index sets...done
10. Ttl Inner Its: 1842, KKT viol = 2.47e-01, obj = 1.93755689e+04, nz: 311
20. Ttl Inner Its: 397, KKT viol = 1.82e-02, obj = 1.54718147e+04, nz: 292
30. Ttl Inner Its: 253, KKT viol = 1.07e-03, obj = 1.54718106e+04, nz: 292
===========================================
Final log-likelihood = -1.547181e+04
Final least squares fit = 5.257318e-01
Final KKT violation = 9.6665420e-05
Total inner iterations = 39776
Total execution time = 10.28 secs
factor_match_score =
0.9884
```