Introdução
Este laboratório demonstra o uso dos algoritmos FastICA e PCA, duas técnicas populares de análise de componentes independentes. A Análise de Componentes Independentes (ICA) é um método para separar sinais multivariados em subcomponentes aditivos que são maximamente independentes. Esta técnica encontra direções no espaço de características correspondentes a projeções com alta não-gaussianidade.
Dicas da Máquina Virtual
Após o arranque da VM, 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 a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.
Gerar Dados de Amostra
Neste passo, geramos dados de amostra utilizando um processo altamente não-gaussiano, 2 distribuições t de Student com um baixo número de graus de liberdade.
import numpy as np
from sklearn.decomposition import PCA, FastICA
rng = np.random.RandomState(42)
S = rng.standard_t(1.5, size=(20000, 2))
S[:, 0] *= 2.0
## Misturar dados
A = np.array([[1, 1], [0, 2]]) ## Matriz de mistura
X = np.dot(S, A.T) ## Gerar observações
Utilizar o Algoritmo PCA
Neste passo, utilizamos o algoritmo PCA para encontrar direções ortogonais no espaço de características bruto que correspondem a direções que explicam a máxima variância.
pca = PCA()
S_pca_ = pca.fit(X).transform(X)
Utilizar o Algoritmo FastICA
Neste passo, utilizamos o algoritmo FastICA, que encontra direções no espaço de características correspondentes a projeções com alta não-gaussianidade.
ica = FastICA(random_state=rng, whiten="arbitrary-variance")
S_ica_ = ica.fit(X).transform(X) ## Estimar as fontes
S_ica_ /= S_ica_.std(axis=0)
Plotar Resultados
Neste passo, plotamos os resultados utilizando matplotlib.
import matplotlib.pyplot as plt
def plot_samples(S, axis_list=None):
plt.scatter(
S[:, 0], S[:, 1], s=2, marker="o", zorder=10, color="steelblue", alpha=0.5
)
if axis_list is not None:
for axis, color, label in axis_list:
axis /= axis.std()
x_axis, y_axis = axis
plt.quiver(
(0, 0),
(0, 0),
x_axis,
y_axis,
zorder=11,
width=0.01,
scale=6,
color=color,
label=label,
)
plt.hlines(0, -3, 3)
plt.vlines(0, -3, 3)
plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.xlabel("x")
plt.ylabel("y")
plt.figure()
plt.subplot(2, 2, 1)
plot_samples(S / S.std())
plt.title("Fontes Independentes Verdadeiras")
axis_list = [(pca.components_.T, "orange", "PCA"), (ica.mixing_, "red", "ICA")]
plt.subplot(2, 2, 2)
plot_samples(X / np.std(X), axis_list=axis_list)
legend = plt.legend(loc="lower right")
legend.set_zorder(100)
plt.title("Observações")
plt.subplot(2, 2, 3)
plot_samples(S_pca_ / np.std(S_pca_, axis=0))
plt.title("Sinais recuperados por PCA")
plt.subplot(2, 2, 4)
plot_samples(S_ica_ / np.std(S_ica_))
plt.title("Sinais recuperados por ICA")
plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.36)
plt.show()
Resumo
Neste laboratório, aprendemos como utilizar os algoritmos FastICA e PCA em Python para realizar análise de componentes independentes e como visualizar os resultados usando matplotlib.