AS cwiczenia ICA: Różnice pomiędzy wersjami

Z Brain-wiki
Linia 55: Linia 55:
 
from scipy.io import wavfile
 
from scipy.io import wavfile
  
wavfile.write('ica_s1.wav')
+
wavfile.write('ica_s1.wav', rate, ica_s1)
 
</source>
 
</source>
  

Wersja z 22:57, 8 gru 2015

Analiza składowych niezależnych

Ogólna zasada działania algorytmu analizy składowych niezależnych (Independent Component Analysis, ICA) została wprowadzona na wykładzie.

Przypomnienie: Rozważmy problem “cocktail party”, w którym próbujemy rozdzielić mieszaninę sygnałów zarejestrowanych przez kilka odbiorników znajdujących się w różnych miejscach na poszczególne źródła. Określając macierz sygnałów źródłowych, której kolumny oznaczają wartości sygnałów dla wszystkich źródeł w kolejnych chwilach czasu, jako [math]s[/math], oraz macierz mieszanin, zawierającą kolejne próbki czasowe sygnałów zarejestrowanych przez odbiorniki, jako [math]x[/math], możemy zapisać powyższą sytuację:

[math]x_i^t = \sum_{j=1}^M{a_{ij} s_j^t}[/math],

gdzie w dowolnym punkcie czasowym [math]t[/math], wartość [math]x_i^t[/math] jest linową kombinacją wartości sygnałów źródłowych, z pewnymi stałymi współczynnikami mieszania [math]a_i^j[/math]. Po zgrupowaniu współczynników mieszających w macierzy [math]\mathbf{A} = [a_{ij}] \in\mathbb{R}_{M \times M}[/math] model ten można zapisać za pomocą równania:

[math]\mathbf{x} = \mathbf{A} \mathbf{s}[/math].

Przy pomocy tego modelu musimy wyestymować zarówno [math]\mathbf{A}[/math], jak i [math]\mathbf{s}[/math], dlatego zakładamy, że komponenty [math]s_i[/math] są statystycznie niezależne i mają rozkład niegaussowski. Zakładamy również, że macierz [math]\mathbf{A}[/math] jest kwadratowa. Dzięki temu, po wyestymowaniu macierzy [math]\mathbf{A}[/math], obliczamy jej odwrotność [math]\mathbf{A}^{-1} = \mathbf{W}[/math] i otrzymujemy niezależne komponenty:

[math]\mathbf{s} = \mathbf{W} \mathbf{x}[/math].

Ćwiczenie 1

  • Wygeneruj 3-kanałowy sygnał źródłowy S będący superpozycją sinusa o częstości 5 Hz, prostokąta i piły z odpowiednimi współczynnikami, określanymi jako współczynniki mieszania:

A = np.array([[1, 1, 1], [2.0, 0.5, 1.0], [1.5, 1.5, 0.5]]).T

  • Przeprowadź dekompozycję sygnału przy pomocy implementacji ICA w pakiecie scikit-learn. W tym celu należy zaimportować funkcję FastICA:
from sklearn.decomposition import FastICA

Dekompozycja ICA wygląda następująco:

ica = FastICA(n_components=3) # liczba komponentów równa jest liczbie kanałów
S_ = ica.fit_transform(X) # macierz zrekonstruowanych sygnałów źródłowych S; X jest macierzą mieszanin
A_ = ica.mixing_ # wyestymowana macierz mieszająca
  • Następnie porównaj otrzymany wynik z wynikiem dekompozycji przeprowadzonej przy pomocy programu Svarog. W tym celu wyeksportuj sygnał do pliku binarnego, a następnie wybierz Tools -> Independent Component Analysis -> Compute ICA.

Ćwiczenie 2

Wczytaj przy pomocy pythona sygnały audio x1, x2 i x3 zarejestrowane przez trzy odbiorniki. Użyj do tego modułu scipy.io.wavfile:

from scipy.io import wavfile

rate, x1 = wavfile.read('x1.wav')

Następnie przeprowadź dekompozycję ICA. Zapisz otrzymane komponenty do plików audio:

from scipy.io import wavfile

wavfile.write('ica_s1.wav', rate, ica_s1)

i porównaj z orginalnymi sygnałami źródłowymi.