├── LICENSE
├── README.md
├── TC_FISTA.py
├── TC_FISTA_EEG_pretrained.ipynb
├── TC_FISTA_example.ipynb
├── data
├── D.npy
├── Z_channel.npy
├── Z_freq.npy
└── Z_time.npy
├── illustration_optim_process.ipynb
├── outputs_eeg
├── atom_active_0_.pdf
├── atom_active_0_.png
├── atom_active_1_.pdf
├── atom_active_2_.pdf
└── atom_active_3_.pdf
└── requirements.txt
/LICENSE:
--------------------------------------------------------------------------------
1 | BSD 3-Clause License
2 |
3 | Copyright (c) 2020, Pierre Humbert
4 | All rights reserved.
5 |
6 | Redistribution and use in source and binary forms, with or without
7 | modification, are permitted provided that the following conditions are met:
8 |
9 | 1. Redistributions of source code must retain the above copyright notice, this
10 | list of conditions and the following disclaimer.
11 |
12 | 2. Redistributions in binary form must reproduce the above copyright notice,
13 | this list of conditions and the following disclaimer in the documentation
14 | and/or other materials provided with the distribution.
15 |
16 | 3. Neither the name of the copyright holder nor the names of its
17 | contributors may be used to endorse or promote products derived from
18 | this software without specific prior written permission.
19 |
20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # T-ConvFISTA algorithm
2 |
3 | Code of the T-ConvFISTA (TC-FISTA) algorithm.
4 |
5 | In addition, we provide a pretrained model on the Electroencephalogram signals (EEG) of the paper.
6 |
7 | ## Related paper:
8 |
9 | [Tensor Convolutional Dictionary Learning with CP Low-Rank activations.](https://ieeexplore.ieee.org/abstract/document/9652115)
10 | P. Humbert, L. Oudre, N. Vayatis, J, Audiffren. In IEEE Transactions on Signal Processing, 2021.
11 |
12 | ## Container
13 |
14 | ##### -- Notebooks --
15 | The reposity contains the code of TC-FISTA and three notebooks:
16 |
17 | 1) One for synthetic data
18 | 2) One to visualize the pretrained model of the EEG application of the paper
19 | 3) One to empirically check the validity of the different proofs in the paper
20 |
21 | ##### -- Data --
22 | The folder 'data' contains all nescessary files to visualize results on EEG.
23 |
24 | One example of learnt atom with its (CP)-Low-Rank activations:
25 |
26 |
27 |
28 | ## Requirements
29 |
30 | This code runs on Python >= 3.5. Set up environment with:
31 | ```
32 | pip install -r requirements.txt
33 | ```
34 |
--------------------------------------------------------------------------------
/TC_FISTA.py:
--------------------------------------------------------------------------------
1 |
2 | import numpy as np
3 | from tensorly.tenalg import khatri_rao
4 | from sporco.linalg import fftn, ifftn
5 | from scipy.sparse import csr_matrix, hstack, kron, identity
6 | import time
7 |
8 |
9 | def T_ConvFISTA_precompute(Gram, Achapy, Z_init, L, lbd, beta, maxit, tol=1e-5, verbose=False):
10 | """ Minimization of the sub-block of Z
11 |
12 | Gram: Gram matrix
13 | Achapy: vector A * y
14 | Z_init: initialization
15 | L: Lipschitz constant
16 | lbd, beta: hyerparameters
17 |
18 | """
19 |
20 | K, N_i, R = Z_init.shape
21 |
22 | pobj = []
23 | time0 = time.time()
24 |
25 | Zpred = Z_init.copy()
26 | Xfista = Z_init.copy()
27 | t = 1
28 | ite = 0.
29 | tol_it = tol + 1.
30 | while (tol_it > tol) and (ite < maxit):
31 | if verbose:
32 | print(ite)
33 |
34 | Zpred_old = Zpred.copy()
35 |
36 | # DFT of the activations
37 | Xfistachap = fftn(Xfista, axes=[1])
38 |
39 | # Vectorization
40 | xfistachap = np.reshape(Xfistachap, (K, N_i * R), order='F').ravel()
41 |
42 | # Computation of the gradient
43 | gradf = (Gram.dot(xfistachap) - Achapy) + 2 * beta * xfistachap
44 |
45 | # Descent step
46 | xfistachap = np.array(xfistachap - gradf / L)
47 |
48 | # Matricization
49 | Xfistachap = xfistachap.reshape(
50 | K, N_i * R).reshape((K, N_i, R), order='F')
51 |
52 | # IDFT of the activations
53 | Xfista = np.real(ifftn(Xfistachap, axes=[1]))
54 |
55 | # Soft-thresholding
56 | Zpred = np.sign(Xfista) * np.fmax(abs(Xfista) - lbd / L, 0.)
57 |
58 | # Nesterov Momentum
59 | t0 = t
60 | t = (1. + np.sqrt(1. + 4. * t ** 2)) / 2.
61 | Xfista = Zpred + ((t0 - 1.) / t) * (Zpred - Zpred_old)
62 |
63 | # Stopping criterion
64 | tol_it = np.max(abs(Zpred_old - Zpred))
65 | this_pobj = tol_it.copy()
66 |
67 | ite += 1
68 | pobj.append((time.time() - time0, this_pobj))
69 |
70 | print('last iteration:', ite)
71 | times, pobj = map(np.array, zip(*pobj))
72 | return Zpred, times, pobj
73 |
74 |
75 | def square_mat_csr(X):
76 | squared_X = X.copy()
77 | # now square the data in squared_X
78 | squared_X.data *= squared_X.data.conj()
79 | # and delete the squared_X:
80 | return(np.real(squared_X.sum()))
81 |
82 |
83 | def f_Achap(M, Zchap, ZZchap, dchap, N, K):
84 | """ Computation of the matrix (A 'kron' I) """
85 |
86 | L = 0. # norm of the matrix
87 | Achap = []
88 | for k in range(K):
89 | Bchap_k = kron(csr_matrix(khatri_rao(
90 | (Zchap[k], ZZchap[k]))).dot(M[k]), identity(N))
91 | Asparse = csr_matrix.multiply(csr_matrix(
92 | dchap[k][:, None]), Bchap_k) # fast diag product
93 | Achap.append(Asparse)
94 |
95 | L += square_mat_csr(Asparse)
96 | return hstack(Achap), L
97 |
98 |
99 | def rmse(predictions, targets):
100 | return np.sqrt(((predictions - targets) ** 2).mean())
101 |
102 |
103 | def consistency_on_rank(Z1, Z2, Z3, thr=0.):
104 | K, _, R = Z1.shape
105 | Z1_copy = Z1.copy()
106 | Z2_copy = Z2.copy()
107 | Z3_copy = Z3.copy()
108 | for k in range(K):
109 | for r in range(R):
110 | if np.linalg.norm(abs(Z1_copy)[k, :, r]) <= thr:
111 | Z2_copy[k, :, r] *= 0.
112 | Z3_copy[k, :, r] *= 0.
113 |
114 | if np.linalg.norm(abs(Z2_copy)[k, :, r]) <= thr:
115 | Z1_copy[k, :, r] *= 0.
116 | Z3_copy[k, :, r] *= 0.
117 |
118 | if np.linalg.norm(abs(Z3_copy)[k, :, r]) <= thr:
119 | Z1_copy[k, :, r] *= 0.
120 | Z2_copy[k, :, r] *= 0.
121 | return Z1_copy, Z2_copy, Z3_copy
122 |
123 |
124 | def moving_average(a, n=100):
125 | ret = np.cumsum(a, dtype=float)
126 | ret[n:] = ret[n:] - ret[:-n]
127 | return ret[n - 1:] / n
128 |
129 | # Specific ordering of the indexes during the vectorization
130 |
131 |
132 | def unfold(tensor, mode, order='F'):
133 | return np.reshape(np.moveaxis(tensor, mode, 0), (tensor.shape[mode], -1), order=order)
134 |
135 |
136 | def ravel(X, order='F'):
137 | return np.ravel(X, order=order)
138 |
--------------------------------------------------------------------------------
/TC_FISTA_example.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stderr",
10 | "output_type": "stream",
11 | "text": [
12 | "Using numpy backend.\n"
13 | ]
14 | }
15 | ],
16 | "source": [
17 | "import numpy as np\n",
18 | "from tensorly import kruskal_to_tensor, kron\n",
19 | "from tensorly.tenalg import khatri_rao\n",
20 | "from sporco.linalg import fftconv, fftn, ifftn\n",
21 | "from sporco.metric import snr\n",
22 | "from scipy import linalg\n",
23 | "from scipy.sparse import csr_matrix, hstack, kron, identity, diags\n",
24 | "from scipy.sparse.linalg import eigsh\n",
25 | "import time\n",
26 | "\n",
27 | "from TC_FISTA import *\n",
28 | "\n",
29 | "import matplotlib.pyplot as plt"
30 | ]
31 | },
32 | {
33 | "cell_type": "code",
34 | "execution_count": 2,
35 | "metadata": {},
36 | "outputs": [],
37 | "source": [
38 | "# SIZE of the input signal Y\n",
39 | "N1 = 50\n",
40 | "N2 = 50\n",
41 | "N3 = 50\n",
42 | "N = np.prod((N1, N2, N3))\n",
43 | "\n",
44 | "R = 2\n",
45 | "W1 = 5\n",
46 | "W2 = 5\n",
47 | "W3 = 5\n",
48 | "K = 3"
49 | ]
50 | },
51 | {
52 | "cell_type": "code",
53 | "execution_count": 3,
54 | "metadata": {},
55 | "outputs": [
56 | {
57 | "name": "stdout",
58 | "output_type": "stream",
59 | "text": [
60 | "snr 9.520294703040339 9.979258206555139\n"
61 | ]
62 | }
63 | ],
64 | "source": [
65 | "# Generate signal Y\n",
66 | "np.random.seed(1234)\n",
67 | "\n",
68 | "D = np.random.uniform(-1, 1, size=(K, W1, W2, W3))\n",
69 | "for k in range(K):\n",
70 | " D[k] /= max(np.linalg.norm(D[k]), 1)\n",
71 | "Dtrue = D.copy()\n",
72 | "\n",
73 | "Z1 = np.random.uniform(-1, 1, size=(K, N1, R))*np.random.binomial(1, .2, size=(K, N1, R))\n",
74 | "Z2 = np.random.uniform(-1, 1, size=(K, N2, R))*np.random.binomial(1, .2, size=(K, N2, R))\n",
75 | "Z3 = np.random.uniform(-1, 1, size=(K, N3, R))*np.random.binomial(1, .2, size=(K, N3, R))\n",
76 | "\n",
77 | "Z = np.zeros((K, N1, N2, N3))\n",
78 | "for k in range(K):\n",
79 | " Z[k] = kruskal_to_tensor((Z1[k], Z2[k], Z3[k]))\n",
80 | " \n",
81 | "Y = fftconv(D[0], Z[0], axes=(0, 1, 2))\n",
82 | "for k in range(1, K):\n",
83 | " Y += fftconv(D[k], Z[k], axes=(0, 1, 2))\n",
84 | "\n",
85 | "Ytrue = np.array(Y)\n",
86 | "Y += np.random.normal(0, 0.015, size=(N1, N2, N3)) # noisy version\n",
87 | "\n",
88 | "print('snr', snr(Ytrue, Y), snr(Y, Ytrue))"
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": 4,
94 | "metadata": {},
95 | "outputs": [],
96 | "source": [
97 | "# Precomputation of the DFT of Y\n",
98 | "Ychap = fftn(Y)\n",
99 | "Ychap1 = unfold(Ychap, 0)\n",
100 | "Ychap2 = unfold(Ychap, 1)\n",
101 | "Ychap3 = unfold(Ychap, 2)\n",
102 | "\n",
103 | "ychap1 = ravel(unfold(Ychap, 0))\n",
104 | "ychap2 = ravel(unfold(Ychap, 1))\n",
105 | "ychap3 = ravel(unfold(Ychap, 2))\n",
106 | "\n",
107 | "Ydico = np.array(Y.reshape(N1, N2, N3, 1, 1)) # To fit the 'Sporco' standard"
108 | ]
109 | },
110 | {
111 | "cell_type": "code",
112 | "execution_count": 5,
113 | "metadata": {},
114 | "outputs": [
115 | {
116 | "data": {
117 | "text/plain": [
118 | "Text(0.5, 1.0, 'activation')"
119 | ]
120 | },
121 | "execution_count": 5,
122 | "metadata": {},
123 | "output_type": "execute_result"
124 | },
125 | {
126 | "data": {
127 | "image/png": "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\n",
128 | "text/plain": [
129 | ""
130 | ]
131 | },
132 | "metadata": {
133 | "needs_background": "light"
134 | },
135 | "output_type": "display_data"
136 | }
137 | ],
138 | "source": [
139 | "plt.figure(figsize=(10, 5))\n",
140 | "plt.subplot(131)\n",
141 | "plt.imshow(Y[0])\n",
142 | "plt.title('Y + noise')\n",
143 | "\n",
144 | "plt.subplot(132)\n",
145 | "plt.imshow(Ytrue[0])\n",
146 | "plt.title('Y')\n",
147 | "\n",
148 | "plt.subplot(133)\n",
149 | "plt.imshow(Z[1, 0])\n",
150 | "plt.title('activation')"
151 | ]
152 | },
153 | {
154 | "cell_type": "code",
155 | "execution_count": 6,
156 | "metadata": {},
157 | "outputs": [
158 | {
159 | "data": {
160 | "image/png": "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\n",
161 | "text/plain": [
162 | ""
163 | ]
164 | },
165 | "metadata": {
166 | "needs_background": "light"
167 | },
168 | "output_type": "display_data"
169 | }
170 | ],
171 | "source": [
172 | "plt.figure(figsize=(12, 3))\n",
173 | "plt.subplot(121)\n",
174 | "plt.plot(Y[0, 0])\n",
175 | "plt.plot(Ytrue[0, 0])\n",
176 | "plt.title('tube: (Y + noise) and Y')\n",
177 | "plt.grid(alpha=.3)"
178 | ]
179 | },
180 | {
181 | "cell_type": "code",
182 | "execution_count": 7,
183 | "metadata": {},
184 | "outputs": [],
185 | "source": [
186 | "# parameters of T-ConvFISTA\n",
187 | "\n",
188 | "#=============== Full-loop\n",
189 | "maxit_loop = 40\n",
190 | "tol_loop = 0.0001\n",
191 | "#=============== Z-step\n",
192 | "maxit = 10000\n",
193 | "Rpred = 2\n",
194 | "\n",
195 | "rt = 300\n",
196 | "lbd1 = .001\n",
197 | "lbd2 = lbd1\n",
198 | "lbd3 = lbd1\n",
199 | "\n",
200 | "beta1 = .01\n",
201 | "beta2 = beta1\n",
202 | "beta3 = beta1\n",
203 | "\n",
204 | "tol = 1e-11\n",
205 | "\n",
206 | "#=============== D-step\n",
207 | "maxit_d = 300"
208 | ]
209 | },
210 | {
211 | "cell_type": "code",
212 | "execution_count": 8,
213 | "metadata": {},
214 | "outputs": [],
215 | "source": [
216 | "# Initial dictionary and precomputation of the DFT\n",
217 | "np.random.seed(123)\n",
218 | "D = np.random.uniform(-10000, 10000, size=(K, W1, W2, W3))/10\n",
219 | "for k in range(K):\n",
220 | " D[k] /= max(np.linalg.norm(D[k]), 1)\n",
221 | "\n",
222 | "Dchap = np.zeros((K, N1, N2, N3), dtype=np.complex)\n",
223 | "Dchap1 = np.zeros((K, N1, N2*N3), dtype=np.complex)\n",
224 | "Dchap2 = np.zeros((K, N2, N1*N3), dtype=np.complex)\n",
225 | "Dchap3 = np.zeros((K, N3, N1*N2), dtype=np.complex)\n",
226 | "\n",
227 | "dchap1 = np.zeros((K, N), dtype=np.complex)\n",
228 | "dchap2 = np.zeros((K, N), dtype=np.complex)\n",
229 | "dchap3 = np.zeros((K, N), dtype=np.complex)\n",
230 | "\n",
231 | "dchapconj1 = np.zeros((K, N), dtype=np.complex)\n",
232 | "dchapconj2 = np.zeros((K, N), dtype=np.complex)\n",
233 | "dchapconj3 = np.zeros((K, N), dtype=np.complex)\n",
234 | "\n",
235 | "for k in range(K):\n",
236 | " DD = np.zeros((N1, N2, N3)) # padding\n",
237 | " DD[:W1, :W2, :W3] = D[k]\n",
238 | " DDchap = fftn(DD)\n",
239 | "\n",
240 | " Dchap[k] = DDchap\n",
241 | " Dchap1[k] = unfold(DDchap, 0)\n",
242 | " Dchap2[k] = unfold(DDchap, 1)\n",
243 | " Dchap3[k] = unfold(DDchap, 2)\n",
244 | "\n",
245 | " dchap1[k] = ravel(unfold(Dchap[k], 0))\n",
246 | " dchap2[k] = ravel(unfold(Dchap[k], 1))\n",
247 | " dchap3[k] = ravel(unfold(Dchap[k], 2))\n",
248 | "\n",
249 | " dchapconj1[k] = ravel(unfold(Dchap[k].conj(), 0))\n",
250 | " dchapconj2[k] = ravel(unfold(Dchap[k].conj(), 1))\n",
251 | " dchapconj3[k] = ravel(unfold(Dchap[k].conj(), 2))\n",
252 | " \n",
253 | "# Initialization of Sporco for the dictionary learning part\n",
254 | "Dstart = np.zeros((N1, N2, N3, 1, 1, K))\n",
255 | "Dstart_0 = np.zeros((W1, W2, W3, K))\n",
256 | "for k in range(K):\n",
257 | " Dstart[:W1, :W2, :W3, 0, 0, k] = np.array(D[k])\n",
258 | " Dstart_0[:, :, :, k] = np.array(D[k])\n",
259 | "\n",
260 | "# Setup of sporco\n",
261 | "from sporco.admm import ccmod\n",
262 | "opt_ccmod = ccmod.ConvCnstrMOD_IterSM.Options({'Verbose': False, 'MaxMainIter': maxit_d, 'AbsStopTol':1e-12, 'ZeroMean': False,\n",
263 | " 'Y0': Dstart, 'U0': np.zeros((N1, N2, N3, 1, 1, K)),\n",
264 | " 'AutoRho':{'Enabled':True}})"
265 | ]
266 | },
267 | {
268 | "cell_type": "code",
269 | "execution_count": 9,
270 | "metadata": {},
271 | "outputs": [],
272 | "source": [
273 | "# Initial activation\n",
274 | "np.random.seed(12345)\n",
275 | "Z1init = np.random.normal(0, 10, size=(K, N1, Rpred))\n",
276 | "Z2init = np.random.normal(0, 10, size=(K, N2, Rpred))\n",
277 | "Z3init = np.random.normal(0, 10, size=(K, N3, Rpred))\n",
278 | "\n",
279 | "Z1pred_fista = Z1init; z1pred = ravel(Z1pred_fista)\n",
280 | "Z1chappred = fftn(Z1pred_fista, axes=[1])\n",
281 | "\n",
282 | "Z2pred_fista = Z2init; z2pred = ravel(Z2pred_fista)\n",
283 | "Z2chappred = fftn(Z2pred_fista, axes=[1])\n",
284 | "\n",
285 | "Z3pred_fista = Z3init; z3pred = ravel(Z3pred_fista)\n",
286 | "Z3chappred = fftn(Z3pred_fista, axes=[1])\n",
287 | "\n",
288 | "Zfullpred = np.zeros((K, N1, N2, N3))\n",
289 | "for k in range(K):\n",
290 | " Zfullpred[k] = kruskal_to_tensor((Z1init[k], Z2init[k], Z3init[k]))\n",
291 | "\n",
292 | "M = []\n",
293 | "for k in range(K):\n",
294 | " M.append(identity(Rpred))\n",
295 | "\n",
296 | "Ypred = fftconv(D[0], Zfullpred[0], axes=(0, 1, 2))\n",
297 | "for k in range(1, K):\n",
298 | " Ypred += fftconv(D[k], Zfullpred[k], axes=(0, 1, 2))"
299 | ]
300 | },
301 | {
302 | "cell_type": "code",
303 | "execution_count": 10,
304 | "metadata": {},
305 | "outputs": [
306 | {
307 | "name": "stdout",
308 | "output_type": "stream",
309 | "text": [
310 | "last iteration: 104.0\n",
311 | "last iteration: 114.0\n",
312 | "last iteration: 182.0\n",
313 | "rmse: 0.04279550806802047 0.026861088411603774\n",
314 | "sparse 356965 95.19066666666667\n",
315 | "relTol: 2591384605.098731\n",
316 | "last iteration: 109.0\n",
317 | "last iteration: 1452.0\n",
318 | "last iteration: 387.0\n",
319 | "rmse: 0.036933533857421486 0.028464862720368533\n",
320 | "sparse 201114 53.6304\n",
321 | "relTol: 0.29113341418368205\n",
322 | "last iteration: 104.0\n",
323 | "last iteration: 415.0\n",
324 | "last iteration: 417.0\n",
325 | "rmse: 0.03448592263885061 0.02957783109573328\n",
326 | "sparse 182349 48.6264\n",
327 | "relTol: 0.12121778721213636\n",
328 | "last iteration: 86.0\n",
329 | "last iteration: 422.0\n",
330 | "last iteration: 382.0\n",
331 | "rmse: 0.03346644693462628 0.030204091026781205\n",
332 | "sparse 167160 44.576\n",
333 | "relTol: 0.05161368030530451\n",
334 | "last iteration: 80.0\n",
335 | "last iteration: 544.0\n",
336 | "last iteration: 336.0\n",
337 | "rmse: 0.03290447051608061 0.030583930863763552\n",
338 | "sparse 135702 36.1872\n",
339 | "relTol: 0.028517929036292956\n",
340 | "last iteration: 82.0\n",
341 | "last iteration: 398.0\n",
342 | "last iteration: 380.0\n",
343 | "rmse: 0.032270771633858095 0.030882625081656484\n",
344 | "sparse 116043 30.9448\n",
345 | "relTol: 0.03193698353270655\n",
346 | "last iteration: 117.0\n",
347 | "last iteration: 668.0\n",
348 | "last iteration: 542.0\n",
349 | "rmse: 0.03163930690415854 0.031167935971706293\n",
350 | "sparse 104761 27.93626666666667\n",
351 | "relTol: 0.032386894245890474\n",
352 | "last iteration: 163.0\n",
353 | "last iteration: 1122.0\n",
354 | "last iteration: 953.0\n",
355 | "rmse: 0.03113418638769263 0.031511114203435116\n",
356 | "sparse 83650 22.30666666666667\n",
357 | "relTol: 0.026043709127629495\n",
358 | "last iteration: 300.0\n",
359 | "last iteration: 313.0\n",
360 | "last iteration: 378.0\n",
361 | "rmse: 0.030883228688432473 0.03176517851943646\n",
362 | "sparse 83969 22.391733333333335\n",
363 | "relTol: 0.012865456870421663\n",
364 | "last iteration: 71.0\n",
365 | "last iteration: 349.0\n",
366 | "last iteration: 413.0\n",
367 | "rmse: 0.03072522160033777 0.03201035596650768\n",
368 | "sparse 80692 21.517866666666666\n",
369 | "relTol: 0.007959093684708925\n",
370 | "last iteration: 82.0\n",
371 | "last iteration: 458.0\n",
372 | "last iteration: 484.0\n",
373 | "rmse: 0.030638614318576715 0.03221997918135619\n",
374 | "sparse 70652 18.840533333333333\n",
375 | "relTol: 0.004281076538498379\n",
376 | "last iteration: 87.0\n",
377 | "last iteration: 594.0\n",
378 | "last iteration: 525.0\n",
379 | "rmse: 0.030574632773504144 0.03241730394600538\n",
380 | "sparse 61470 16.392\n",
381 | "relTol: 0.003234681705383923\n",
382 | "last iteration: 93.0\n",
383 | "last iteration: 655.0\n",
384 | "last iteration: 541.0\n",
385 | "rmse: 0.030522931729757563 0.032586824397548494\n",
386 | "sparse 60231 16.0616\n",
387 | "relTol: 0.002737241494159379\n",
388 | "last iteration: 106.0\n",
389 | "last iteration: 658.0\n",
390 | "last iteration: 551.0\n",
391 | "rmse: 0.03046119930089416 0.03271181364371525\n",
392 | "sparse 60522 16.1392\n",
393 | "relTol: 0.003317997007800809\n",
394 | "last iteration: 114.0\n",
395 | "last iteration: 606.0\n",
396 | "last iteration: 492.0\n",
397 | "rmse: 0.03036630811254056 0.03281689199246287\n",
398 | "sparse 59577 15.8872\n",
399 | "relTol: 0.005160687569297672\n",
400 | "last iteration: 110.0\n",
401 | "last iteration: 525.0\n",
402 | "last iteration: 411.0\n",
403 | "rmse: 0.030231684819612106 0.03291669851768791\n",
404 | "sparse 61394 16.371733333333335\n",
405 | "relTol: 0.007289735678193071\n",
406 | "last iteration: 113.0\n",
407 | "last iteration: 447.0\n",
408 | "last iteration: 377.0\n",
409 | "rmse: 0.030087847571105192 0.0330202430263407\n",
410 | "sparse 63551 16.946933333333334\n",
411 | "relTol: 0.007766696547373428\n",
412 | "last iteration: 114.0\n",
413 | "last iteration: 400.0\n",
414 | "last iteration: 362.0\n",
415 | "rmse: 0.029946287924822047 0.03312025256338518\n",
416 | "sparse 65157 17.3752\n",
417 | "relTol: 0.007628197436673355\n",
418 | "last iteration: 105.0\n",
419 | "last iteration: 367.0\n",
420 | "last iteration: 340.0\n",
421 | "rmse: 0.0298107845036391 0.033205119908181764\n",
422 | "sparse 60690 16.184\n",
423 | "relTol: 0.007275833065283001\n",
424 | "last iteration: 104.0\n",
425 | "last iteration: 317.0\n",
426 | "last iteration: 323.0\n",
427 | "rmse: 0.029687794868121533 0.03326852499943039\n",
428 | "sparse 57621 15.3656\n",
429 | "relTol: 0.006555286848384558\n",
430 | "last iteration: 94.0\n",
431 | "last iteration: 285.0\n",
432 | "last iteration: 318.0\n",
433 | "rmse: 0.029581850802846303 0.03330740874773259\n",
434 | "sparse 54081 14.4216\n",
435 | "relTol: 0.005627728594839486\n",
436 | "last iteration: 92.0\n",
437 | "last iteration: 248.0\n",
438 | "last iteration: 296.0\n",
439 | "rmse: 0.02949520021873019 0.03332483191196958\n",
440 | "sparse 51809 13.815733333333334\n",
441 | "relTol: 0.004594454367133271\n",
442 | "last iteration: 91.0\n",
443 | "last iteration: 241.0\n",
444 | "last iteration: 291.0\n",
445 | "rmse: 0.029423632649577043 0.03332350686667239\n",
446 | "sparse 52456 13.988266666666666\n",
447 | "relTol: 0.003753874824256853\n",
448 | "last iteration: 81.0\n",
449 | "last iteration: 227.0\n",
450 | "last iteration: 294.0\n",
451 | "rmse: 0.029367292842104677 0.033305229925651984\n",
452 | "sparse 51473 13.726133333333333\n",
453 | "relTol: 0.002916080328254395\n",
454 | "last iteration: 87.0\n",
455 | "last iteration: 216.0\n",
456 | "last iteration: 273.0\n",
457 | "rmse: 0.029327330251628588 0.03326760125880665\n",
458 | "sparse 52288 13.943466666666666\n",
459 | "relTol: 0.0020603376453469146\n",
460 | "last iteration: 86.0\n",
461 | "last iteration: 226.0\n",
462 | "last iteration: 273.0\n",
463 | "rmse: 0.029298765822607188 0.03321043806231737\n",
464 | "sparse 54334 14.489066666666666\n",
465 | "relTol: 0.0014626234394618065\n",
466 | "last iteration: 86.0\n",
467 | "last iteration: 246.0\n",
468 | "last iteration: 267.0\n",
469 | "rmse: 0.029278158593576912 0.03314052557017413\n",
470 | "sparse 53446 14.252266666666667\n",
471 | "relTol: 0.001042812553063376\n",
472 | "last iteration: 86.0\n",
473 | "last iteration: 261.0\n",
474 | "last iteration: 282.0\n",
475 | "rmse: 0.02926429191986388 0.0330646176716413\n",
476 | "sparse 53681 14.314933333333334\n",
477 | "relTol: 0.0007064264586219307\n",
478 | "last iteration: 87.0\n",
479 | "last iteration: 275.0\n",
480 | "last iteration: 290.0\n",
481 | "rmse: 0.029255092693158662 0.03298765478305715\n",
482 | "sparse 56051 14.946933333333334\n",
483 | "relTol: 0.00045988332660108967\n",
484 | "last iteration: 87.0\n",
485 | "last iteration: 290.0\n",
486 | "last iteration: 306.0\n",
487 | "rmse: 0.029249061536690685 0.03291185799539666\n",
488 | "sparse 57420 15.312\n",
489 | "relTol: 0.0003085345987999059\n",
490 | "last iteration: 88.0\n",
491 | "last iteration: 297.0\n",
492 | "last iteration: 336.0\n",
493 | "rmse: 0.029245110759005797 0.03283467310194535\n",
494 | "sparse 57183 15.2488\n",
495 | "relTol: 0.0002048718527490186\n",
496 | "last iteration: 89.0\n",
497 | "last iteration: 314.0\n",
498 | "last iteration: 361.0\n",
499 | "rmse: 0.029243582425222646 0.032757710267126566\n",
500 | "sparse 57659 15.375733333333333\n",
501 | "relTol: 8.883935154653114e-05\n",
502 | "rmse: 0.029243582425222646 0.032864764424701404 0.032757710267126566\n",
503 | "sparse: 57659 15.375733333333333\n",
504 | "Time: 114.65457010269165\n"
505 | ]
506 | }
507 | ],
508 | "source": [
509 | "# Full TConvFISTA (Z-step and D-step)\n",
510 | "\n",
511 | "pobj = []\n",
512 | "this_pobj = (N * 0.5) * (linalg.norm(Y - Ypred) ** 2) + lbd1 * np.sum(abs(Z1pred_fista)) + lbd2 * np.sum(abs(Z2pred_fista)) + lbd3 * np.sum(abs(Z3pred_fista)) + beta1 * linalg.norm(Z1pred_fista)**2 + beta2 * linalg.norm(Z2pred_fista)**2 + beta3 * linalg.norm(Z3pred_fista)**2\n",
513 | "pobj.append((0, this_pobj))\n",
514 | "time0 = time.time()\n",
515 | "for count_loop in range(maxit_loop):\n",
516 | " \n",
517 | " # ==============================================\n",
518 | " # ============================================== K-CSC\n",
519 | " # ==============================================\n",
520 | "\n",
521 | " # ============================================================ mode 1\n",
522 | " # Vectorization with Kruskal formulation\n",
523 | " Achap, L = f_Achap(M, Z3chappred, Z2chappred, dchap1, N1, K)\n",
524 | " AchapHAchap = Achap.conj().T.dot(Achap)\n",
525 | " Achapy = Achap.conj().T.dot(ychap1)\n",
526 | " if rt > 0:\n",
527 | " lbd1 = np.max(np.abs(Achapy)) / rt # automatique lbd\n",
528 | " # ============================================================\n",
529 | " L = eigsh(AchapHAchap + 2*beta1*identity(K*Rpred*N1), k=1, return_eigenvectors=False) # Liptschitz constant\n",
530 | " Z1pred_fista, _, _ = T_ConvFISTA_precompute(AchapHAchap, Achapy, Z1pred_fista, L, lbd1, beta1, maxit, tol=tol)\n",
531 | " Z1chappred = fftn(Z1pred_fista, axes=[1])\n",
532 | "\n",
533 | " # ============================================================ mode 2\n",
534 | " # Vectorization with Kruskal formulation\n",
535 | " Achap, L = f_Achap(M, Z3chappred, Z1chappred, dchap2, N2, K)\n",
536 | " AchapHAchap = Achap.conj().T.dot(Achap)\n",
537 | " Achapy = Achap.conj().T.dot(ychap2)\n",
538 | " if rt > 0:\n",
539 | " lbd2 = np.max(np.abs(Achapy)) / rt\n",
540 | " # ============================================================\n",
541 | " L = eigsh(AchapHAchap + 2*beta2*identity(K*Rpred*N2), k=1, return_eigenvectors=False) # Liptschitz constant\n",
542 | " Z2pred_fista, times_fista, pobj_fista = T_ConvFISTA_precompute(AchapHAchap, Achapy, Z2pred_fista, L, lbd2, beta2, maxit, tol=tol)\n",
543 | " Z2chappred = fftn(Z2pred_fista, axes=[1])\n",
544 | " \n",
545 | " # ============================================================ mode 3\n",
546 | " # Vectorization with Kruskal formulation\n",
547 | " Achap, L = f_Achap(M, Z2chappred, Z1chappred, dchap3, N3, K)\n",
548 | " AchapHAchap = Achap.conj().T.dot(Achap)\n",
549 | " Achapy = Achap.conj().T.dot(ychap3)\n",
550 | " if rt > 0:\n",
551 | " lbd3 = np.max(np.abs(Achapy)) / rt\n",
552 | " # ============================================================\n",
553 | " L = eigsh(AchapHAchap + 2*beta3*identity(K*Rpred*N3), k=1, return_eigenvectors=False) # Liptschitz constant\n",
554 | " Z3pred_fista, _, _ = T_ConvFISTA_precompute(AchapHAchap, Achapy, Z3pred_fista, L, lbd3, beta3, maxit, tol=tol)\n",
555 | " Z3chappred = fftn(Z3pred_fista, axes=[1])\n",
556 | "\n",
557 | " # ============================================================ full mode\n",
558 | " Zfullpred = np.zeros((K, N1, N2, N3))\n",
559 | " for k in range(K):\n",
560 | " ZM = np.array(Z1pred_fista[k].dot(M[k].todense())).reshape((N1, Rpred))\n",
561 | " Zfullpred[k] = kruskal_to_tensor((ZM, Z2pred_fista[k], Z3pred_fista[k]))\n",
562 | "\n",
563 | " # ==============================================\n",
564 | " # ============================================== K-CDL\n",
565 | " # ==============================================\n",
566 | " \n",
567 | " U = np.zeros((N1, N2, N3, 1, 1, K))\n",
568 | " for k in range(K):\n",
569 | " U[:, :, :, 0, 0, k] = np.array(Zfullpred[k])\n",
570 | " \n",
571 | " b = ccmod.ConvCnstrMOD_IterSM(U, Ydico, (W1, W2, W3, 1, 1, K), opt_ccmod, dimK=1, dimN=3)\n",
572 | " a = b.solve()\n",
573 | "\n",
574 | " # Update dico\n",
575 | " Dsporco = b.getdict()\n",
576 | " for k in range(K):\n",
577 | " D[k] = np.array(Dsporco[:, :, :, 0, 0, k])\n",
578 | "\n",
579 | " # Update initilization\n",
580 | " Dstart = np.zeros((N1, N2, N3, 1, 1, K))\n",
581 | " for k in range(K):\n",
582 | " Dstart[:W1, :W2, :W3, 0, 0, k] = np.array(D[k])\n",
583 | " opt_ccmod.update({'Y0': Dstart, 'U0': b.var_u()*0})\n",
584 | "\n",
585 | " # Precomputation\n",
586 | " Dchap = np.zeros((K, N1, N2, N3), dtype=np.complex)\n",
587 | " Dchap1 = np.zeros((K, N1, N2*N3), dtype=np.complex)\n",
588 | " Dchap2 = np.zeros((K, N2, N1*N3), dtype=np.complex)\n",
589 | " Dchap3 = np.zeros((K, N3, N1*N2), dtype=np.complex)\n",
590 | "\n",
591 | " dchap1 = np.zeros((K, N1*N2*N3), dtype=np.complex)\n",
592 | " dchap2 = np.zeros((K, N1*N2*N3), dtype=np.complex)\n",
593 | " dchap3 = np.zeros((K, N1*N2*N3), dtype=np.complex)\n",
594 | "\n",
595 | " dchapconj1 = np.zeros((K, N1*N2*N3), dtype=np.complex)\n",
596 | " dchapconj2 = np.zeros((K, N1*N2*N3), dtype=np.complex)\n",
597 | " dchapconj3 = np.zeros((K, N1*N2*N3), dtype=np.complex)\n",
598 | "\n",
599 | " for k in range(K):\n",
600 | " DD = np.zeros((N1, N2, N3)) # padding\n",
601 | " DD[:W1, :W2, :W3] = D[k]\n",
602 | " DDchap = fftn(DD)\n",
603 | "\n",
604 | " Dchap[k] = DDchap\n",
605 | " Dchap1[k] = unfold(DDchap, 0)\n",
606 | " Dchap2[k] = unfold(DDchap, 1)\n",
607 | " Dchap3[k] = unfold(DDchap, 2)\n",
608 | "\n",
609 | " dchap1[k] = ravel(unfold(Dchap[k], 0))\n",
610 | " dchap2[k] = ravel(unfold(Dchap[k], 1))\n",
611 | " dchap3[k] = ravel(unfold(Dchap[k], 2))\n",
612 | "\n",
613 | " dchapconj1[k] = ravel(unfold(Dchap[k].conj(), 0))\n",
614 | " dchapconj2[k] = ravel(unfold(Dchap[k].conj(), 1))\n",
615 | " dchapconj3[k] = ravel(unfold(Dchap[k].conj(), 2))\n",
616 | " # ==============================================\n",
617 | " # ==============================================\n",
618 | " # ==============================================\n",
619 | "\n",
620 | " Ypred = fftconv(D[0], Zfullpred[0], axes=(0, 1, 2))\n",
621 | " for k in range(1, K):\n",
622 | " Ypred += fftconv(D[k], Zfullpred[k], axes=(0, 1, 2))\n",
623 | "\n",
624 | " print('rmse:', rmse(Ytrue, Ypred), rmse(Z, Zfullpred))\n",
625 | " print('sparse', np.sum(abs(Zfullpred)>0), 100*np.sum(abs(Zfullpred)>0)/np.prod(Zfullpred.shape))\n",
626 | "\n",
627 | " this_pobj = (N * 0.5) * (linalg.norm(Y - Ypred) ** 2) + lbd1 * np.sum(abs(Z1pred_fista)) + lbd2 * np.sum(abs(Z2pred_fista)) + lbd3 * np.sum(abs(Z3pred_fista)) + beta1 * linalg.norm(Z1pred_fista)**2 + beta2 * linalg.norm(Z2pred_fista)**2 + beta3 * linalg.norm(Z3pred_fista)**2\n",
628 | " pobj.append((time.time() - time0, this_pobj))\n",
629 | " \n",
630 | " relTol = abs(pobj[-2][1]-this_pobj)/this_pobj\n",
631 | " print('relTol:', relTol)\n",
632 | " if relTol < tol_loop: # Stopping criterion\n",
633 | " break\n",
634 | "\n",
635 | "print('rmse:', rmse(Ytrue, Ypred), rmse(Y, Ypred), rmse(Z, Zfullpred))\n",
636 | "print('sparse:', np.sum(abs(Zfullpred)>0), 100*np.sum(abs(Zfullpred)>0)/np.prod(Zfullpred.shape))\n",
637 | "print('Time:', time.time() - time0)"
638 | ]
639 | },
640 | {
641 | "cell_type": "code",
642 | "execution_count": 11,
643 | "metadata": {},
644 | "outputs": [],
645 | "source": [
646 | "times, pobj = map(np.array, zip(*pobj))"
647 | ]
648 | },
649 | {
650 | "cell_type": "code",
651 | "execution_count": 12,
652 | "metadata": {},
653 | "outputs": [
654 | {
655 | "data": {
656 | "image/png": "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\n",
657 | "text/plain": [
658 | ""
659 | ]
660 | },
661 | "metadata": {
662 | "needs_background": "light"
663 | },
664 | "output_type": "display_data"
665 | }
666 | ],
667 | "source": [
668 | "plt.figure(figsize=(10, 5))\n",
669 | "plt.subplot(1, 3, 1)\n",
670 | "plt.plot(times[1:], pobj[1:])\n",
671 | "plt.xlabel('Time (s)')\n",
672 | "plt.title('K-CDL')\n",
673 | "plt.grid()\n",
674 | "\n",
675 | "plt.subplot(1, 3, 2)\n",
676 | "plt.plot(times_fista, pobj_fista)\n",
677 | "plt.xlabel('Time (s)')\n",
678 | "plt.title('Last Fista block')\n",
679 | "plt.grid()\n",
680 | "\n",
681 | "its = b.getitstat()\n",
682 | "plt.subplot(1, 3, 3)\n",
683 | "plt.plot(its.Time, its.PrimalRsdl)\n",
684 | "plt.xlabel('Time (s)')\n",
685 | "plt.title('Last Dico Learn')\n",
686 | "plt.grid()"
687 | ]
688 | },
689 | {
690 | "cell_type": "code",
691 | "execution_count": 13,
692 | "metadata": {},
693 | "outputs": [
694 | {
695 | "data": {
696 | "text/plain": [
697 | "Text(0.5, 1.0, 'Ypred')"
698 | ]
699 | },
700 | "execution_count": 13,
701 | "metadata": {},
702 | "output_type": "execute_result"
703 | },
704 | {
705 | "data": {
706 | "image/png": "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\n",
707 | "text/plain": [
708 | ""
709 | ]
710 | },
711 | "metadata": {
712 | "needs_background": "light"
713 | },
714 | "output_type": "display_data"
715 | }
716 | ],
717 | "source": [
718 | "plt.figure(figsize=(10, 5))\n",
719 | "plt.subplot(131)\n",
720 | "plt.imshow(Y[0])\n",
721 | "plt.title('Y + noise')\n",
722 | "\n",
723 | "plt.subplot(132)\n",
724 | "plt.imshow(Ytrue[0])\n",
725 | "plt.title('Y')\n",
726 | "\n",
727 | "plt.subplot(133)\n",
728 | "plt.imshow(Ypred[0])\n",
729 | "plt.title('Ypred')"
730 | ]
731 | }
732 | ],
733 | "metadata": {
734 | "kernelspec": {
735 | "display_name": "Python 3",
736 | "language": "python",
737 | "name": "python3"
738 | },
739 | "language_info": {
740 | "codemirror_mode": {
741 | "name": "ipython",
742 | "version": 3
743 | },
744 | "file_extension": ".py",
745 | "mimetype": "text/x-python",
746 | "name": "python",
747 | "nbconvert_exporter": "python",
748 | "pygments_lexer": "ipython3",
749 | "version": "3.5.2"
750 | }
751 | },
752 | "nbformat": 4,
753 | "nbformat_minor": 4
754 | }
755 |
--------------------------------------------------------------------------------
/data/D.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreHmbt/Tensor_CDL/40e77d31c38f1092c310dcad99244e2fac72b5bf/data/D.npy
--------------------------------------------------------------------------------
/data/Z_channel.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreHmbt/Tensor_CDL/40e77d31c38f1092c310dcad99244e2fac72b5bf/data/Z_channel.npy
--------------------------------------------------------------------------------
/data/Z_freq.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreHmbt/Tensor_CDL/40e77d31c38f1092c310dcad99244e2fac72b5bf/data/Z_freq.npy
--------------------------------------------------------------------------------
/data/Z_time.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreHmbt/Tensor_CDL/40e77d31c38f1092c310dcad99244e2fac72b5bf/data/Z_time.npy
--------------------------------------------------------------------------------
/illustration_optim_process.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stderr",
10 | "output_type": "stream",
11 | "text": [
12 | "Using numpy backend.\n"
13 | ]
14 | }
15 | ],
16 | "source": [
17 | "from sporco import util\n",
18 | "import sporco.metric as sm\n",
19 | "from sporco import plot\n",
20 | "from sporco.admm import ccmod\n",
21 | "from sporco.linalg import fftconv, fftn, ifftn\n",
22 | "import numpy as np\n",
23 | "import matplotlib.pyplot as plt\n",
24 | "from tensorly import kruskal_to_tensor, kron\n",
25 | "from tensorly.tenalg import khatri_rao"
26 | ]
27 | },
28 | {
29 | "cell_type": "code",
30 | "execution_count": 2,
31 | "metadata": {},
32 | "outputs": [],
33 | "source": [
34 | "# Dimensions of the K-CDL model\n",
35 | "\n",
36 | "N1 = 5\n",
37 | "N2 = 6\n",
38 | "N3 = 7\n",
39 | "N = np.product((N1, N2, N3))\n",
40 | "\n",
41 | "W1 = 2\n",
42 | "W2 = 3\n",
43 | "W3 = 4\n",
44 | "\n",
45 | "K = 3\n",
46 | "R = 2"
47 | ]
48 | },
49 | {
50 | "cell_type": "code",
51 | "execution_count": 3,
52 | "metadata": {},
53 | "outputs": [],
54 | "source": [
55 | "# Components in Temporal domain\n",
56 | "\n",
57 | "Y = np.random.normal(size=(N1, N2, N3))\n",
58 | "\n",
59 | "D = np.random.normal(size=(K, W1, W2, W3))\n",
60 | "D_pad = np.zeros((K, N1, N2, N3))\n",
61 | "D_pad[:, :W1, :W2, :W3] = D\n",
62 | "\n",
63 | "Z1 = np.random.normal(size=(K, N1, R))\n",
64 | "Z2 = np.random.normal(size=(K, N2, R))\n",
65 | "Z3 = np.random.normal(size=(K, N3, R))\n",
66 | "Z = np.zeros((K, N1, N2, N3))\n",
67 | "for k in range(K):\n",
68 | " Z[k] = kruskal_to_tensor((Z1[k], Z2[k], Z3[k]))"
69 | ]
70 | },
71 | {
72 | "cell_type": "code",
73 | "execution_count": 4,
74 | "metadata": {},
75 | "outputs": [],
76 | "source": [
77 | "# Components in Frequency domain\n",
78 | "\n",
79 | "Yc = fftn(Y, axes=[0, 1, 2])\n",
80 | "\n",
81 | "Dc = fftn(D, axes=[1, 2, 3])\n",
82 | "Dc_pad = np.zeros((K, N1, N2, N3), dtype = np.complex)\n",
83 | "Dc_pad[:, :W1, :W2, :W3] = Dc.copy()\n",
84 | "Dc_pad = fftn(D_pad, axes=[1, 2, 3])\n",
85 | "\n",
86 | "Z1c = fftn(Z1, axes=[1])\n",
87 | "Z2c = fftn(Z2, axes=[1])\n",
88 | "Z3c = fftn(Z3, axes=[1])\n",
89 | "Zc = np.zeros((K, N1, N2, N3), dtype = np.complex)\n",
90 | "for k in range(K):\n",
91 | " Zc[k] = kruskal_to_tensor((Z1c[k], Z2c[k], Z3c[k]))"
92 | ]
93 | },
94 | {
95 | "cell_type": "code",
96 | "execution_count": 5,
97 | "metadata": {},
98 | "outputs": [
99 | {
100 | "name": "stdout",
101 | "output_type": "stream",
102 | "text": [
103 | "2.842170943040401e-14\n"
104 | ]
105 | }
106 | ],
107 | "source": [
108 | "# Plancherel theorem on Y (print need to be 0)\n",
109 | "print(np.linalg.norm(Y)**2 - np.linalg.norm(Yc)**2/N)"
110 | ]
111 | },
112 | {
113 | "cell_type": "code",
114 | "execution_count": 6,
115 | "metadata": {},
116 | "outputs": [
117 | {
118 | "name": "stdout",
119 | "output_type": "stream",
120 | "text": [
121 | "1.0790282092503556e-13\n"
122 | ]
123 | }
124 | ],
125 | "source": [
126 | "# Check lemma 1 (print need to be 0)\n",
127 | "Zc_check = fftn(Z, axes=[1, 2, 3])\n",
128 | "\n",
129 | "print(np.linalg.norm(Zc - Zc_check))"
130 | ]
131 | },
132 | {
133 | "cell_type": "code",
134 | "execution_count": 7,
135 | "metadata": {},
136 | "outputs": [
137 | {
138 | "name": "stdout",
139 | "output_type": "stream",
140 | "text": [
141 | "5.4569682106375694e-12\n"
142 | ]
143 | }
144 | ],
145 | "source": [
146 | "# Check theorem 1 (print need to be 0)\n",
147 | "\n",
148 | "Ypred = np.sum(np.array([fftconv(D_pad[k], Z[k], axes=[0, 1, 2]) for k in range(K)]), axis=0)\n",
149 | "Ycpred = np.sum(np.array([np.multiply(Dc_pad[k], Zc[k]) for k in range(K)]), axis=0)\n",
150 | "\n",
151 | "print(0.5 * np.linalg.norm(Y - Ypred)**2 - 0.5 * np.linalg.norm(Yc - Ycpred)**2/N)"
152 | ]
153 | },
154 | {
155 | "cell_type": "code",
156 | "execution_count": 8,
157 | "metadata": {},
158 | "outputs": [],
159 | "source": [
160 | "# Specific ordering of the indexes during the vectorization\n",
161 | "def unfold(tensor, mode, order='F'):\n",
162 | " return np.reshape(np.moveaxis(tensor, mode, 0), (tensor.shape[mode], -1), order=order)\n",
163 | "def ravel(X, order='F'):\n",
164 | " return np.ravel(X, order=order)"
165 | ]
166 | },
167 | {
168 | "cell_type": "code",
169 | "execution_count": 9,
170 | "metadata": {},
171 | "outputs": [],
172 | "source": [
173 | "# Check corollary\n",
174 | "yc_0 = ravel(unfold(Yc, mode=0))\n",
175 | "\n",
176 | "dc_0_diag = np.array([np.diag(ravel(unfold(Dc_pad[k], mode=0))) for k in range(K)])\n",
177 | "Gammac = np.hstack(dc_0_diag)\n",
178 | "\n",
179 | "z1_0 = np.reshape(Z1, (K, N1 * R), order='F').ravel()\n",
180 | "z1c_0 = np.reshape(Z1c, (K, N1 * R), order='F').ravel()\n",
181 | "\n",
182 | "Bc = np.array([khatri_rao((Z3c[k], Z2c[k])) for k in range(K)])\n",
183 | " \n",
184 | "Ac = np.zeros((K*N2*N3, K*R), dtype=np.complex)\n",
185 | "for k in range(K):\n",
186 | " Ac[k*N2*N3 : (k+1)*N2*N3, k*R:(k+1)*R] = Bc[k]\n",
187 | " \n",
188 | "I_1 = np.identity(N1)\n",
189 | "\n",
190 | "M = Gammac.dot(kron(Ac, I_1))"
191 | ]
192 | },
193 | {
194 | "cell_type": "code",
195 | "execution_count": 10,
196 | "metadata": {},
197 | "outputs": [
198 | {
199 | "name": "stdout",
200 | "output_type": "stream",
201 | "text": [
202 | "1.0913936421275139e-11\n"
203 | ]
204 | }
205 | ],
206 | "source": [
207 | "# Check corollary (print need to be 0)\n",
208 | "print(np.linalg.norm(Y - Ypred)**2 - np.linalg.norm(yc_0 - M.dot(z1c_0))**2/N)"
209 | ]
210 | },
211 | {
212 | "cell_type": "code",
213 | "execution_count": 11,
214 | "metadata": {},
215 | "outputs": [
216 | {
217 | "name": "stdout",
218 | "output_type": "stream",
219 | "text": [
220 | "0.0\n"
221 | ]
222 | }
223 | ],
224 | "source": [
225 | "# Check for kronecker outside (print need to be 0)\n",
226 | "\n",
227 | "Bc_check = np.array([kron(khatri_rao((Z3c[k], Z2c[k])), I_1) for k in range(K)])\n",
228 | "Ac_check = np.zeros((K*N, K*R*N1), dtype=np.complex)\n",
229 | "for k in range(K):\n",
230 | " Ac_check[k*N : (k+1)*N, k*R*N1:(k+1)*R*N1] = Bc_check[k]\n",
231 | " \n",
232 | "print(np.linalg.norm(kron(Ac, I_1) - Ac_check))"
233 | ]
234 | },
235 | {
236 | "cell_type": "code",
237 | "execution_count": 12,
238 | "metadata": {},
239 | "outputs": [],
240 | "source": [
241 | "# Just for visualization\n",
242 | "y_0 = ravel(unfold(Y, mode=0)) # unused\n",
243 | "\n",
244 | "d_0_diag = np.array([np.diag(ravel(unfold(D[k], mode=0))) for k in range(K)])\n",
245 | "Gamma = np.hstack(d_0_diag)\n",
246 | "\n",
247 | "B = np.array([khatri_rao((Z3[k], Z2[k])) for k in range(K)])\n",
248 | "\n",
249 | "A = np.zeros((K*N2*N3, K*R))\n",
250 | "for k in range(K):\n",
251 | " A[k*N2*N3 : (k+1)*N2*N3, k*R:(k+1)*R] = B[k]"
252 | ]
253 | },
254 | {
255 | "cell_type": "code",
256 | "execution_count": 13,
257 | "metadata": {},
258 | "outputs": [
259 | {
260 | "data": {
261 | "text/plain": [
262 | ""
263 | ]
264 | },
265 | "execution_count": 13,
266 | "metadata": {},
267 | "output_type": "execute_result"
268 | },
269 | {
270 | "data": {
271 | "image/png": "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\n",
272 | "text/plain": [
273 | ""
274 | ]
275 | },
276 | "metadata": {
277 | "needs_background": "light"
278 | },
279 | "output_type": "display_data"
280 | }
281 | ],
282 | "source": [
283 | "# Visualization of matrix Gamma\n",
284 | "plt.figure(figsize=(15, 5))\n",
285 | "plt.subplot(131)\n",
286 | "plt.imshow(Gamma)\n",
287 | "plt.title('$\\Gamma$ (without padding)')\n",
288 | "plt.subplot(132)\n",
289 | "plt.title('real($\\widehat{\\Gamma}$)')\n",
290 | "plt.imshow(np.real(Gammac))\n",
291 | "plt.subplot(133)\n",
292 | "plt.title('imag($\\widehat{\\Gamma}$)')\n",
293 | "plt.imshow(np.imag(Gammac))"
294 | ]
295 | },
296 | {
297 | "cell_type": "code",
298 | "execution_count": 14,
299 | "metadata": {},
300 | "outputs": [
301 | {
302 | "data": {
303 | "text/plain": [
304 | ""
305 | ]
306 | },
307 | "execution_count": 14,
308 | "metadata": {},
309 | "output_type": "execute_result"
310 | },
311 | {
312 | "data": {
313 | "image/png": "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\n",
314 | "text/plain": [
315 | ""
316 | ]
317 | },
318 | "metadata": {
319 | "needs_background": "light"
320 | },
321 | "output_type": "display_data"
322 | }
323 | ],
324 | "source": [
325 | "# Visualization of matrix A\n",
326 | "plt.figure(figsize=(15, 5))\n",
327 | "plt.subplot(131)\n",
328 | "plt.imshow(A.T)\n",
329 | "plt.title('$A^T$')\n",
330 | "plt.subplot(132)\n",
331 | "plt.title('real($\\widehat{A}^T$)')\n",
332 | "plt.imshow(np.real(Ac.T))\n",
333 | "plt.subplot(133)\n",
334 | "plt.title('imag($\\widehat{A}^T$)')\n",
335 | "plt.imshow(np.imag(Ac.T))"
336 | ]
337 | },
338 | {
339 | "cell_type": "code",
340 | "execution_count": 15,
341 | "metadata": {},
342 | "outputs": [
343 | {
344 | "name": "stdout",
345 | "output_type": "stream",
346 | "text": [
347 | "5.261055715623732e-11\n"
348 | ]
349 | }
350 | ],
351 | "source": [
352 | "# Check proposition (print need to be 0)\n",
353 | "Gram = M.conj().T.dot(M)\n",
354 | "\n",
355 | "Gram_check = np.zeros((Gram.shape), dtype=np.complex)\n",
356 | "for k in range(K):\n",
357 | " for l in range(K):\n",
358 | " dck_conj = dc_0_diag[k].conj().T\n",
359 | " dcl = dc_0_diag[l]\n",
360 | "\n",
361 | " Ack_conj = kron(khatri_rao((Z3c[k], Z2c[k])), I_1).conj().T\n",
362 | " Acl = kron(khatri_rao((Z3c[l], Z2c[l])), I_1)\n",
363 | "\n",
364 | " Block_kl = Ack_conj.dot(dck_conj).dot(dcl).dot(Acl)\n",
365 | " \n",
366 | " Gram_check[k*N1*R : (k+1)*N1*R, l*N1*R: (l+1)*N1*R] = Block_kl\n",
367 | "\n",
368 | "print(np.linalg.norm(Gram - Gram_check))"
369 | ]
370 | },
371 | {
372 | "cell_type": "code",
373 | "execution_count": 16,
374 | "metadata": {},
375 | "outputs": [
376 | {
377 | "name": "stdout",
378 | "output_type": "stream",
379 | "text": [
380 | "0.0\n"
381 | ]
382 | }
383 | ],
384 | "source": [
385 | "# Check the decomposition into smaller kronecker (print need to be 0)\n",
386 | "k = 0\n",
387 | "dc_0_diag_k_check = np.zeros((dc_0_diag[k].shape), dtype=np.complex)\n",
388 | "for i in range(N2*N3):\n",
389 | " ei = np.zeros(N2*N3)\n",
390 | " ei[i] = 1\n",
391 | " \n",
392 | " delta_ki = dc_0_diag[k][i*N1:(i+1)*N1, i*N1:(i+1)*N1]\n",
393 | " \n",
394 | " dc_0_diag_k_check += kron(np.diag(ei), delta_ki)\n",
395 | " \n",
396 | "print(np.linalg.norm(dc_0_diag[k] - dc_0_diag_k_check))"
397 | ]
398 | },
399 | {
400 | "cell_type": "code",
401 | "execution_count": 17,
402 | "metadata": {},
403 | "outputs": [
404 | {
405 | "name": "stdout",
406 | "output_type": "stream",
407 | "text": [
408 | "8.133042369113223e-12\n"
409 | ]
410 | }
411 | ],
412 | "source": [
413 | "# Check the final decomposition of the Gram matrix (print need to be 0)\n",
414 | "\n",
415 | "k = 0\n",
416 | "l = 1\n",
417 | "Ack_conj = kron(khatri_rao((Z3c[k], Z2c[k])), I_1).conj().T\n",
418 | "Acl = kron(khatri_rao((Z3c[l], Z2c[l])), I_1)\n",
419 | "dck_conj = dc_0_diag[k].conj().T\n",
420 | "dcl = dc_0_diag[l]\n",
421 | "Block_kl = Ack_conj.dot(dck_conj).dot(dcl).dot(Acl)\n",
422 | "\n",
423 | "Block_kl_check = np.zeros((Block_kl.shape), dtype=np.complex)\n",
424 | "Bck_conj = khatri_rao((Z3c[k], Z2c[k])).conj()\n",
425 | "Bcl = khatri_rao((Z3c[l], Z2c[l]))\n",
426 | "\n",
427 | "for i in range(N2*N3):\n",
428 | " \n",
429 | " delta_ki_conj = dc_0_diag[k][i*N1:(i+1)*N1, i*N1:(i+1)*N1].conj()\n",
430 | " delta_li = dc_0_diag[l][i*N1:(i+1)*N1, i*N1:(i+1)*N1]\n",
431 | " \n",
432 | " Block_kl_check += kron( np.outer(Bck_conj[i, :], Bcl[i, :]), delta_ki_conj*delta_li )\n",
433 | " \n",
434 | "print(np.linalg.norm(Block_kl - Block_kl_check))"
435 | ]
436 | },
437 | {
438 | "cell_type": "code",
439 | "execution_count": 18,
440 | "metadata": {},
441 | "outputs": [
442 | {
443 | "data": {
444 | "text/plain": [
445 | "Text(0.5, 1.0, '|imag(Gram)|>0')"
446 | ]
447 | },
448 | "execution_count": 18,
449 | "metadata": {},
450 | "output_type": "execute_result"
451 | },
452 | {
453 | "data": {
454 | "image/png": "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\n",
455 | "text/plain": [
456 | ""
457 | ]
458 | },
459 | "metadata": {
460 | "needs_background": "light"
461 | },
462 | "output_type": "display_data"
463 | }
464 | ],
465 | "source": [
466 | "# Visualization of the particular structure of the Gram matrix\n",
467 | "plt.figure(figsize=(15, 5))\n",
468 | "plt.subplot(141)\n",
469 | "plt.imshow(np.real(Gram))\n",
470 | "plt.title('real(Gram)')\n",
471 | "plt.subplot(142)\n",
472 | "plt.imshow(abs((Gram))>0)\n",
473 | "plt.title('|real(Gram)|>0')\n",
474 | "plt.subplot(143)\n",
475 | "plt.imshow(np.imag(Gram))\n",
476 | "plt.title('imag(Gram)')\n",
477 | "plt.subplot(144)\n",
478 | "plt.imshow(abs(np.imag(Gram))>0)\n",
479 | "plt.title('|imag(Gram)|>0')"
480 | ]
481 | },
482 | {
483 | "cell_type": "code",
484 | "execution_count": null,
485 | "metadata": {},
486 | "outputs": [],
487 | "source": []
488 | }
489 | ],
490 | "metadata": {
491 | "kernelspec": {
492 | "display_name": "Python 3",
493 | "language": "python",
494 | "name": "python3"
495 | },
496 | "language_info": {
497 | "codemirror_mode": {
498 | "name": "ipython",
499 | "version": 3
500 | },
501 | "file_extension": ".py",
502 | "mimetype": "text/x-python",
503 | "name": "python",
504 | "nbconvert_exporter": "python",
505 | "pygments_lexer": "ipython3",
506 | "version": "3.5.2"
507 | }
508 | },
509 | "nbformat": 4,
510 | "nbformat_minor": 2
511 | }
512 |
--------------------------------------------------------------------------------
/outputs_eeg/atom_active_0_.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreHmbt/Tensor_CDL/40e77d31c38f1092c310dcad99244e2fac72b5bf/outputs_eeg/atom_active_0_.pdf
--------------------------------------------------------------------------------
/outputs_eeg/atom_active_0_.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreHmbt/Tensor_CDL/40e77d31c38f1092c310dcad99244e2fac72b5bf/outputs_eeg/atom_active_0_.png
--------------------------------------------------------------------------------
/outputs_eeg/atom_active_1_.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreHmbt/Tensor_CDL/40e77d31c38f1092c310dcad99244e2fac72b5bf/outputs_eeg/atom_active_1_.pdf
--------------------------------------------------------------------------------
/outputs_eeg/atom_active_2_.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreHmbt/Tensor_CDL/40e77d31c38f1092c310dcad99244e2fac72b5bf/outputs_eeg/atom_active_2_.pdf
--------------------------------------------------------------------------------
/outputs_eeg/atom_active_3_.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreHmbt/Tensor_CDL/40e77d31c38f1092c310dcad99244e2fac72b5bf/outputs_eeg/atom_active_3_.pdf
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | numpy==1.14.2
2 | tensorly==0.4.3
3 | mne==0.17.2
4 | sporco==0.1.10
5 | matplotlib==3.0.0
6 |
--------------------------------------------------------------------------------