Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

Il metodo k.means


K-means per creare cluster, il coefficiente Silhouette per la metrica

K-Means e Coefficiente di Silhouette

Il metodo K-Means è un algoritmo di clustering che suddivide un set di dati in gruppi (cluster) in base alla similarità dei dati.
L'obiettivo è minimizzare la varianza all'interno di ciascun cluster. Il coefficiente di Silhouette è una misura di quanto un oggetto sia simile al suo cluster rispetto al cluster più vicino. Varia da -1 a 1, dove un valore più alto indica un clustering migliore.

Esempio con K-Means e Coefficiente di Silhouette


import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, silhouette_samples
import numpy as np

# Genera dati sintetici
X, _ = make_blobs(n_samples=300, centers=4, random_state=42)

# Trova il miglior numero di cluster con il metodo del gomito
inertia = []
for n_clusters in range(2, 11):
    kmeans = KMeans(n_clusters=n_clusters, random_state=42)
    kmeans.fit(X)
    inertia.append(kmeans.inertia_)

# Visualizza il grafico del metodo del gomito
plt.plot(range(2, 11), inertia, marker='o')
plt.xlabel('Numero di Cluster')
plt.ylabel('Varianza Inertia')
plt.title('Metodo del Gomito per il K-Means')
plt.show()

# Seleziona il numero ottimale di cluster (nel nostro caso, 4)
optimal_clusters = 4

# Applica K-Means con il numero ottimale di cluster
kmeans = KMeans(n_clusters=optimal_clusters, random_state=42)
labels = kmeans.fit_predict(X)

# Calcola il coefficiente di Silhouette
silhouette_avg = silhouette_score(X, labels)
print(f'Il coefficiente di Silhouette medio è {silhouette_avg:.2f}')

# Calcola il coefficiente di Silhouette per ciascun campione
sample_silhouette_values = silhouette_samples(X, labels)

# Visualizza i risultati
fig, ax = plt.subplots()
y_lower = 10
for i in range(optimal_clusters):
    ith_cluster_silhouette_values = sample_silhouette_values[labels == i]
    ith_cluster_silhouette_values.sort()
    size_cluster_i = ith_cluster_silhouette_values.shape[0]
    y_upper = y_lower + size_cluster_i
    color = plt.cm.nipy_spectral(float(i) / optimal_clusters)
    ax.fill_betweenx(np.arange(y_lower, y_upper),
                      0, ith_cluster_silhouette_values,
                      facecolor=color, edgecolor=color, alpha=0.7)
    ax.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
    y_lower = y_upper + 10

ax.set_title("Rappresentazione del coefficiente di Silhouette per ciascun cluster")
ax.set_xlabel("Valore del coefficiente di Silhouette")
ax.set_ylabel("Etichetta del Cluster")

# Linea che indica il coefficiente di Silhouette medio su tutti i dati
ax.axvline(x=silhouette_avg, color="red", linestyle="--")

plt.show()


Coefficiente di Silhouette

Il coefficiente silhouette è una misura di validità interna per valutare la coesione e la separazione dei cluster ottenuti da un algoritmo di clustering, come K-Means. Questa metrica fornisce un'indicazione sulla qualità della suddivisione dei dati nei cluster.
Il coefficiente silhouette varia da -1 a 1, dove:
  • Valori vicini a 1 indicano che l'istanza è ben collocata nel suo cluster e separata dagli altri.
  • Valori vicini a 0 indicano che l'istanza è sulla soglia tra due cluster.
  • Valori vicini a 0 indicano che l'istanza è sulla soglia tra due cluster.