Run Infomax or extended-Infomax on a matrix of data. Uses a mini-batch stochastic gradient descent algorithm. The matrix can be prewhitened in several ways. The default is to perform sphering using the inverse of the square root of the covariance matrix of the original data, the method used by the 'EEGLAB' and 'MNE-Python' toolboxes in other languages. Whitening methods implemented in the package whitening are PCA, ZCA, ZCA-cor, and PCA-cor. Please see the whitening package for further information on their implementation of these methods.

run_infomax(
  x,
  centre = TRUE,
  pca = NULL,
  anneal = 0.98,
  annealdeg = 60,
  tol = 1e-07,
  lrate = NULL,
  blocksize = NULL,
  kurtsize = 6000,
  maxiter = 200,
  extended = TRUE,
  whiten = c("sqrtm", "ZCA", "PCA", "ZCA-cor", "PCA-cor", "none"),
  verbose = TRUE
)

Arguments

x

matrix of data; features in columns, samples in rows.

centre

Mean-centre columns before running the algorithm. Defaults to TRUE.

pca

A scalar. Use PCA dimensionality reduction. Often helpful when the data is rank deficient.

anneal

Annealing rate at which learning rate reduced.

annealdeg

Angle at which learning rate reduced.

tol

Tolerance for convergence of ICA. Defaults to 1e-07.

lrate

Initial learning rate. NULL

blocksize

Size of blocks of data used for learning.

kurtsize

Size of blocks for kurtosis checking. Defaults to 6000 or length of data, whichever is smaller.

maxiter

Maximum number of iterations. Defaults to 200.

extended

Run extended-Infomax. Defaults to TRUE.

whiten

Whitening method to use. See notes on usage.

verbose

Print informative messages for each update of the algorithm.

Value

A list containing:

  • S: Matrix of source estimates

  • M: Estimated mixing matrix

  • W: Estimated unmixing matrix

  • iter: Number of iterations completed

References

  • Bell, A.J., & Sejnowski, T.J. (1995). An information-maximization approach to blind separation and blind deconvolution. Neural Computation, 7, 1129-159

  • Makeig, S., Bell, A.J., Jung, T-P and Sejnowski, T.J., "Independent component analysis of electroencephalographic data," In: D. Touretzky, M. Mozer and M. Hasselmo (Eds). Advances in Neural Information Processing Systems 8:145-151, MIT Press, Cambridge, MA (1996).

Author

Matt Craddock matt@mattcraddock.com

Examples

