K-Means Clustering med Elbow-metoden PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

K-Means Clustering med armbågsmetoden

K-means klustring är en oövervakad inlärningsalgoritm som grupperar data baserat på varje punkt euklidiskt avstånd till en central punkt som kallas tyngdpunkt. Centroiderna definieras med hjälp av alla punkter som finns i samma kluster. Algoritmen väljer först slumpmässiga punkter som centroider och upprepar sedan genom att justera dem tills full konvergens.

En viktig sak att komma ihåg när du använder K-means är att antalet kluster är en hyperparameter, den kommer att definieras innan modellen körs.

K-means kan implementeras med Scikit-Learn med bara 3 rader kod. Scikit-learn har också redan en tyngdpunktsoptimeringsmetod tillgänglig, kmeans++, som hjälper modellen att konvergera snabbare.

För att tillämpa K-means klustringsalgoritm, låt oss ladda Palmer pingviner datauppsättning, välj de kolumner som ska klustras och använd Seaborn för att plotta ett spridningsdiagram med färgkodade kluster.

Anmärkningar: Du kan ladda ner datamängden från denna länk.

Låt oss importera biblioteken och ladda Penguins dataset, trimma den till de valda kolumnerna och släppa rader med saknade data (det fanns bara 2):

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

df = pd.read_csv('penguins.csv')
print(df.shape) 
df = df[['bill_length_mm', 'flipper_length_mm']]
df = df.dropna(axis=0)

Vi kan använda armbågsmetoden för att få en indikation på kluster för våra data. Den består i tolkningen av ett linjediagram med en armbågsform. Antalet kluster är var armbågsböjningarna. X-axeln i diagrammet är antalet kluster och y-axeln är Kvadratsumman inom kluster (WCSS) för varje antal kluster:

wcss = []

for i in range(1, 11):
    clustering = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering.fit(df)
    wcss.append(clustering.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss);

Armbågsmetoden indikerar att vår data har 2 kluster. Låt oss plotta data före och efter klustring:

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without clustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('Using the elbow method');

K-Means Clustering med Elbow-metoden PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Det här exemplet visar hur armbågsmetoden endast är en referens när den används för att välja antalet kluster. Vi vet redan att vi har 3 typer av pingviner i datamängden, men om vi skulle bestämma deras antal med hjälp av armbågsmetoden, skulle 2 kluster bli vårt resultat.

Eftersom K-means är känsligt för datavarians, låt oss titta på den beskrivande statistiken för kolumnerna vi grupperar:

df.describe().T 

Detta resulterar i:

 					count 	mean 		std 		min 	25% 	50% 	75% 	max
bill_length_mm 		342.0 	43.921930 	5.459584 	32.1 	39.225 	44.45 	48.5 	59.6
flipper_length_mm 	342.0 	200.915205 	14.061714 	172.0 	190.000 197.00 	213.0 	231.0

Lägg märke till att medelvärdet är långt ifrån standardavvikelsen (std), detta indikerar hög varians. Låt oss försöka minska det genom att skala data med standardskalare:

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
scaled = ss.fit_transform(df)

Låt oss nu upprepa armbågsmetoden för de skalade data:

wcss_sc = []

for i in range(1, 11):
    clustering_sc = KMeans(n_clusters=i, init='k-means++', random_state=42)
    clustering_sc.fit(scaled)
    wcss_sc.append(clustering_sc.inertia_)
    
ks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sns.lineplot(x = ks, y = wcss_sc);

K-Means Clustering med Elbow-metoden PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Kolla in vår praktiska, praktiska guide för att lära dig Git, med bästa praxis, branschaccepterade standarder och medföljande fuskblad. Sluta googla Git-kommandon och faktiskt lära Det!

Den här gången är det föreslagna antalet kluster 3. Vi kan plotta data med klusteretiketterna igen tillsammans med de två tidigare plotten för jämförelse:

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.scatterplot(ax=axes[0], data=df, x='bill_length_mm', y='flipper_length_mm').set_title('Without cliustering')
sns.scatterplot(ax=axes[1], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering.labels_).set_title('With the Elbow method')
sns.scatterplot(ax=axes[2], data=df, x='bill_length_mm', y='flipper_length_mm', hue=clustering_sc.labels_).set_title('With the Elbow method and scaled data');

K-Means Clustering med Elbow-metoden PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

När du använder K-means Clustering måste du förbestämma antalet kluster. Som vi har sett när man använder en metod för att välja vår k antalet kluster är resultatet bara ett förslag och kan påverkas av mängden varians i data. Det är viktigt att göra en djupgående analys och generera mer än en modell med olika _k_s vid klustring.

Om det inte finns någon tidigare indikation på hur många kluster som finns i data, visualisera det, testa det och tolka det för att se om klustringsresultaten är vettiga. Om inte, klustera igen. Titta också på mer än ett mått och instansiera olika klustringsmodeller – för K-medel, titta på siluettpoäng och kanske Hierarkisk klustring för att se om resultaten förblir desamma.

Tidsstämpel:

Mer från Stackabuse