T-SNE visualiza datos de alta dimensión, ciega a los revisores


t-Distributed Stochastic Neighbor Embedding (t-Distributed Stochastic Neighbor Embedding, t-SNE para abreviar) es una técnica de reducción de dimensionalidad, especialmente adecuada para Visualización de conjuntos de datos de alta dimensión

Caso clásico - Visualización de reducción de dimensionalidad de dígitos manuscritos MNIST

Tamaño de datos original de MNIST: 60000 * 784, cada dato 784 dimensiones
Después de 2D-t-SNE: 60000 x 2
Después de 3D-t-SNE: 60000 x 3

Se puede ver que reducir los datos de 784 dimensiones (tamaño de la imagen 28x28, 784 después del enderezamiento, Baidu si no conoce MNIST) a 2 o 3 dimensiones es un alto grado de compresión. El resultado después de la reducción de la dimensionalidad se muestra en la figura.

2D-t-SNE

La parte superior de 3D-t-SNE

es 2D-t-SNE. Los números 0-9 son un total de 10 clases, y cada clase tiene un color diferente. A través de imágenes bidimensionales, podemos ver fácilmente las diferencias de distribución de cada clase.

El caso t-SNE utilizado en el artículo

Documento: GANomaly: Semi-Supervised Anomaly Detection via Adversarial Training
separa los datos normales y los datos anormales en dos dimensiones, y se puede ver claramente que la distribución entre las dos categorías está limitada.

Papel: MAMA Net: Multi-scale Attention Memory Autoencoder Network for Anomaly Detection
utiliza t-SNE para visualizar el espacio latente del modelo (como la capa de cuello de botella del modelo U-NET) para comparar el impacto de usar EM y no usar la pérdida de EM en el espacio latente.

Artículo: Detección no supervisada de lesiones en resonancia magnética cerebral mediante codificadores automáticos antagónicos restringidos que
utiliza t-SNE para visualizar las diferencias de distribución entre imágenes sanas e imágenes anormales Se puede ver en las imágenes que las diferencias de distribución entre las dos son pequeñas.

De los ejemplos anteriores, se puede ver intuitivamente que t-SNE se usa mucho en la visualización. Antes de hacer tareas de clasificación, también podemos usarlo para ver si hay una línea divisoria clara entre las diferentes categorías. Si la línea divisoria es obvia, puede indicar que la tarea de clasificación es relativamente simple. Por el contrario, significa que no es fácil distinguir entre categorías, si nuestros resultados de clasificación no son muy buenos, podemos usar este gráfico para ilustrar la dificultad de la tarea. Si el resultado de la clasificación es muy bueno, también puede mostrar las ventajas del algoritmo.

Por supuesto, esto es solo un ejemplo, y sus funciones son más que eso.

t-SNE en acción

Sabiendo lo que hace, veamos cómo implementarlo con código. Después de muchas veces de práctica, se encuentra que aunque hay muchas formas de realizarlo, el método mejor y más conveniente es usarsklearn.manifold.TSNE

A continuación, explicaré 2 casos de uso de este método.

Tutorial de visualización de MNIST

Tutorial de visualización de Kaggle MNIST Lo anterior es muy detallado y también compara la diferencia entre PCA y t-SNE

Visualización de datos 3D de tumores cerebrales por resonancia magnética

Antecedentes y propósito experimentales : mocosos son datos tridimensionales de tumores de resonancia magnética cerebral, tamaño = 240x240x150, la capa tumoral en cada dato se considera una capa anormal y la capa sin tumor se considera una capa normal. Visualice usando t-SNE para ver si hay una diferencia en la distribución entre las capas normales y anormales.

La capa aquí se refiere al corte axial, es decir, la sección transversal. Un dato 3D tiene 150 capas, y el tamaño de cada capa es igual a 240x240

  • 1. Paquete de importación
import numpy as np
import matplotlib.pyplot as plt
from sklearn import manifold
from glob import glob
import nibabel as nib
  • 2. Cargar datos
    Mis datos son 3D y el formato es .nii.gz
# load data
brats = sorted(glob('BraTs/*.gz'))
brats_gt = sorted(glob('BraTsseg/*.gz'))

