Blind Source Separation with AMICA & FastICA

An example of estimating sources from noisy mixtures.

ICA separates independent sources given only mixed microphone recordings. Imagine three instruments playing simultaneously and three microphones recording the mixtures. ICA recovers the instrument tracks because the sources are non-Gaussian. PCA, by contrast, fails in this setting.

Note

This example is adapted from the Scikit-Learn documentation.

Generate sample data

import numpy as np
from scipy import signal

rng = np.random.default_rng(0)
n_samples = 2000
time = np.linspace(0, 8, n_samples)

s1 = np.sin(2 * time)                     # Sinusoidal
s2 = np.sign(np.sin(3 * time))            # Square wave
s3 = signal.sawtooth(2 * np.pi * time)    # Sawtooth

S = np.c_[s1, s2, s3]
S += 0.2 * rng.standard_normal(S.shape)   # Add noise
S /= S.std(axis=0)                        # Standardize

A = np.array([[1, 1, 1],
              [0.5, 2, 1.0],
              [1.5, 1.0, 2.0]])           # Mixing matrix

X = S @ A.T                               # Observed mixtures

Run AMICA and FastICA

from amica import AMICA
from sklearn.decomposition import FastICA

models = {}
labels = {}

# AMICA
# We instantiate amica.AMICA and call fit..
ica = AMICA(n_components=3, whiten="zca", random_state=0)
models["AMICA"] = ica.fit_transform(X)
labels["AMICA"] = "AMICA recovered signals"
INFO     | getting the mean ... - amica.linalg:pre_whiten
INFO     |  Getting the covariance matrix ... - amica.linalg:pre_whiten
INFO     | doing eigenvalue decomposition for 3 features ... - amica.linalg:pre_whiten
INFO     | minimum eigenvalues: [0.05201252] - amica.linalg:pre_whiten
INFO     | maximum eigenvalues: [14.0572034   1.35729453  0.05201252] - amica.linalg:pre_whiten
INFO     | num eigvals kept: 3 - amica.linalg:pre_whiten
INFO     | Sphering the data... - amica.linalg:pre_whiten
INFO     | numeigs = 3, nw = 3 - amica.linalg:pre_whiten
INFO     | 1: block size = 2000 - amica.core:solve
INFO     | Solving. (please be patient, this may take a while)... - amica.core:solve
INFO     | Iteration 1, lrate = 0.05000, LL = -1.4208643, nd = 0.1965180, D = 0.00003 0.00003 took 0.00 seconds - amica.core:optimize
INFO     | Iteration 2, lrate = 0.05000, LL = -1.3636536, nd = 0.1723261, D = 0.00006 0.00006 took 0.00 seconds - amica.core:optimize
INFO     | Iteration 3, lrate = 0.05000, LL = -1.3238623, nd = 0.2980232, D = 0.00034 0.00034 took 0.00 seconds - amica.core:optimize
INFO     | Iteration 4, lrate = 0.05000, LL = -1.2865584, nd = 0.4412654, D = 0.00188 0.00188 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 5, lrate = 0.05000, LL = -1.2385767, nd = 0.5302712, D = 0.00651 0.00651 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 6, lrate = 0.05000, LL = -1.1797772, nd = 0.5185603, D = 0.01541 0.01541 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 7, lrate = 0.05000, LL = -1.1225606, nd = 0.4013239, D = 0.02655 0.02655 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 8, lrate = 0.05000, LL = -1.0865829, nd = 0.2305540, D = 0.03484 0.03484 took 0.19 seconds - amica.core:optimize
INFO     | Iteration 9, lrate = 0.05000, LL = -1.0738310, nd = 0.1660310, D = 0.03542 0.03542 took 0.39 seconds - amica.core:optimize
INFO     | Iteration 10, lrate = 0.05000, LL = -1.0678697, nd = 0.1539337, D = 0.03093 0.03093 took 0.02 seconds - amica.core:optimize
INFO     | Iteration 11, lrate = 0.05000, LL = -1.0633096, nd = 0.1482986, D = 0.02599 0.02599 took 0.29 seconds - amica.core:optimize
INFO     | Iteration 12, lrate = 0.05000, LL = -1.0596034, nd = 0.1333072, D = 0.02200 0.02200 took 0.22 seconds - amica.core:optimize
INFO     | Iteration 13, lrate = 0.05000, LL = -1.0565292, nd = 0.1328886, D = 0.01825 0.01825 took 0.18 seconds - amica.core:optimize
INFO     | Iteration 14, lrate = 0.05000, LL = -1.0539693, nd = 0.1170593, D = 0.01554 0.01554 took 0.21 seconds - amica.core:optimize
INFO     | Iteration 15, lrate = 0.05000, LL = -1.0519178, nd = 0.1299362, D = 0.01269 0.01269 took 0.19 seconds - amica.core:optimize
INFO     | Iteration 16, lrate = 0.05000, LL = -1.0503348, nd = 0.1265691, D = 0.01106 0.01106 took 0.20 seconds - amica.core:optimize
INFO     | Iteration 17, lrate = 0.05000, LL = -1.0493665, nd = 0.1684180, D = 0.00879 0.00879 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 18, lrate = 0.05000, LL = -1.0491577, nd = 0.2095800, D = 0.00809 0.00809 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 19, lrate = 0.05000, LL = -1.0505280, nd = 0.2933917, D = 0.00606 0.00606 took 0.20 seconds - amica.core:optimize
INFO     | Likelihood decreasing! - amica.core:optimize
INFO     | Iteration 20, lrate = 0.05000, LL = -1.0537696, nd = 0.4207022, D = 0.00620 0.00620 took 0.20 seconds - amica.core:optimize
INFO     | Likelihood decreasing! - amica.core:optimize
INFO     | Iteration 21, lrate = 0.05000, LL = -1.0631841, nd = 0.5297685, D = 0.00406 0.00406 took 0.09 seconds - amica.core:optimize
INFO     | Likelihood decreasing! - amica.core:optimize
INFO     | Iteration 22, lrate = 0.02500, LL = -1.0491921, nd = 0.2979483, D = 0.00452 0.00452 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 23, lrate = 0.02500, LL = -1.0464746, nd = 0.2140679, D = 0.00406 0.00406 took 0.20 seconds - amica.core:optimize
INFO     | Iteration 24, lrate = 0.02500, LL = -1.0447453, nd = 0.1531052, D = 0.00405 0.00405 took 0.11 seconds - amica.core:optimize
INFO     | Iteration 25, lrate = 0.02500, LL = -1.0441079, nd = 0.1232832, D = 0.00371 0.00371 took 0.29 seconds - amica.core:optimize
INFO     | Iteration 26, lrate = 0.02500, LL = -1.0434503, nd = 0.0950423, D = 0.00360 0.00360 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 27, lrate = 0.02500, LL = -1.0430900, nd = 0.0818624, D = 0.00334 0.00334 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 28, lrate = 0.02500, LL = -1.0427180, nd = 0.0667586, D = 0.00322 0.00322 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 29, lrate = 0.02500, LL = -1.0424431, nd = 0.0600988, D = 0.00303 0.00303 took 0.20 seconds - amica.core:optimize
INFO     | Iteration 30, lrate = 0.02500, LL = -1.0422004, nd = 0.0518968, D = 0.00291 0.00291 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 31, lrate = 0.02500, LL = -1.0419892, nd = 0.0493041, D = 0.00276 0.00276 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 32, lrate = 0.02500, LL = -1.0417947, nd = 0.0454862, D = 0.00265 0.00265 took 0.20 seconds - amica.core:optimize
INFO     | Iteration 33, lrate = 0.02500, LL = -1.0416120, nd = 0.0444069, D = 0.00254 0.00254 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 34, lrate = 0.02500, LL = -1.0414383, nd = 0.0424979, D = 0.00244 0.00244 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 35, lrate = 0.02500, LL = -1.0412721, nd = 0.0417764, D = 0.00235 0.00235 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 36, lrate = 0.02500, LL = -1.0411120, nd = 0.0406280, D = 0.00227 0.00227 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 37, lrate = 0.02500, LL = -1.0409573, nd = 0.0399952, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 38, lrate = 0.02500, LL = -1.0408074, nd = 0.0391514, D = 0.00213 0.00213 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 39, lrate = 0.02500, LL = -1.0406620, nd = 0.0385546, D = 0.00207 0.00207 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 40, lrate = 0.02500, LL = -1.0405206, nd = 0.0378696, D = 0.00202 0.00202 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 41, lrate = 0.02500, LL = -1.0403828, nd = 0.0373124, D = 0.00197 0.00197 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 42, lrate = 0.02500, LL = -1.0402484, nd = 0.0367218, D = 0.00192 0.00192 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 43, lrate = 0.02500, LL = -1.0401171, nd = 0.0361870, D = 0.00188 0.00188 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 44, lrate = 0.02500, LL = -1.0399889, nd = 0.0356346, D = 0.00185 0.00185 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 45, lrate = 0.02500, LL = -1.0398640, nd = 0.0351228, D = 0.00181 0.00181 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 46, lrate = 0.02500, LL = -1.0397431, nd = 0.0346063, D = 0.00179 0.00179 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 47, lrate = 0.02500, LL = -1.0396268, nd = 0.0340971, D = 0.00176 0.00176 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 48, lrate = 0.02500, LL = -1.0395159, nd = 0.0335949, D = 0.00174 0.00174 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 49, lrate = 0.02500, LL = -1.0394103, nd = 0.0331011, D = 0.00172 0.00172 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 50, lrate = 0.02500, LL = -1.0393096, nd = 0.0095508, D = 0.00170 0.00170 took 0.10 seconds - amica.core:optimize
INFO     | Starting Newton ... setting numdecs to 0 - amica.core:optimize
INFO     | Iteration 51, lrate = 0.05000, LL = -1.0392460, nd = 0.0094513, D = 0.00170 0.00170 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 52, lrate = 0.10000, LL = -1.0391397, nd = 0.0092123, D = 0.00169 0.00169 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 53, lrate = 0.20000, LL = -1.0389533, nd = 0.0087277, D = 0.00169 0.00169 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 54, lrate = 0.30000, LL = -1.0387073, nd = 0.0080559, D = 0.00170 0.00170 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 55, lrate = 0.40000, LL = -1.0384282, nd = 0.0072382, D = 0.00172 0.00172 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 56, lrate = 0.50000, LL = -1.0381432, nd = 0.0063293, D = 0.00176 0.00176 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 57, lrate = 0.60000, LL = -1.0378758, nd = 0.0053739, D = 0.00182 0.00182 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 58, lrate = 0.70000, LL = -1.0376417, nd = 0.0044494, D = 0.00188 0.00188 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 59, lrate = 0.80000, LL = -1.0374480, nd = 0.0035947, D = 0.00195 0.00195 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 60, lrate = 0.90000, LL = -1.0372945, nd = 0.0028434, D = 0.00201 0.00201 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 61, lrate = 1.00000, LL = -1.0371771, nd = 0.0021936, D = 0.00207 0.00207 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 62, lrate = 1.00000, LL = -1.0370943, nd = 0.0017217, D = 0.00210 0.00210 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 63, lrate = 1.00000, LL = -1.0370346, nd = 0.0013635, D = 0.00212 0.00212 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 64, lrate = 1.00000, LL = -1.0369906, nd = 0.0011034, D = 0.00214 0.00214 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 65, lrate = 1.00000, LL = -1.0369577, nd = 0.0008987, D = 0.00215 0.00215 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 66, lrate = 1.00000, LL = -1.0369329, nd = 0.0007359, D = 0.00216 0.00216 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 67, lrate = 1.00000, LL = -1.0369140, nd = 0.0006048, D = 0.00216 0.00216 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 68, lrate = 1.00000, LL = -1.0368996, nd = 0.0005011, D = 0.00217 0.00217 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 69, lrate = 1.00000, LL = -1.0368885, nd = 0.0004174, D = 0.00217 0.00217 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 70, lrate = 1.00000, LL = -1.0368798, nd = 0.0003504, D = 0.00217 0.00217 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 71, lrate = 1.00000, LL = -1.0368730, nd = 0.0002955, D = 0.00218 0.00218 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 72, lrate = 1.00000, LL = -1.0368677, nd = 0.0002505, D = 0.00218 0.00218 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 73, lrate = 1.00000, LL = -1.0368633, nd = 0.0002125, D = 0.00218 0.00218 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 74, lrate = 1.00000, LL = -1.0368598, nd = 0.0001813, D = 0.00218 0.00218 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 75, lrate = 1.00000, LL = -1.0368569, nd = 0.0001550, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 76, lrate = 1.00000, LL = -1.0368544, nd = 0.0001337, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 77, lrate = 1.00000, LL = -1.0368523, nd = 0.0001161, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 78, lrate = 1.00000, LL = -1.0368505, nd = 0.0001015, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 79, lrate = 1.00000, LL = -1.0368488, nd = 0.0000892, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 80, lrate = 1.00000, LL = -1.0368473, nd = 0.0000789, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 81, lrate = 1.00000, LL = -1.0368460, nd = 0.0000702, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 82, lrate = 1.00000, LL = -1.0368447, nd = 0.0000629, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 83, lrate = 1.00000, LL = -1.0368435, nd = 0.0000567, D = 0.00220 0.00220 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 84, lrate = 1.00000, LL = -1.0368424, nd = 0.0000515, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 85, lrate = 1.00000, LL = -1.0368413, nd = 0.0000471, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 86, lrate = 1.00000, LL = -1.0368403, nd = 0.0000433, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 87, lrate = 1.00000, LL = -1.0368393, nd = 0.0000401, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 88, lrate = 1.00000, LL = -1.0368384, nd = 0.0000374, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 89, lrate = 1.00000, LL = -1.0368375, nd = 0.0000350, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 90, lrate = 1.00000, LL = -1.0368366, nd = 0.0000330, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 91, lrate = 1.00000, LL = -1.0368358, nd = 0.0000312, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 92, lrate = 1.00000, LL = -1.0368350, nd = 0.0000297, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 93, lrate = 1.00000, LL = -1.0368342, nd = 0.0000281, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 94, lrate = 1.00000, LL = -1.0368334, nd = 0.0000270, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 95, lrate = 1.00000, LL = -1.0368327, nd = 0.0000261, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 96, lrate = 1.00000, LL = -1.0368319, nd = 0.0000253, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 97, lrate = 1.00000, LL = -1.0368312, nd = 0.0000245, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 98, lrate = 1.00000, LL = -1.0368305, nd = 0.0000238, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 99, lrate = 1.00000, LL = -1.0368298, nd = 0.0000232, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 100, lrate = 1.00000, LL = -1.0368292, nd = 0.0000226, D = 0.00220 0.00220 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 101, lrate = 1.00000, LL = -1.0368286, nd = 0.0000363, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 102, lrate = 1.00000, LL = -1.0368280, nd = 0.0000383, D = 0.00220 0.00220 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 103, lrate = 1.00000, LL = -1.0368274, nd = 0.0000400, D = 0.00220 0.00220 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 104, lrate = 1.00000, LL = -1.0368268, nd = 0.0000418, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 105, lrate = 1.00000, LL = -1.0368263, nd = 0.0000437, D = 0.00220 0.00220 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 106, lrate = 1.00000, LL = -1.0368257, nd = 0.0000457, D = 0.00220 0.00220 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 107, lrate = 1.00000, LL = -1.0368252, nd = 0.0000268, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 108, lrate = 1.00000, LL = -1.0368246, nd = 0.0000325, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 109, lrate = 1.00000, LL = -1.0368241, nd = 0.0000206, D = 0.00220 0.00220 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 110, lrate = 1.00000, LL = -1.0368236, nd = 0.0000265, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 111, lrate = 1.00000, LL = -1.0368231, nd = 0.0000184, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 112, lrate = 1.00000, LL = -1.0368227, nd = 0.0000228, D = 0.00220 0.00220 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 113, lrate = 1.00000, LL = -1.0368222, nd = 0.0000172, D = 0.00220 0.00220 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 114, lrate = 1.00000, LL = -1.0368217, nd = 0.0000203, D = 0.00220 0.00220 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 115, lrate = 1.00000, LL = -1.0368213, nd = 0.0000165, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 116, lrate = 1.00000, LL = -1.0368209, nd = 0.0000184, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 117, lrate = 1.00000, LL = -1.0368205, nd = 0.0000158, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 118, lrate = 1.00000, LL = -1.0368201, nd = 0.0000171, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 119, lrate = 1.00000, LL = -1.0368197, nd = 0.0000154, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 120, lrate = 1.00000, LL = -1.0368193, nd = 0.0000162, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 121, lrate = 1.00000, LL = -1.0368189, nd = 0.0000150, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 122, lrate = 1.00000, LL = -1.0368186, nd = 0.0000154, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 123, lrate = 1.00000, LL = -1.0368182, nd = 0.0000146, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 124, lrate = 1.00000, LL = -1.0368179, nd = 0.0000148, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 125, lrate = 1.00000, LL = -1.0368175, nd = 0.0000141, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 126, lrate = 1.00000, LL = -1.0368172, nd = 0.0000141, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 127, lrate = 1.00000, LL = -1.0368169, nd = 0.0000137, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 128, lrate = 1.00000, LL = -1.0368166, nd = 0.0000137, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 129, lrate = 1.00000, LL = -1.0368163, nd = 0.0000133, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 130, lrate = 1.00000, LL = -1.0368160, nd = 0.0000132, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 131, lrate = 1.00000, LL = -1.0368157, nd = 0.0000129, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 132, lrate = 1.00000, LL = -1.0368154, nd = 0.0000128, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 133, lrate = 1.00000, LL = -1.0368151, nd = 0.0000125, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 134, lrate = 1.00000, LL = -1.0368149, nd = 0.0000124, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 135, lrate = 1.00000, LL = -1.0368146, nd = 0.0000122, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 136, lrate = 1.00000, LL = -1.0368144, nd = 0.0000120, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 137, lrate = 1.00000, LL = -1.0368141, nd = 0.0000118, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 138, lrate = 1.00000, LL = -1.0368139, nd = 0.0000117, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 139, lrate = 1.00000, LL = -1.0368136, nd = 0.0000115, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 140, lrate = 1.00000, LL = -1.0368134, nd = 0.0000113, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 141, lrate = 1.00000, LL = -1.0368132, nd = 0.0000111, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 142, lrate = 1.00000, LL = -1.0368130, nd = 0.0000110, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 143, lrate = 1.00000, LL = -1.0368128, nd = 0.0000108, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 144, lrate = 1.00000, LL = -1.0368126, nd = 0.0000107, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 145, lrate = 1.00000, LL = -1.0368124, nd = 0.0000105, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 146, lrate = 1.00000, LL = -1.0368122, nd = 0.0000104, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 147, lrate = 1.00000, LL = -1.0368120, nd = 0.0000102, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 148, lrate = 1.00000, LL = -1.0368118, nd = 0.0000100, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 149, lrate = 1.00000, LL = -1.0368116, nd = 0.0000099, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 150, lrate = 1.00000, LL = -1.0368114, nd = 0.0000098, D = 0.00219 0.00219 took 0.10 seconds - amica.core:optimize
INFO     | Iteration 151, lrate = 1.00000, LL = -1.0368113, nd = 0.0000096, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 152, lrate = 1.00000, LL = -1.0368111, nd = 0.0000095, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 153, lrate = 1.00000, LL = -1.0368109, nd = 0.0000093, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 154, lrate = 1.00000, LL = -1.0368108, nd = 0.0000092, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 155, lrate = 1.00000, LL = -1.0368106, nd = 0.0000090, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 156, lrate = 1.00000, LL = -1.0368105, nd = 0.0000089, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 157, lrate = 1.00000, LL = -1.0368103, nd = 0.0000088, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 158, lrate = 1.00000, LL = -1.0368102, nd = 0.0000086, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 159, lrate = 1.00000, LL = -1.0368100, nd = 0.0000084, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 160, lrate = 1.00000, LL = -1.0368099, nd = 0.0000082, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 161, lrate = 1.00000, LL = -1.0368098, nd = 0.0000081, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 162, lrate = 1.00000, LL = -1.0368096, nd = 0.0000080, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 163, lrate = 1.00000, LL = -1.0368095, nd = 0.0000080, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 164, lrate = 1.00000, LL = -1.0368094, nd = 0.0000079, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 165, lrate = 1.00000, LL = -1.0368092, nd = 0.0000078, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 166, lrate = 1.00000, LL = -1.0368091, nd = 0.0000077, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 167, lrate = 1.00000, LL = -1.0368090, nd = 0.0000076, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 168, lrate = 1.00000, LL = -1.0368089, nd = 0.0000076, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 169, lrate = 1.00000, LL = -1.0368088, nd = 0.0000075, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 170, lrate = 1.00000, LL = -1.0368087, nd = 0.0000074, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 171, lrate = 1.00000, LL = -1.0368086, nd = 0.0000073, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 172, lrate = 1.00000, LL = -1.0368085, nd = 0.0000072, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 173, lrate = 1.00000, LL = -1.0368084, nd = 0.0000071, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 174, lrate = 1.00000, LL = -1.0368083, nd = 0.0000071, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 175, lrate = 1.00000, LL = -1.0368082, nd = 0.0000070, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 176, lrate = 1.00000, LL = -1.0368081, nd = 0.0000069, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 177, lrate = 1.00000, LL = -1.0368080, nd = 0.0000068, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Iteration 178, lrate = 1.00000, LL = -1.0368079, nd = 0.0000067, D = 0.00219 0.00219 took 0.09 seconds - amica.core:optimize
INFO     | Iteration 179, lrate = 1.00000, LL = -1.0368078, nd = 0.0000067, D = 0.00219 0.00219 took 0.01 seconds - amica.core:optimize
INFO     | Exiting because likelihood increasing by less than 1e-07 for more than 5 iterations ... - amica.core:optimize
INFO     | Finished in 12.32 seconds - amica.core:optimize

We can prove that the ICA model applies by reverting the unmixing.

X_rec = models["AMICA"] @ ica.mixing_.T + ica.mean_
np.testing.assert_allclose(X, X_rec)

# FastICA
fastica = FastICA(n_components=3, whiten="arbitrary-variance", random_state=0)
models["FastICA"] = fastica.fit_transform(X)
labels["FastICA"] = "FastICA recovered signals"

Plot results

import matplotlib.pyplot as plt

# Merge dictionaries into one mapping title -> data
to_plot = {
    "Observed mixtures": X,
    "True sources": S,
}
to_plot.update({ labels[k]: v for k, v in models.items() })

colors = ["red", "steelblue", "orange"]

fig, axes = plt.subplots(len(to_plot), 1, figsize=(8, 6), sharex=True)
for ax, (title, model) in zip(axes, to_plot.items()):
    ax.set_title(title)
    for sig, color in zip(model.T, colors):
        ax.plot(sig, color=color, lw=1)

plt.tight_layout()
plt.show()
Observed mixtures, True sources, AMICA recovered signals, FastICA recovered signals

Total running time of the script: (0 minutes 12.854 seconds)

Gallery generated by Sphinx-Gallery