K-Means Clustering je Strojové učenie bez dozoru algoritmus, ktorý zoskupuje neoznačený súbor údajov do rôznych zhlukov. Cieľom tohto článku je preskúmať základy a fungovanie klastrovania k mean spolu s implementáciou.
Obsah
- Čo je to K-means Clustering?
- Čo je cieľom zoskupovania k-means?
- Ako funguje zhlukovanie k-means?
- Implementácia K-Means Clustering v Pythone
Čo je to K-means Clustering?
Strojové učenie bez dozoru je proces učenia počítača používať neoznačené, neklasifikované údaje a umožnenie algoritmu pracovať s týmito údajmi bez dozoru. Bez predchádzajúceho školenia údajov je úlohou stroja v tomto prípade organizovať nezoradené údaje podľa paralel, vzorov a variácií.
K znamená zhlukovanie, priraďuje dátové body jednému z K zhlukov v závislosti od ich vzdialenosti od stredu zhlukov. Začína sa náhodným priradením ťažiska zhlukov v priestore. Potom sa každý údajový bod priradí k jednému z klastrov na základe jeho vzdialenosti od ťažiska klastra. Po priradení každého bodu jednému z klastrov sa priradia nové ťažiská klastra. Tento proces beží opakovane, kým nenájde dobrý klaster. V analýze predpokladáme, že počet zhlukov je daný vopred a musíme body priradiť do jednej zo skupín.
V niektorých prípadoch nie je K jasne definované a musíme premýšľať o optimálnom počte K. K Znamená to, že klastrovanie vykonáva najlepšie údaje, ak sú dobre oddelené. Keď sa dátové body prekrývajú, toto zoskupovanie nie je vhodné. K Means je rýchlejší v porovnaní s inou technikou klastrovania. Poskytuje silné prepojenie medzi dátovými bodmi. Klaster K Means neposkytuje jasné informácie o kvalite klastrov. Rôzne počiatočné priradenie ťažiska klastra môže viesť k rôznym klastrom. Algoritmus K Means je tiež citlivý na šum. Možno sa zasekol v miestnych minimách.
Čo je cieľom zoskupovania k-means?
Cieľom zhlukovanie je rozdeliť obyvateľstvo resp nastaviť dátových bodov do niekoľkých skupín, takže dátových bodov v každej skupine je viac porovnateľné navzájom a odlišné od údajových bodov v rámci ostatných skupín. Ide v podstate o zoskupenie vecí na základe toho, nakoľko sú si navzájom podobné a odlišné.
Ako funguje zhlukovanie k-means?
Dostávame množinu údajov položiek s určitými funkciami a hodnotami pre tieto funkcie (napríklad vektor). Úlohou je kategorizovať tieto položky do skupín. Aby sme to dosiahli, použijeme algoritmus K-means, algoritmus učenia bez dozoru. „K“ v názve algoritmu predstavuje počet skupín/klastrov, do ktorých chceme klasifikovať naše položky.
(Pomôže, ak si predmety predstavíte ako body v n-rozmernom priestore). Algoritmus kategorizuje položky do k skupín alebo zhlukov podobnosti. Na výpočet tejto podobnosti použijeme ako meranie euklidovskú vzdialenosť.
Algoritmus funguje nasledovne:
- Najprv náhodne inicializujeme k bodov, ktoré sa nazývajú stredy alebo centroidy zhlukov.
- Každú položku kategorizujeme podľa jej najbližšieho priemeru a aktualizujeme súradnice priemeru, čo sú priemery položiek kategorizovaných v tomto zhluku doteraz.
- Zopakujeme proces pre daný počet iterácií a na konci máme svoje klastre.
Vyššie uvedené body sa nazývajú priemery, pretože sú priemernými hodnotami položiek, ktoré sú v nich kategorizované. Na inicializáciu týchto prostriedkov máme veľa možností. Intuitívnou metódou je inicializácia prostriedkov pri náhodných položkách v súbore údajov. Ďalšou metódou je inicializácia priemeru na náhodné hodnoty medzi hranicami súboru údajov (ak ide o funkciu X, položky majú hodnoty v [0,3], inicializujeme priemer s hodnotami pre X pri [0,3]).
Vyššie uvedený algoritmus v pseudokóde je nasledujúci:
Initialize k means with random values -->Pre daný počet iterácií: --> Iterácia cez položky: --> Nájdite priemer, ktorý je najbližšie k položke, vypočítaním euklidovskej vzdialenosti položky s každým z týchto prostriedkov --> Priraďte položku k významu --> Aktualizujte priemer podľa posunutím na priemer položiek v tomto klastri>
Implementácia K-Means Clustering v Pythone
Príklad 1
Importujte potrebné knižnice
Dovážame Numpy pre štatistické výpočty, Matplotlib naplánovať si graf, a make_blobs zo sklearn.datasets.
Python3
pole reťazcov c programovanie
import> numpy as np> import> matplotlib.pyplot as plt> from> sklearn.datasets>import> make_blobs> |
>
>
Vytvorte vlastnú množinu údajov pomocou make_blobs a vykreslite ju
Python3
X,y>=> make_blobs(n_samples>=> 500>,n_features>=> 2>,centers>=> 3>,random_state>=> 23>)> fig>=> plt.figure(>0>)> plt.grid(>True>)> plt.scatter(X[:,>0>],X[:,>1>])> plt.show()> |
>
>
Výkon :

