Hola Mar Isabel,
muchas gracias por tu pregunta. Efectivamente, el resultado del algoritmo de K-medias depende de la situación inicial de los centroides, y, por tanto, si iniciamos los centroides aleatoriamente podemos obtener distintos resultados en distintas ejecuciones. Los índices Silueta, Calinski-Harabasz y otros se calculan sobre los clusters obtenidos, así que si los resultados de los algoritmos de clustering cambian a cada ejecución, el valor de estos índices también cambiará.
Como bien has comentado, esto se observa si ejecutas varias veces las celdas asociadas en el Google Colaboratory:
https://colab.research.google.com/drive/1N2EED-cdliQilaKdIRYkoKFd05ZXWOjr?usp=sharing#scrollTo=YhVB9lPHxTPj . Bien es cierto que aunque los valores concretos de los índices de calidad cambien a cada ejecución del k-medias, el método del codo (Elbow) que calcula el valor óptimo de K ofrece en muchas ocasiones el mismo óptimo, aunque depende de la ejecución concreta. En este notebook, el valor óptimo varía entre 2 y 3 en la mayoría de las ejecuciones de KElbowVisualizer.
Con el código de esta celda del notebook:
from math import floor
# 1- Hacemos el clustering
k_means = KMeans(n_clusters=3)
datos = mexpr_toy.transpose()
cluster_predict = k_means.fit_predict(datos)
# 2- Con el resultado del cluster (cluster_predict) calculamos los índices Silueta y Calinski-Harabasz para ese resultado
indice_Silueta = metrics.silhouette_score(datos, cluster_predict)
print("Índice Silueta: "+str(indice_Silueta))
indice_CH = metrics.calinski_harabasz_score(datos, cluster_predict)
print("Índice Calinski-Harabasz: "+ str(indice_CH))
Puedes calcular los índices de calidad de un resultado concreto de clustering. La recomendación general es que ejecutes primero KElbowVisualizer para identificar los potenciales valores óptimos de K y que luego realices varias ejecuciones probando esos valores de K y quedándote con la ejecución concreta para la que obtengas mejores métricas de calidad.
Ten en cuenta que el problema de determinar el número óptimo de clusters puede ser muy complejo en función de los datos de partida y que también hay algoritmos de clustering más sofisticados que estiman el número de clusters, de forma que no es necesario proporcionar un valor de K como entrada. Utilizando el mismo código del notebook anterior, o realizando cambios mínimos, puedes utilizar otros algoritmos de clustering disponibles en la biblioteca scikit-learn de python: https://scikit-learn.org/stable/modules/clustering.html
Un saludo
---
Hello Mar Isabel,
Thank you very much for your question. Indeed, the result of the K-means algorithm depends on the initial placement of the centroids. Therefore, if we initialize the centroids randomly, we can obtain different results in different runs. The Silhouette index, Calinski-Harabasz index, and others are calculated based on the resulting clusters, so if the clustering results change with each run, the values of these indices will also vary.
As you correctly pointed out, this can be observed by running the associated cells multiple times in the Google Colaboratory notebook: https://colab.research.google.com/drive/1N2EED-cdliQilaKdIRYkoKFd05ZXWOjr?usp=sharing#scrollTo=YhVB9lPHxTPj. It is true that although the specific values of the quality indices may change with each execution of K-means, the Elbow method, which estimates the optimal value of K, often yields the same optimum. However, this also depends on the specific run. In this notebook, the optimal value varies between 2 and 3 in most executions of KElbowVisualizer.
Using the code from this notebook cell:
from math import floor
# 1- Hacemos el clustering
k_means = KMeans(n_clusters=3)
datos = mexpr_toy.transpose()
cluster_predict = k_means.fit_predict(datos)
# 2- Con el resultado del cluster (cluster_predict) calculamos los índices Silueta y Calinski-Harabasz para ese resultado
indice_Silueta = metrics.silhouette_score(datos, cluster_predict)
print("Índice Silueta: "+str(indice_Silueta))
indice_CH = metrics.calinski_harabasz_score(datos, cluster_predict)
print("Índice Calinski-Harabasz: "+ str(indice_CH))
You can compute the quality indices for a specific clustering result. The general recommendation is to first use KElbowVisualizer to identify potential optimal values for K, and then perform several runs using those values, selecting the specific run that yields the best quality metrics.
Keep in mind that determining the optimal number of clusters can be a complex task depending on the input data, and that there are also more sophisticated clustering algorithms that estimate the number of clusters automatically, so you don't need to provide a K value as input. Using the same code from the notebook above, or with minimal changes, you can try out other clustering algorithms available in Python’s scikit-learn library: https://scikit-learn.org/stable/modules/clustering.html
Best regards.