Separación de fuentes ocultas

Beginner

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

Introducción

En este laboratorio, usaremos FastICA para realizar la separación de fuentes ocultas en una señal mixta. La separación de fuentes ocultas es una técnica utilizada para separar señales mixtas en sus componentes independientes originales. Esto es útil en varios campos como el procesamiento de señales, el procesamiento de imágenes y el análisis de datos. Usaremos la biblioteca scikit-learn de Python para realizar ICA y PCA en una señal mixta de muestra.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje comentarios después de la sesión y resolveremos el problema para usted de inmediato.

Generar datos de muestra

Generaremos una señal mixta de muestra que constará de tres componentes independientes. Agregaremos ruido a la señal y normalizaremos los datos. También generaremos una matriz de mezcla para mezclar nuestras tres componentes independientes.

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)  ## Señal 1 : señal sinusoidal
s2 = np.sign(np.sin(3 * time))  ## Señal 2 : señal cuadrada
s3 = signal.sawtooth(2 * np.pi * time)  ## Señal 3: señal diente de sierra

S = np.c_[s1, s2, s3]
S += 0.2 * np.random.normal(size=S.shape)  ## Agregar ruido

S /= S.std(axis=0)  ## Normalizar datos
## Mezclar datos
A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]])  ## Matriz de mezcla
X = np.dot(S, A.T)  ## Generar observaciones

Ajustar los modelos de ICA y PCA

Usaremos FastICA para estimar las fuentes independientes. Luego, calcularemos PCA para comparación.

from sklearn.decomposition import FastICA, PCA

## Calcular ICA
ica = FastICA(n_components=3, whiten="arbitrary-variance")
S_ = ica.fit_transform(X)  ## Reconstruir señales
A_ = ica.mixing_  ## Obtener la matriz de mezcla estimada

## Podemos `probar` que el modelo de ICA es aplicable revertir la desmezcla.
assert np.allclose(X, np.dot(S_, A_.T) + ica.mean_)

## Para comparación, calcular PCA
pca = PCA(n_components=3)
H = pca.fit_transform(X)  ## Reconstruir señales basadas en componentes ortogonales

Graficar los resultados

Graficaremos la señal mixta original, las fuentes independientes originales, las fuentes estimadas por ICA y las fuentes estimadas por PCA.

import matplotlib.pyplot as plt

plt.figure()

models = [X, S, S_, H]
names = [
    "Observaciones (señal mixta)",
    "Fuentes reales",
    "Señales recuperadas por ICA",
    "Señales recuperadas por PCA",
]
colors = ["rojo", "azul acero", "naranja"]

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()

Resumen

Hemos realizado con éxito la separación de fuentes ocultas en una señal mixta utilizando FastICA y PCA. Generamos una señal mixta de muestra que consta de tres componentes independientes, agregamos ruido y normalizamos los datos. Luego, generamos una matriz de mezcla para mezclar nuestras componentes independientes. Usamos FastICA para estimar las fuentes independientes y calculamos PCA para comparación. Finalmente, graficamos la señal mixta original, las fuentes independientes originales, las fuentes estimadas por ICA y las fuentes estimadas por PCA.