time_x <- seq(0, 1, by = 1/256) source_a <- sin(2 * pi * 5 * time_x) source_b <- sin(2 * pi * 10 * time_x) plot(time_x, source_a, type = "l")
plot(time_x, source_b, type = "l")
plot(time_x, source_a + 2 * source_b, type = "l")
plot(time_x, source_a * 3.4 + 1.5 * source_b, type = "l")
mixed_data <- matrix(NA, nrow = length(time_x), ncol = 2) mixed_data[, 1] <- source_a + 2 * source_b mixed_data[, 2] <- source_a * 3.4 + 1.5 * source_b dat_out <- run_infomax(mixed_data, whiten = "PCA")
#> Removing column means...
#> Step: 1, lrate: 0.007213, wchange: 0.40176171, angledelta: 0.0
#> Step: 2, lrate: 0.007213, wchange: 0.30898889, angledelta: 0.0
#> Step: 3, lrate: 0.007213, wchange: 0.09925584, angledelta: 94.4
#> Step: 4, lrate: 0.007069, wchange: 0.03233663, angledelta: 43.6
#> Step: 5, lrate: 0.007069, wchange: 0.00827125, angledelta: 61.4
#> Step: 6, lrate: 0.006928, wchange: 0.00380327, angledelta: 146.7
#> Step: 7, lrate: 0.006789, wchange: 0.00127687, angledelta: 76.4
#> Step: 8, lrate: 0.006653, wchange: 0.03292234, angledelta: 101.8
#> Step: 9, lrate: 0.006520, wchange: 0.02174335, angledelta: 164.1
#> Step: 10, lrate: 0.006390, wchange: 0.00143240, angledelta: 46.3
#> Step: 11, lrate: 0.006390, wchange: 0.00192741, angledelta: 31.5
#> Step: 12, lrate: 0.006390, wchange: 0.01679226, angledelta: 159.3
#> Step: 13, lrate: 0.006262, wchange: 0.00909932, angledelta: 73.5
#> Step: 14, lrate: 0.006137, wchange: 0.01100249, angledelta: 145.7
#> Step: 15, lrate: 0.006014, wchange: 0.01048766, angledelta: 98.1
#> Step: 16, lrate: 0.005894, wchange: 0.00273001, angledelta: 151.1
#> Step: 17, lrate: 0.005776, wchange: 0.00864097, angledelta: 143.5
#> Step: 18, lrate: 0.005661, wchange: 0.00868352, angledelta: 151.4
#> Step: 19, lrate: 0.005547, wchange: 0.00660042, angledelta: 42.9
#> Step: 20, lrate: 0.005547, wchange: 0.01898672, angledelta: 126.6
#> Step: 21, lrate: 0.005436, wchange: 0.00272493, angledelta: 108.2
#> Step: 22, lrate: 0.005328, wchange: 0.00398342, angledelta: 77.6
#> Step: 23, lrate: 0.005221, wchange: 0.01164268, angledelta: 96.4
#> Step: 24, lrate: 0.005117, wchange: 0.01717969, angledelta: 107.6
#> Step: 25, lrate: 0.005014, wchange: 0.00344455, angledelta: 128.3
#> Step: 26, lrate: 0.004914, wchange: 0.00302066, angledelta: 87.4
#> Step: 27, lrate: 0.004816, wchange: 0.00714341, angledelta: 172.9
#> Step: 28, lrate: 0.004719, wchange: 0.00412319, angledelta: 153.6
#> Step: 29, lrate: 0.004625, wchange: 0.00120804, angledelta: 146.3
#> Step: 30, lrate: 0.004533, wchange: 0.00222478, angledelta: 64.0
#> Step: 31, lrate: 0.004442, wchange: 0.00231503, angledelta: 143.4
#> Step: 32, lrate: 0.004353, wchange: 0.00176718, angledelta: 64.4
#> Step: 33, lrate: 0.004266, wchange: 0.00763487, angledelta: 177.2
#> Step: 34, lrate: 0.004181, wchange: 0.00671005, angledelta: 161.8
#> Step: 35, lrate: 0.004097, wchange: 0.00247586, angledelta: 82.7
#> Step: 36, lrate: 0.004015, wchange: 0.00237678, angledelta: 112.1
#> Step: 37, lrate: 0.003935, wchange: 0.04654952, angledelta: 126.2
#> Step: 38, lrate: 0.003856, wchange: 0.01065035, angledelta: 168.2
#> Step: 39, lrate: 0.003779, wchange: 0.01068438, angledelta: 40.1
#> Step: 40, lrate: 0.003779, wchange: 0.00564857, angledelta: 138.8
#> Step: 41, lrate: 0.003703, wchange: 0.00243226, angledelta: 128.5
#> Step: 42, lrate: 0.003629, wchange: 0.00206821, angledelta: 135.7
#> Step: 43, lrate: 0.003557, wchange: 0.00350697, angledelta: 95.9
#> Step: 44, lrate: 0.003486, wchange: 0.00714390, angledelta: 120.2
#> Step: 45, lrate: 0.003416, wchange: 0.00625535, angledelta: 165.7
#> Step: 46, lrate: 0.003348, wchange: 0.00652122, angledelta: 129.5
#> Step: 47, lrate: 0.003281, wchange: 0.00163643, angledelta: 163.9
#> Step: 48, lrate: 0.003215, wchange: 0.00255286, angledelta: 102.3
#> Step: 49, lrate: 0.003151, wchange: 0.00278327, angledelta: 164.9
#> Step: 50, lrate: 0.003088, wchange: 0.00142293, angledelta: 12.9
#> Step: 51, lrate: 0.003088, wchange: 0.00502192, angledelta: 119.8
#> Step: 52, lrate: 0.003026, wchange: 0.00585193, angledelta: 153.4
#> Step: 53, lrate: 0.002965, wchange: 0.00942520, angledelta: 146.1
#> Step: 54, lrate: 0.002906, wchange: 0.00124618, angledelta: 131.7
#> Step: 55, lrate: 0.002848, wchange: 0.00174847, angledelta: 121.9
#> Step: 56, lrate: 0.002791, wchange: 0.00062289, angledelta: 96.7
#> Step: 57, lrate: 0.002735, wchange: 0.00087559, angledelta: 38.2
#> Step: 58, lrate: 0.002735, wchange: 0.00823085, angledelta: 160.0
#> Step: 59, lrate: 0.002681, wchange: 0.00103450, angledelta: 152.2
#> Step: 60, lrate: 0.002627, wchange: 0.00298394, angledelta: 31.9
#> Step: 61, lrate: 0.002627, wchange: 0.00197075, angledelta: 120.2
#> Step: 62, lrate: 0.002574, wchange: 0.00079063, angledelta: 130.8
#> Step: 63, lrate: 0.002523, wchange: 0.00014555, angledelta: 70.6
#> Step: 64, lrate: 0.002472, wchange: 0.00027422, angledelta: 160.8
#> Step: 65, lrate: 0.002423, wchange: 0.00058042, angledelta: 57.9
#> Step: 66, lrate: 0.002423, wchange: 0.00110567, angledelta: 155.5
#> Step: 67, lrate: 0.002375, wchange: 0.00401017, angledelta: 138.5
#> Step: 68, lrate: 0.002327, wchange: 0.00103905, angledelta: 167.9
#> Step: 69, lrate: 0.002281, wchange: 0.00074961, angledelta: 110.5
#> Step: 70, lrate: 0.002235, wchange: 0.00126778, angledelta: 122.9
#> Step: 71, lrate: 0.002190, wchange: 0.00084790, angledelta: 171.8
#> Step: 72, lrate: 0.002146, wchange: 0.00023502, angledelta: 115.9
#> Step: 73, lrate: 0.002103, wchange: 0.00118653, angledelta: 110.4
#> Step: 74, lrate: 0.002061, wchange: 0.00415219, angledelta: 153.2
#> Step: 75, lrate: 0.002020, wchange: 0.00066915, angledelta: 154.5
#> Step: 76, lrate: 0.001980, wchange: 0.00269301, angledelta: 38.9
#> Step: 77, lrate: 0.001980, wchange: 0.00078464, angledelta: 140.1
#> Step: 78, lrate: 0.001940, wchange: 0.00090439, angledelta: 31.2
#> Step: 79, lrate: 0.001940, wchange: 0.00042053, angledelta: 65.2
#> Step: 80, lrate: 0.001901, wchange: 0.00193299, angledelta: 109.5
#> Step: 81, lrate: 0.001863, wchange: 0.00039309, angledelta: 86.0
#> Step: 82, lrate: 0.001826, wchange: 0.00058562, angledelta: 62.2
#> Step: 83, lrate: 0.001790, wchange: 0.00059043, angledelta: 167.9
#> Step: 84, lrate: 0.001754, wchange: 0.00044847, angledelta: 114.5
#> Step: 85, lrate: 0.001719, wchange: 0.00019771, angledelta: 149.6
#> Step: 86, lrate: 0.001684, wchange: 0.00030092, angledelta: 156.1
#> Step: 87, lrate: 0.001651, wchange: 0.00132750, angledelta: 168.7
#> Step: 88, lrate: 0.001618, wchange: 0.00057468, angledelta: 95.7
#> Step: 89, lrate: 0.001585, wchange: 0.00026641, angledelta: 145.4
#> Step: 90, lrate: 0.001554, wchange: 0.00240914, angledelta: 58.2
#> Step: 91, lrate: 0.001554, wchange: 0.00027859, angledelta: 94.5
#> Step: 92, lrate: 0.001522, wchange: 0.00058289, angledelta: 64.1
#> Step: 93, lrate: 0.001492, wchange: 0.00010335, angledelta: 173.1
#> Step: 94, lrate: 0.001462, wchange: 0.00005670, angledelta: 106.4
#> Step: 95, lrate: 0.001433, wchange: 0.00057647, angledelta: 88.7
#> Step: 96, lrate: 0.001404, wchange: 0.00030730, angledelta: 157.1
#> Step: 97, lrate: 0.001376, wchange: 0.00025081, angledelta: 108.1
#> Step: 98, lrate: 0.001349, wchange: 0.00021157, angledelta: 121.6
#> Step: 99, lrate: 0.001322, wchange: 0.00025661, angledelta: 80.5
#> Step: 100, lrate: 0.001295, wchange: 0.00028904, angledelta: 147.0
#> Step: 101, lrate: 0.001269, wchange: 0.00052162, angledelta: 140.7
#> Step: 102, lrate: 0.001244, wchange: 0.00051164, angledelta: 142.2
#> Step: 103, lrate: 0.001219, wchange: 0.00010432, angledelta: 170.6
#> Step: 104, lrate: 0.001195, wchange: 0.00002537, angledelta: 94.3
#> Step: 105, lrate: 0.001171, wchange: 0.00024836, angledelta: 135.6
#> Step: 106, lrate: 0.001147, wchange: 0.00006506, angledelta: 134.1
#> Step: 107, lrate: 0.001124, wchange: 0.00009401, angledelta: 57.0
#> Step: 108, lrate: 0.001124, wchange: 0.00014721, angledelta: 83.0
#> Step: 109, lrate: 0.001102, wchange: 0.00011790, angledelta: 124.1
#> Step: 110, lrate: 0.001080, wchange: 0.00017751, angledelta: 75.8
#> Step: 111, lrate: 0.001058, wchange: 0.00009962, angledelta: 132.1
#> Step: 112, lrate: 0.001037, wchange: 0.00008014, angledelta: 71.1
#> Step: 113, lrate: 0.001016, wchange: 0.00006054, angledelta: 112.6
#> Step: 114, lrate: 0.000996, wchange: 0.00006651, angledelta: 46.3
#> Step: 115, lrate: 0.000996, wchange: 0.00018732, angledelta: 114.5
#> Step: 116, lrate: 0.000976, wchange: 0.00005050, angledelta: 101.7
#> Step: 117, lrate: 0.000957, wchange: 0.00005726, angledelta: 52.9
#> Step: 118, lrate: 0.000957, wchange: 0.00000767, angledelta: 163.7
#> Step: 119, lrate: 0.000938, wchange: 0.00004807, angledelta: 78.3
#> Step: 120, lrate: 0.000919, wchange: 0.00007385, angledelta: 92.5
#> Step: 121, lrate: 0.000900, wchange: 0.00005367, angledelta: 133.0
#> Step: 122, lrate: 0.000882, wchange: 0.00001117, angledelta: 166.7
#> Step: 123, lrate: 0.000865, wchange: 0.00000596, angledelta: 85.4
#> Step: 124, lrate: 0.000847, wchange: 0.00020660, angledelta: 99.4
#> Step: 125, lrate: 0.000830, wchange: 0.00003612, angledelta: 132.1
#> Step: 126, lrate: 0.000814, wchange: 0.00003325, angledelta: 74.9
#> Step: 127, lrate: 0.000798, wchange: 0.00006194, angledelta: 164.6
#> Step: 128, lrate: 0.000782, wchange: 0.00006071, angledelta: 159.0
#> Step: 129, lrate: 0.000766, wchange: 0.00001497, angledelta: 93.4
#> Step: 130, lrate: 0.000751, wchange: 0.00005862, angledelta: 53.6
#> Step: 131, lrate: 0.000751, wchange: 0.00001312, angledelta: 67.1
#> Step: 132, lrate: 0.000736, wchange: 0.00010174, angledelta: 97.3
#> Step: 133, lrate: 0.000721, wchange: 0.00003932, angledelta: 146.3
#> Step: 134, lrate: 0.000707, wchange: 0.00001188, angledelta: 39.4
#> Step: 135, lrate: 0.000707, wchange: 0.00003263, angledelta: 109.1
#> Step: 136, lrate: 0.000692, wchange: 0.00000435, angledelta: 113.9
#> Step: 137, lrate: 0.000679, wchange: 0.00003757, angledelta: 98.2
#> Step: 138, lrate: 0.000665, wchange: 0.00000509, angledelta: 101.5
#> Step: 139, lrate: 0.000652, wchange: 0.00001042, angledelta: 92.0
#> Step: 140, lrate: 0.000639, wchange: 0.00000265, angledelta: 122.0
#> Step: 141, lrate: 0.000626, wchange: 0.00001253, angledelta: 142.1
#> Step: 142, lrate: 0.000613, wchange: 0.00001194, angledelta: 111.2
#> Step: 143, lrate: 0.000601, wchange: 0.00002552, angledelta: 136.5
#> Step: 144, lrate: 0.000589, wchange: 0.00002070, angledelta: 110.3
#> Step: 145, lrate: 0.000577, wchange: 0.00000288, angledelta: 89.8
#> Step: 146, lrate: 0.000566, wchange: 0.00000297, angledelta: 133.3
#> Step: 147, lrate: 0.000554, wchange: 0.00001696, angledelta: 123.6
#> Step: 148, lrate: 0.000543, wchange: 0.00000831, angledelta: 21.0
#> Step: 149, lrate: 0.000543, wchange: 0.00001757, angledelta: 157.9
#> Step: 150, lrate: 0.000532, wchange: 0.00000324, angledelta: 87.3
#> Step: 151, lrate: 0.000522, wchange: 0.00001152, angledelta: 137.8
#> Step: 152, lrate: 0.000511, wchange: 0.00001247, angledelta: 63.5
#> Step: 153, lrate: 0.000501, wchange: 0.00000703, angledelta: 98.4
#> Step: 154, lrate: 0.000491, wchange: 0.00000266, angledelta: 105.3
#> Step: 155, lrate: 0.000481, wchange: 0.00000334, angledelta: 57.1
#> ICA running time: 0.139 s
plot(time_x, dat_out$S[, 1], type = "l")
plot(time_x, dat_out$S[, 2], type = "l")