K-means: Ejemplo de agrupación - Machine Learning con OpenCv y Python

Introducción:

Hello World!!! My name is Luis Salcedo. Bienvenidos a Mi Diario Python, el mejor blog para Aprender Python.

En el día de hoy haremos un articulo un poco... como decirlo...  "Para amantes de los datos" . Veremos un ejemplo de agrupación de datos utilizando el método de agrupación "K-means", utilizado en el área del Aprendizaje Automático (Machine Learning).

Pero antes...

K-means... ¿Qué es eso?.

Resultado de imagen para k-means

K-mans es un método de agrupación de datos, que tiene como objetivo la partición de un conjunto de n observaciones en k grupos en el que cada observación pertenece al grupo cuyo valor medio es más cercano. Este método es muy utilizado en la minería de datos. 

Dado un conjunto de observaciones (x1x2, …, xn), donde cada observación es un vector real de d dimensiones, k-means construye una partición de las observaciones en k conjuntos (k ≤ n) a fin de minimizar la suma de los cuadrados dentro de cada grupo (WCSS): S = {S1S2, …, Sk}

donde µi es la media de puntos en Si.

Agrupamiento k-means cuando se usan heurísticas como el algoritmo de Lloyd es fácil de implementar incluso para grandes conjuntos de datos. Por lo que ha sido ampliamente usado en muchas áreas como segmentación de mercadosvisión por computadorasgeoestadística,​ astronomía y minería de datos en agricultura. También se usa como preprocesamiento para otros algoritmos, por ejemplo para buscar una configuración inicial.

Implementación en Python con OpenCv:

Para la implementación del agrupamiento con K-menas, haremos uso de dos cosas:
  1. La librería opencv: la puedes descargar usando PyPi ingresando el siguiente comando en tu terminal: pip install opencv-python o puedes ingresar a: https://pypi.org/project/opencv-python/.
  2. El archivo gaussian_mix el cual puedes descargar ingresando aquí: https://github.com/LuisAlejandroSalcedo/k-means-opencv-python/.

Ahora podemos proseguir a escribir el código:

from __future__ import print_function
import numpy as np
import cv2 as cv
from gaussian_mix import make_gaussians

cluster_n = 5 # Numero de grupos
img_size = 512 # Tamaño de la imagen

# Generamos la paleta de colores
colors = np.zeros((1, cluster_n, 3), np.uint8)
colors[0,:] = 255
colors[0,:,0] = np.arange(0, 180, 180.0/cluster_n)
colors = cv.cvtColor(colors, cv.COLOR_HSV2BGR)[0]

while True:
    print("Ejemplo de distribución...")
    points, _ = make_gaussians(cluster_n, img_size) # Generamos los puntos
    
    term_crit = (cv.TERM_CRITERIA_EPS, 30, 0.1)
    ret, labels, centers = cv.kmeans(points, cluster_n, None, term_crit, 10, 0)
    img = np.zeros((img_size, img_size, 3), np.uint8)
    for (x, y), label in zip(np.int32(points), labels.ravel()): 
        c = list(map(int, colors[label]))
        cv.circle(img, (x,y), 1, c, -1)
    cv.imshow('gaussian mixture', img)
    ch = cv.waitKey(0)
    if ch == 27:
        break
cv.destroyAllWindows()

Al ejecutar el código, se creara una nueva ventana:


Cada vez que presiones "Espacio" se generaran nuevas agrupaciones:

Genial ¿No? Vemos que las agrupaciones que adaptan de manera muy precisa. Este tipo de métodos se utilizan para la clasificación.

Puedes descargar le código en formato ipynb ingresando aquí: https://github.com/LuisAlejandroSalcedo/k-means-opencv-python/.

¿Alguna duda? Entonces no dudes en dejar tu comentario.

Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey