Separação de Fontes Cegas

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, utilizaremos o FastICA para realizar a separação de fontes cegas num sinal misturado. A separação de fontes cegas é uma técnica usada para separar sinais mistos nos seus componentes independentes originais. Isto é útil em vários campos, como processamento de sinal, processamento de imagem e análise de dados. Usaremos a biblioteca scikit-learn do Python para realizar ICA e PCA num sinal misto de amostra.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar o carregamento. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para si.

Gerar Dados de Amostra

Vamos gerar um sinal misto de amostra composto por três componentes independentes. Adicionaremos ruído ao sinal e padronizaremos os dados. Também geraremos uma matriz de mistura para misturar nossos três componentes independentes.

import numpy as np
from scipy import signal

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

s1 = np.sin(2 * time)  ## Sinal 1: sinal sinusoidal
s2 = np.sign(np.sin(3 * time))  ## Sinal 2: sinal quadrado
s3 = signal.sawtooth(2 * np.pi * time)  ## Sinal 3: sinal dente de serra

S = np.c_[s1, s2, s3]
S += 0.2 * np.random.normal(size=S.shape)  ## Adicionar ruído

S /= S.std(axis=0)  ## Padronizar os dados
## Misturar dados
A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]])  ## Matriz de mistura
X = np.dot(S, A.T)  ## Gerar observações

Ajustar Modelos ICA e PCA

Usaremos o FastICA para estimar as fontes independentes. Em seguida, computaremos a PCA para comparação.

from sklearn.decomposition import FastICA, PCA

## Computar ICA
ica = FastICA(n_components=3, whiten="arbitrary-variance")
S_ = ica.fit_transform(X)  ## Reconstruir sinais
A_ = ica.mixing_  ## Obter a matriz de mistura estimada

## Podemos "provar" que o modelo ICA se aplica invertendo a desmistura.
assert np.allclose(X, np.dot(S_, A_.T) + ica.mean_)

## Para comparação, computar PCA
pca = PCA(n_components=3)
H = pca.fit_transform(X)  ## Reconstruir sinais com base em componentes ortogonais

Plotar Resultados

Vamos plotar o sinal misto original, as fontes independentes originais, as fontes estimadas pelo ICA e as fontes estimadas pelo PCA.

import matplotlib.pyplot as plt

plt.figure()

models = [X, S, S_, H]
names = [
    "Observações (sinal misto)",
    "Fontes verdadeiras",
    "Sinais recuperados pelo ICA",
    "Sinais recuperados pelo PCA",
]
colors = ["red", "steelblue", "orange"]

for ii, (model, name) in enumerate(zip(models, names), 1):
    plt.subplot(4, 1, ii)
    plt.title(name)
    for sig, color in zip(model.T, colors):
        plt.plot(sig, color=color)

plt.tight_layout()
plt.show()

Resumo

Realizamos com sucesso a separação de fontes cegas num sinal misto utilizando FastICA e PCA. Gerámos um sinal misto de amostra composto por três componentes independentes, adicionámos ruído e normalizamos os dados. Em seguida, gerámos uma matriz de mistura para misturar os nossos componentes independentes. Utilizámos o FastICA para estimar as fontes independentes e calculámos a PCA para comparação. Finalmente, representámos graficamente o sinal misto original, as fontes independentes originais, as fontes estimadas pelo ICA e as fontes estimadas pelo PCA.