brats_tra = []
brats_label = []
for i, j in zip(brats, brats_gt):
    brats_np = nib.load(i).get_fdata()
    brats_gt_np = nib.load(j).get_fdata()

    assert brats_gt_np.shape == brats_np.shape

    z = brats_np.shape[-1]
    for zi in range(z):
        brats_tra.append(brats_np[..., zi].flatten())  # 横断层拉直,维度=240x240=57600
        if brats_gt_np[..., zi].any():
            brats_label.append(1)
        else:
            brats_label.append(0)
            
brats_array = np.array(brats_tra, dtype='uint8')  # [6200, 57600]
brats_label_array = np.array(brats_label, dtype='uint8')   # [6200]

El tamaño de brats_array es [6200, 57600], lo que significa que hay 6200 capas en total, y la dimensión de datos de cada capa es 57600, que se reduce a [6200, 2]

  • 3. Visualización - usando sklearn-TSNE
tsne = manifold.TSNE(n_components=2, init='pca', random_state=42).fit_transform(brats_array)

tsne shape [6200, 2], debido a que la dimensión de los datos es muy grande y se itera 1000 veces, es muy lento.

Introducción de parámetros

  • n_components (valor predeterminado: 2): la dimensión del espacio de incrustación, que debe reducirse a unas pocas dimensiones para escribir algunas dimensiones.
  • init: método de inicialización, principalmente usando inicialización PCA
  • perplejidad (predeterminado: 30): la perplejidad está relacionada con el número de vecinos más cercanos utilizados en otros algoritmos de aprendizaje múltiple. Considere elegir un valor entre 5 y 50.
  • n_iter (predeterminado: 1000): número máximo de iteraciones para la optimización. Debe ser por lo menos 250.
  • random_state: semilla aleatoria
  • Hay otros parámetros que se pueden ajustar. Consulte la documentación para obtener más información.
  1. normalización t-SNE
# tsne 归一化, 这一步可做可不做
x_min, x_max = tsne.min(0), tsne.max(0)
tsne_norm = (tsne - x_min) / (x_max - x_min)
  1. Según la etiqueta, separe la capa normal y la capa anormal
normal_idxs = (brats_label_array == 0)
abnorm_idxs = (brats_label_array == 1)
tsne_normal = tsne_norm[normal_idxs]
tsne_abnormal = tsne_norm[abnorm_idxs]
  1. Dibuja t-SNE usando matplotlib
plt.figure(figsize=(8, 8))
plt.scatter(tsne_normal[:, 0], tsne_normal[:, 1], 1, color='red', label='Healthy slices')
# tsne_normal[i, 0]为横坐标,X_norm[i, 1]为纵坐标,1为散点图的面积, color给每个类别设定颜色
plt.scatter(tsne_abnormal[:, 0], tsne_abnormal[:, 1], 1, color='green', label='Anomalous slices')
plt.legend(loc='upper left')
plt.show()

El resultado muestra:

Debido a la normalización, las coordenadas horizontales y verticales están todas en [0,1] A partir de esta figura, se puede ver que la capa normal se distribuye a la izquierda y la capa anormal a la derecha. Por supuesto, hay muchas áreas con límites poco claros.

Resumen: es muy simple de usar sklearn.manifold.TSNE, solo una oración para hacerlo, el resto del código es crear una matriz que debe reducirse en dimensión y usar matplotlib para mostrar, el código central real es solo una línea.

Para obtener más conocimientos teóricos, lea el siguiente enlace
Conocimientos teóricos de TSNE

El artículo se actualiza continuamente y puede seguir la cuenta pública de WeChat [Campamento práctico de inteligencia artificial de imágenes médicas] para obtener las últimas noticias, una cuenta pública que se enfoca en tecnologías de vanguardia en el campo del procesamiento de imágenes médicas. Adhiérase a lo que se ha practicado y llévelo a hacer proyectos, jugar juegos y escribir artículos. Todos los artículos originales proporcionan explicaciones teóricas, códigos experimentales y datos experimentales. Solo la práctica puede crecer más rápido, presten atención a nosotros, aprendan y progresen juntos ~

Soy Tina, nos vemos en el próximo blog~

Trabajando de día y escribiendo de noche, trabajando duro

Si cree que la escritura es buena, al final, haga clic en Me gusta, comente y marque. O una clave triple
inserte la descripción de la imagen aquí

Guess you like

Origin blog.csdn.net/u014264373/article/details/124724030