<jupyter_start><jupyter_text>--- Pasos a seguir para estimar clusters ---* Podemos estimar la k:    * NO: Propagación de la afinidad    * SI: Podemos usar la distancia Euclídea:        * SI: K-Means        * NO: Buscar valores centrales:            * SI: K-Medoides             * NO: Los datos son linealmente separables:                * SI: Clustering aglomerativo                * NO: Clustering Espectral  Distribuciones en forma de anillo<jupyter_code>from math import sin, cos, radians, pi, sqrt
import numpy.random as rnd
import numpy as np
import matplotlib.pyplot as plt
def ring(r_min = 0, r_max = 1, n_samples = 360):
    angle = rnd.uniform(0, 2*pi, n_samples)
    distance = rnd.uniform(r_min, r_max, n_samples)
    data = []
    for a, d in zip(angle, distance):
        data.append([d*cos(a), d*sin(a)])
    return np.array(data)
data1 = ring(3, 5)
data2 = ring(24, 27)

data = np.concatenate([data1, data2], axis = 0)
labels = np.concatenate([[0 for i in range(0,len(data1))], [1 for i in range(0,len(data2))]])
plt.scatter(data[:,0], data[:,1], c = labels, s = 5, cmap = "autumn")<jupyter_output><empty_output><jupyter_text>Algoritmo con Kmeans<jupyter_code>from sklearn.cluster import KMeans
km = KMeans(2).fit(data) #con k=2 (numero de cluster que queremos)
clust = km.predict(data)
plt.scatter(data[:,0], data[:, 1], c = clust, s = 5, cmap="autumn")<jupyter_output><empty_output><jupyter_text>* **Vemos que en este tipo(anillos), el método de KMeans no funciona bien. Para ello tendremos que aplicar el siguiente método:**  Algoritmo de los K MedoidesConsite en seleccionar k puntos inciales dentro de cada conjunto incial de clusters. Para cada uno de los punto centrales del dataset calcularemos el centro del cluster mas cercano con cualquier tipo de métrica, y la diferencia es que el centro del cluster no quedará asignado al baricentro de esos puntos, sino que quedará asignado a dicho punto en cuestión. Para cada punto del cluster lo que hará será intercambiar el centro del cluster con el punto y calcular la reducción en las distancias totales con respecto al centro del cluster a través de todos los miembros utulizando ese swag?, y sino mejor pues no lo escogerá. Iteraremos cada uno de los puntos del dataset y nos quedaremos como centro uno de los datos del dataset. En el fondo se trata de encontrar el punto que está más en medio(medoide).<jupyter_code>from pyclust import KMedoids
kmed = KMedoids(2).fit_predict(data) #queremos buscar 2 medoides(centros). Con fit_predict, hace el modelo y la predicción a la vez
plt.scatter(data[:,0], data[:,1], c=kmed, s=5, cmap="autumn")<jupyter_output><empty_output><jupyter_text>Algoritmo del Clustering Espectral<jupyter_code>from sklearn.cluster import SpectralClustering
clust = SpectralClustering(2).fit_predict(data)
plt.scatter(data[:,0], data[:,1], c = clust, s = 5, cmap = "autumn")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09841160220994476, 'fraction_numerical': 0.014157458563535912, 'mean_word_length': 4.56046065259117, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '388434', 'license': 'MIT', 'n_tokens_mistral': 1017, 'n_tokens_neox': 1001, 'n_words': 351, 'path': 'notebooks/T5 - 7 - K Medoides y Clustering Espectral.ipynb', 'repo_name': 'dasafo/python-ml-course', 'size': '2896'}