/*---------------------------------------------------------------------------* * IT++ * *---------------------------------------------------------------------------* * Copyright (c) 1995-2004 by Tony Ottosson, Thomas Eriksson, Pål Frenger, * * Tobias Ringström, and Jonas Samuelsson. * * * * Permission to use, copy, modify, and distribute this software and its * * documentation under the terms of the GNU General Public License is hereby * * granted. No representations are made about the suitability of this * * software for any purpose. It is provided "as is" without expressed or * * implied warranty. See the GNU General Public License for more details. * *---------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------* * FastICA for IT++ * *----------------------------------------------------------------------------------------* * This code is Copyright (C) 2004 by François CAYRE and Teddy FURON * * TEMICS Project * * INRIA/Rennes (IRISA) * * Campus Universitaire de Beaulieu * * 35042 RENNES cedex FRANCE * * * * Email : firstname.lastname@irisa.fr * * * * This is the IT++ implementation of the original Matlab package FastICA. * * * * Matlab package is Copyright (C) 1998 by Jarmo HURRI, Hugo GÄVERT, Jaakko SÄRELÄ and * * Aapo HYVÄRINEN * * Laboratory of Information and Computer Science * * Helsinki University of Technology * * * * URL : http://www.cis.hut.fi/projects/ica/fastica/about.shtml * * * * If you use results given by this FastICA software in an article for a scientific * * journal, conference proceedings or similar, please include the following original * * reference in the bibliography : * * * * A. Hyvärinen. Fast and Robust Fixed-Point Algorithms for Independent Component * * Analysis. IEEE Transactions on Neural Networks 10(3):626-634, 1999. * *----------------------------------------------------------------------------------------* * DISCLAIMER * * * * This software package is free software ; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the Free Software * * Foundation ; either version 2 of the License, or any later version. * * * * The software package is distributed in the hope that it will be useful, but WITHOUT * * ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * * A PARTICULAR PURPOSE. * * See the GNU General Public License for more details. * * * *----------------------------------------------------------------------------------------* * Differences with the original Matlab implementation : * * - no GUI * * - return something even in the case of a convergence problem * * - optimization of SVD decomposition (performed 2 times in Matlab, only 1 time in IT++) * * - default approach is SYMM wit non-linearity POW3 * *----------------------------------------------------------------------------------------*/ #include "itbase.h" #include "stdio.h" #ifdef NO_LAPACK #define __THIS_PROGRAM_WILL_NOT_RUN__ #endif #ifdef NO_CBLAS #define __THIS_PROGRAM_WILL_NOT_RUN__ #endif #ifdef __THIS_PROGRAM_WILL_NOT_RUN__ int main() { cout << "LAPACK and CBLAS is needed for this test program" << endl; } #else int main() { FILE * fpin= NULL; float tmp= 0.0; // Separate nrIC independent components in nrSamples samples int nrSamples= 0, nrIC= 0; cout << "\nTest program for FastICA / IT++\n"; cout << "\n\nFastICA (C) 1998\nJ. Hurri, H. Gävert, J. Särelä, A. Hyvärinen"; cout << "\nLaboratory of Information and Computer Science\nHelsinki University of Technology"; cout << "\n\nIT++ port from Matlab by F. Cayre and T. Furon\nTEMICS Team\nIRISA - INRIA/Rennes" << endl; cout << "\nFastICA is the implementation of : \n"; cout << "A. Hyvärinen, Fast and robust fixed-point algorithms for independent component analysis, IEEE Transactions on Neural Networks 10(3):626-634, 1999.\n" << endl; cout << "\nSample test data come from fastiCa C standalone version of fastICA, (C) 2003 Jonathan Marchini : " << endl; cout << "URL : http://www.stats.ox.ac.uk/~marchini/software/fastICA/fastiCa.tgz\n" << endl; cout << "==========================================================================" << endl; fpin = fopen( "fastica_test.mat", "r"); fscanf( fpin, "%d", &nrSamples ); fscanf( fpin, "%d", &nrIC ); mat X = zeros( nrIC, nrSamples ); for ( int i= 0; i< nrSamples; i++ ) for ( int j= 0; j< nrIC; j++ ) { fscanf( fpin , "%f", &tmp); X(j,i)= tmp; } fclose( fpin ); // Instantiate an ICA object with default parameters : SYMM approach and POW3 non-linearity // Be sure that : // - nrSamples = number of samples = nb of columns of the input matrix // - nrIC = number of sensors = nb of rows of the input matrix FastICA my_fastica( X ); // Set number of independent components to separate : // By default, this value is taken from the dimension of // the input data. This line is for illustration purposes. // May help in some cases. my_fastica.set_nrIC(nrIC); // Perform ICA my_fastica.separate(); cout << "Use default parameters:" << endl; // Get results : mixing and separating matrices cout << "Mixing matrix = " << my_fastica.get_mixing_matrix() << endl; cout << "Separation matrix = " << my_fastica.get_separating_matrix() << endl; // Get result : separated independent components cout << endl << "separated independent components = " << my_fastica.get_IC(); // Another test with other parameters cout << "==========================================================" << endl; cout << "Use Gaussian non-linearity and deflation approach :" << endl; FastICA my_fastica2(X); // Set GAUSS non-linearity my_fastica2.set_non_linearity(FICA_NONLIN_GAUSS); // Use deflation approach : IC are computed one by one my_fastica2.set_approach( FICA_APPROACH_DEFL ); // Perform ICA my_fastica2.separate(); // Get results cout << "Mixing matrix = " << my_fastica2.get_mixing_matrix() << endl; cout << "Separation matrix = " << my_fastica2.get_separating_matrix() << endl; cout << endl << "separated independent components = " << my_fastica2.get_IC() << endl; exit( 0 ); } #endif