Implementación del Algoritmo K-Means en Python para Clustering de Datos

Clasificado en Informática

Escrito el en español con un tamaño de 3,8 KB

Implementación del Algoritmo K-Means en Python

A continuación, se detalla el proceso de creación del algoritmo de agrupamiento K-Means, estructurado en diferentes etapas funcionales para facilitar su comprensión y aplicación.

1. Inicialización de la Clasificación

Ej1: Definición de la función para preparar la estructura de datos inicial.

def clasificacion_inicial_vacia(datos):
    return [[x, None] for x in datos]

2. Selección de Centros Iniciales

Ej2: Selección aleatoria de los centroides iniciales a partir del conjunto de datos.

def centros_iniciales(datos, k):
    return random.sample(datos, k)

3. Cálculo del Centro más Cercano

Ej3: Función para determinar el índice del centroide con la menor distancia respecto a un punto x.

def calcula_centro_mas_cercano(x, centros, distancia):
    indice_mas_cercano = 0
    distancia_minima = distancia(x, centros[0])
    for i in range(1, len(centros)):
        d = distancia(x, centros[i])
        if d < distancia_minima:
            distancia_minima = d
            indice_mas_cercano = i
    return indice_mas_cercano

4. Asignación de Clústeres

Ej4: Proceso de asignación de cada ejemplo al clúster correspondiente según la distancia calculada.

def asigna_cluster_a_cada_ejemplo(clasif, centros, distancia):
    for elemento in clasif:
        dato = elemento[0]
        elemento[1] = calcula_centro_mas_cercano(dato, centros, distancia)

5. Recálculo de Centros

Ej5: Actualización de la posición de los centros basándose en el promedio de los puntos asignados a cada clúster.

def recalcula_centros(clasif, k):
    nuevos_centros = []
    for i in range(k):
        puntos_cluster = [dato for dato, cluster in clasif if cluster == i]
        num_puntos = len(puntos_cluster)
        num_dimensiones = len(puntos_cluster[0])
        centro = []
        for d in range(num_dimensiones):
            suma = sum(punto[d] for punto in puntos_cluster)
            centro.append(suma / num_puntos)
        nuevos_centros.append(centro)
    return nuevos_centros

6. Función Principal K-Means

Ej6: Algoritmo iterativo que ejecuta la asignación y el recálculo hasta alcanzar la convergencia.

def k_medias(k, datos, distancia):
    centros = centros_iniciales(datos, k)
    clasif = clasificacion_inicial_vacia(datos)
    while True:
        asigna_cluster_a_cada_ejemplo(clasif, centros, distancia)
        nuevos_centros = recalcula_centros(clasif, k)
        if nuevos_centros != centros:
            centros = nuevos_centros
        else:
            return [centros, clasif]

7. Distancia Euclídea y Validación con Dataset Iris

Ej7: Implementación de la métrica de distancia y validación de los resultados utilizando el conjunto de datos Iris.

def distancia_euclidea(v, w):
    suma_cuadrados = sum((v[i] - w[i]) ** 2 for i in range(len(v)))
    return math.sqrt(suma_cuadrados)

# Preparación de los datos de Iris
iris_sin_clasificar = [fila[:4] for fila in iris]

def validacion_iris(clasificacion):
    posibles_valores = ["Iris setosa", "Iris versicolor", "Iris virgínica"]
    contadores = dict()
    for val in posibles_valores:
        for x in range(3):
            contadores[val, x] = 0
    for i in range(len(clasificacion)):
        contadores[iris[i][4], clasificacion[i][1]] += 1
    for val in posibles_valores:
        print(val + "\n" + "==============\n")
        for x in range(3):
            print("Cluster ", x, ": ", contadores[val, x])
        print("\n\n")

Entradas relacionadas: