Ciencia - Clúster

K-means clusteringes un método para encontrar conglomerados y centros de conglomerados en un conjunto de datos sin etiquetar. Intuitivamente, podríamos pensar en un clúster como: compuesto por un grupo de puntos de datos, cuyas distancias entre puntos son pequeñas en comparación con las distancias a puntos fuera del clúster. Dado un conjunto inicial de K centros, el algoritmo de K-medias itera los siguientes dos pasos:

  • Para cada centro, se identifica el subconjunto de puntos de entrenamiento (su grupo) que está más cerca de él que cualquier otro centro.

  • Se calcula la media de cada característica para los puntos de datos de cada grupo, y este vector medio se convierte en el nuevo centro de ese grupo.

Estos dos pasos se repiten hasta que los centros ya no se mueven o las asignaciones ya no cambian. Entonces, un nuevo puntoxse puede asignar al grupo del prototipo más cercano. La biblioteca SciPy proporciona una buena implementación del algoritmo K-Means a través del paquete de clúster. Entendamos cómo usarlo.

Implementación de K-Means en SciPy

Entenderemos cómo implementar K-Means en SciPy.

Importar K-Means

Veremos la implementación y el uso de cada función importada.

from SciPy.cluster.vq import kmeans,vq,whiten

Generación de datos

Tenemos que simular algunos datos para explorar la agrupación.

from numpy import vstack,array
from numpy.random import rand

# data generation with three features
data = vstack((rand(100,3) + array([.5,.5,.5]),rand(100,3)))

Ahora, tenemos que buscar datos. El programa anterior generará la siguiente salida.

array([[ 1.48598868e+00, 8.17445796e-01, 1.00834051e+00],
       [ 8.45299768e-01, 1.35450732e+00, 8.66323621e-01],
       [ 1.27725864e+00, 1.00622682e+00, 8.43735610e-01],
       …………….

Normalice un grupo de observaciones por característica. Antes de ejecutar K-Means, es beneficioso cambiar la escala de cada dimensión de característica del conjunto de observación con blanqueamiento. Cada característica se divide por su desviación estándar en todas las observaciones para darle una varianza unitaria.

Blanquear los datos

Tenemos que usar el siguiente código para blanquear los datos.

# whitening of data
data = whiten(data)

Calcular K-medias con tres clústeres

Calculemos ahora K-Means con tres grupos usando el siguiente código.

# computing K-Means with K = 3 (2 clusters)
centroids,_ = kmeans(data,3)

El código anterior realiza K-medias en un conjunto de vectores de observación que forman K grupos. El algoritmo K-Means ajusta los centroides hasta que no se puede hacer suficiente progreso, es decir, el cambio en la distorsión, ya que la última iteración es menor que algún umbral. Aquí, podemos observar el centroide del clúster imprimiendo la variable de centroides usando el código que se proporciona a continuación.

print(centroids)

El código anterior generará la siguiente salida.

print(centroids)[ [ 2.26034702  1.43924335  1.3697022 ]
                  [ 2.63788572  2.81446462  2.85163854]
                  [ 0.73507256  1.30801855  1.44477558] ]

Asigne cada valor a un clúster utilizando el código que se proporciona a continuación.

# assign each sample to a cluster
clx,_ = vq(data,centroids)

los vq La función compara cada vector de observación en la 'M' por 'N' obsmatriz con los centroides y asigna la observación al grupo más cercano. Devuelve el grupo de cada observación y la distorsión. También podemos comprobar la distorsión. Revisemos el grupo de cada observación usando el siguiente código.

# check clusters of observation
print clx

El código anterior generará la siguiente salida.

array([1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1,
0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1,  0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0,
2, 2, 2, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)

Los distintos valores 0, 1, 2 de la matriz anterior indican los grupos.