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.