[PYTHON] ICA avec Scipy

J'ai écrit ICA pour la première fois depuis longtemps pour étudier le numpy. Lorsque j'essaie de l'utiliser, il est de manière inattendue gênant de gérer le tableau et la matrice. Y a-t-il un bon moyen?

fast_ica.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-
import scipy as sp
import numpy as np
import matplotlib.pyplot as plt

def g( val, alpha = 0.01 ):
    return np.tanh( alpha * val )

def gd( val, alpha = 0.01 ):
    return alpha * ( 1.0 - np.asarray( np.tanh( alpha * val ) ) )

def sym_orth( sig ):
    a,b,c = np.linalg.svd( sig * sig.T )
    return np.dot( np.dot( a, np.dot( np.diag( np.sqrt( 1./ b ) ), c ) ), sig )

def fast_ica( sig ):
    m,n = sig.shape

    #Blanchiment
    u,s,v = np.linalg.svd( sig, full_matrices=False)
    v = np.sqrt( n ) * v

    #Initialisation du filtre d'isolement
    w = np.random.rand( m, m )
    w = w / np.matrix( [ [ np.linalg.norm( w[ :, x ] ) ] * m for x in xrange( m ) ] ).T
    w = sym_orth( w )

    #ICA
    err = 1.0
    it = 0
    max_iter = 3000
    while 1e-12 < min( err , it < max_iter ):
        last_w = w
        w1 =  np.dot( v , g( np.dot( w.T , v ) ).T )
        w2 = np.multiply( np.dot( gd( np.dot( w.T, v ) ), np.ones( (n, 1 ) ) ) , w )
        w = ( w1 - w2 ) / n
        w = sym_orth( w )
        err = np.sum( np.abs( np.abs(w) - np.abs(last_w) ) )
        it += 1

    #Créez un filtre de séparation basé sur le gain du 0ème signal
    W = np.dot( np.diag( np.ravel( u[0,] ) ), np.dot( np.diag( s ) , w.T ) )
    return np.dot( W, v )  / np.sqrt( n )

def main():
    #Distribution super gaussienne avec distribution Laplace
    s = np.random.laplace( 0., 1.0, ( 2, 10000 ) )
    a = np.asmatrix( np.random.rand( 2,2 ) )
    x = a * s
    y = np.asarray( fast_ica( x ) )
    plt.scatter( y[0,], y[1,] )
    plt.show()
    return

if __name__ == '__main__':
    main()

Recommended Posts

ICA avec Scipy
LPC avec Scipy
CORDIC avec Scipy
Créer un filtre avec scipy
Normariser les données avec Scipy
Utilisez OpenBLAS avec numpy, scipy
Extraire la valeur de crête avec scipy
Moyenne harmonique par Python (en utilisant SciPy)
Calculer la distribution de l'échantillon avec Scipy (distribution discrète)
Générer une distribution normale avec SciPy
scipy Voronoi
Installez Scipy
Si scipy est python 2.7.8, l'installation de pip trébuche
Utilisez BLAS / LAPACK multi-thread avec numpy / scipy
Utilisation d'Intel MKL avec NumPy / SciPy (version de novembre 2019)
Une doublure pour créer des images de Lena avec Scipy
Créer un diagramme de dispersion 3D avec SciPy + matplotlib (Python)