Klastrovanie súboru údajov
Inicializujte náhodné centroidy
Kód inicializuje tri klastre pre klastrovanie K-means. Nastaví náhodné semeno a generuje náhodné stredy klastrov v zadanom rozsahu a vytvorí prázdny zoznam bodov pre každý zhluk.
Python3
k>=> 3> clusters>=> {}> np.random.seed(>23>)> for> idx>in> range>(k):> >center>=> 2>*>(>2>*>np.random.random((X.shape[>1>],))>->1>)> >points>=> []> >cluster>=> {> >'center'> : center,> >'points'> : []> >}> > >clusters[idx]>=> cluster> > clusters> |
>
>
Výkon:
{0: {'center': array([0.06919154, 1.78785042]), 'points': []}, 1: {'center': array([ 1.06183904, -0.87041662]), 'points': []}, 2: {'center': array([-1.11581855, 0.74488834]), 'points': []}}> Nakreslite centrum náhodnej inicializácie s dátovými bodmi
Python3
plt.scatter(X[:,>0>],X[:,>1>])> plt.grid(>True>)> for> i>in> clusters:> >center>=> clusters[i][>'center'>]> >plt.scatter(center[>0>],center[>1>],marker>=> '*'>,c>=> 'red'>)> plt.show()> |
porovnanie java
>
>
Výkon :

Dátové body s náhodným stredom
Graf zobrazuje bodový graf údajových bodov (X[:,0], X[:,1]) s čiarami mriežky. Označuje tiež počiatočné stredy klastra (červené hviezdy) vytvorené pre zhlukovanie K-priemerov.
Definujte euklidovskú vzdialenosť
Python3
def> distance(p1,p2):> >return> np.sqrt(np.>sum>((p1>->p2)>*>*>2>))> |
>
>
Vytvorte funkciu na priradenie a aktualizáciu centra klastra
E-krok priraďuje dátové body najbližšiemu centru klastrov a M-krok aktualizuje stredy klastrov na základe priemeru priradených bodov v zhlukoch K-means.
Python3
#Implementing E step> def> assign_clusters(X, clusters):> >for> idx>in> range>(X.shape[>0>]):> >dist>=> []> > >curr_x>=> X[idx]> > >for> i>in> range>(k):> >dis>=> distance(curr_x,clusters[i][>'center'>])> >dist.append(dis)> >curr_cluster>=> np.argmin(dist)> >clusters[curr_cluster][>'points'>].append(curr_x)> >return> clusters> > #Implementing the M-Step> def> update_clusters(X, clusters):> >for> i>in> range>(k):> >points>=> np.array(clusters[i][>'points'>])> >if> points.shape[>0>]>>0>:> >new_center>=> points.mean(axis>=>0>)> >clusters[i][>'center'>]>=> new_center> > >clusters[i][>'points'>]>=> []> >return> clusters> |
>
>
Krok 7: Vytvorte funkciu na predpovedanie klastra pre údajové body
Python3
def> pred_cluster(X, clusters):> >pred>=> []> >for> i>in> range>(X.shape[>0>]):> >dist>=> []> >for> j>in> range>(k):> >dist.append(distance(X[i],clusters[j][>'center'>]))> >pred.append(np.argmin(dist))> >return> pred> |
>
>
Priraďte, aktualizujte a predpovedajte centrum klastra
Python3
clusters>=> assign_clusters(X,clusters)> clusters>=> update_clusters(X,clusters)> pred>=> pred_cluster(X,clusters)> |
>
>
Nakreslite dátové body s ich predpokladaným stredom klastra
Python3
plt.scatter(X[:,>0>],X[:,>1>],c>=> pred)> for> i>in> clusters:> >center>=> clusters[i][>'center'>]> >plt.scatter(center[>0>],center[>1>],marker>=> '^'>,c>=> 'red'>)> plt.show()> |
>
>
Výkon :

K-znamená klastrovanie
Graf ukazuje dátové body zafarbené ich predpokladanými zhlukmi. Červené značky predstavujú aktualizované centrá klastrov po krokoch E-M v algoritme klastrovania K-means.
zalamovanie slov css
Príklad 2
Importujte potrebné knižnice
Python3
import> pandas as pd> import> numpy as np> import> seaborn as sns> import> matplotlib.pyplot as plt> import> matplotlib.cm as cm> from> sklearn.datasets>import> load_iris> from> sklearn.cluster>import> KMeans> |
>
>
Načítajte množinu údajov
Python3
X, y>=> load_iris(return_X_y>=>True>)> |
rozdiel medzi tigrom a levom
>
>
Lakťová metóda
Nájdenie ideálneho počtu skupín na rozdelenie údajov je základnou fázou každého algoritmu bez dozoru. Jednou z najbežnejších techník na zistenie tejto ideálnej hodnoty k je prístup lakťom.
Python3
#Find optimum number of cluster> sse>=> []>#SUM OF SQUARED ERROR> for> k>in> range>(>1>,>11>):> >km>=> KMeans(n_clusters>=>k, random_state>=>2>)> >km.fit(X)> >sse.append(km.inertia_)> |
>
>
Nakreslite graf lakťa, aby ste našli optimálny počet zhlukov
Python3
sns.set_style(>'whitegrid'>)> g>=>sns.lineplot(x>=>range>(>1>,>11>), y>=>sse)> g.>set>(xlabel>=>'Number of cluster (k)'>,> >ylabel>=> 'Sum Squared Error'>,> >title>=>'Elbow Method'>)> plt.show()> |
>
>
Výkon:

Lakťová metóda
Z vyššie uvedeného grafu môžeme pozorovať, že pri k=2 a k=3 je situácia podobná lakťu. Takže uvažujeme K=3
Vytvorte Kmeansov model zoskupovania
Python3
kmeans>=> KMeans(n_clusters>=> 3>, random_state>=> 2>)> kmeans.fit(X)> |
>
>
Výkon:
KMeans KMeans(n_clusters=3, random_state=2)>
Nájdite centrum klastra
Python3
unordered_map c++
kmeans.cluster_centers_> |
>
>
Výkon:
array([[5.006 , 3.428 , 1.462 , 0.246 ], [5.9016129 , 2.7483871 , 4.39354839, 1.43387097], [6.85 , 3.07368421, 5.74210526, 2.07105263]])>
Predpovedajte skupinu klastrov:
Python3
pred>=> kmeans.fit_predict(X)> pred> |
>
>
Výkon:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1], dtype=int32)>
Nakreslite stred klastra pomocou údajových bodov
Python3
plt.figure(figsize>=>(>12>,>5>))> plt.subplot(>1>,>2>,>1>)> plt.scatter(X[:,>0>],X[:,>1>],c>=> pred, cmap>=>cm.Accent)> plt.grid(>True>)> for> center>in> kmeans.cluster_centers_:> >center>=> center[:>2>]> >plt.scatter(center[>0>],center[>1>],marker>=> '^'>,c>=> 'red'>)> plt.xlabel(>'petal length (cm)'>)> plt.ylabel(>'petal width (cm)'>)> > plt.subplot(>1>,>2>,>2>)> plt.scatter(X[:,>2>],X[:,>3>],c>=> pred, cmap>=>cm.Accent)> plt.grid(>True>)> for> center>in> kmeans.cluster_centers_:> >center>=> center[>2>:>4>]> >plt.scatter(center[>0>],center[>1>],marker>=> '^'>,c>=> 'red'>)> plt.xlabel(>'sepal length (cm)'>)> plt.ylabel(>'sepal width (cm)'>)> plt.show()> |
>
>
Výkon:

K-znamená zhlukovanie
Podgraf na ľavej strane zobrazuje dĺžku okvetných lístkov vs. šírku okvetných lístkov s údajovými bodmi zafarbenými podľa zhlukov a červené značky označujú stredy zhlukov K-priemerov. Podgraf na pravej strane ukazuje dĺžku sepalu vs. šírku sepalu podobne.
Záver
Na záver, klastrovanie K-means je výkonný algoritmus strojového učenia bez dozoru na zoskupovanie neoznačených súborov údajov. Jeho cieľom je rozdeliť údaje do zhlukov, čím sa podobné údajové body stanú súčasťou rovnakej skupiny. Algoritmus inicializuje centroidy klastra a iteratívne priraďuje dátové body najbližšiemu ťažisku, pričom aktualizuje ťažiská na základe priemeru bodov v každom klastri.
Často kladené otázky (FAQ)
1. Čo je klastrovanie k-means pre analýzu údajov?
K-means je metóda rozdelenia, ktorá rozdeľuje súbor údajov na „k“ odlišných, neprekrývajúcich sa podmnožín (klastrov) na základe podobnosti s cieľom minimalizovať rozptyl v rámci každého klastra.
2.Aký je príklad k-means v reálnom živote?
Segmentácia zákazníkov v marketingu, kde k-means zoskupuje zákazníkov na základe nákupného správania, čo umožňuje podnikom prispôsobiť marketingové stratégie pre rôzne segmenty.
3. Aký typ údajov je k-means clustering model?
K-means funguje dobre s numerickými údajmi, kde je zmysluplný pojem vzdialenosti medzi údajovými bodmi. Bežne sa používa na spojité premenné.
4. Používa sa K-means na predikciu?
K-means sa primárne používa na zoskupovanie a zoskupovanie podobných dátových bodov. Nepredpovedá označenia pre nové údaje; priraďuje ich k existujúcim zhlukom na základe podobnosti.
5.Čo je cieľom zoskupovania k-means?
Cieľom je rozdeliť údaje do „k“ klastrov, čím sa minimalizujú rozdiely v rámci klastra. Snaží sa vytvárať skupiny, v ktorých sú dátové body v každom klastri navzájom viac podobné ako v iných klastroch.