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_cercano4. 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_centros6. 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")