k-Means en entornos no convexos

k-Means presupone que los clusters tienen forma convexa, lo que limita su eficacia en ciertos entornos. Por ejemplo, consideremos el dataset de las lunas:

from sklearn.datasets import make_moons
X, y = make_moons(n_samples=400, noise=0.05, random_state=0)

Extraemos las características x e y:

x = X[:, 0]
y = X[:, 1]

...y las mostramos en un diagrama de dispersión:

sns.scatterplot(x, y, legend = False);

Dataset make_moons

En este dataset, parecería obvio pensar que cada de las lunas supone un cluster independiente, pero no son formas convexas, lo que impide a k-Means reconocer adecuadamente los clusters. Por el contrario, impone su criterio de distancia para escogerlos.

Vamos a instanciar k-Means especificando 2 clusters, a entrenarlo y a generar la predicción:

from sklearn.cluster import KMeans
model = KMeans(n_clusters = 2, random_state = 0)
clusters = model.fit_predict(X)

Si visualizamos el resultado:

sns.scatterplot(x, y, hue = clusters);

Clusters en el dataset make_moons

...confirmamos que el criterio ha sido por distancia, no por densidad de puntos.