K-Means Clustering je Strojové učení bez dozoru algoritmus, který seskupuje neoznačenou datovou sadu do různých shluků. Tento článek si klade za cíl prozkoumat základy a fungování k mean clusteringu spolu s implementací.
Obsah
- Co je to K-means Clustering?
- Co je cílem shlukování k-means?
- Jak funguje shlukování k-means?
- Implementace K-Means Clustering v Pythonu
Co je to K-means Clustering?
Strojové učení bez dozoru je proces učení počítače používat neoznačená, neklasifikovaná data a umožnění algoritmu pracovat s těmito daty bez dozoru. Bez předchozího školení dat je úkolem stroje v tomto případě organizovat netříděná data podle paralel, vzorů a variací.
K znamená shlukování, přiřazuje datové body jednomu z K shluků v závislosti na jejich vzdálenosti od středu shluků. Začíná náhodným přiřazením těžiště shluků v prostoru. Poté se každý datový bod přiřadí jednomu ze shluků na základě jeho vzdálenosti od těžiště shluku. Po přiřazení každého bodu jednomu ze shluků jsou přiřazena nová těžiště shluků. Tento proces běží iterativně, dokud nenajde dobrý cluster. V analýze předpokládáme, že počet shluků je dán předem a musíme umístit body do jedné ze skupin.
V některých případech není K jasně definováno a musíme přemýšlet o optimálním počtu K. K Znamená, že shlukování poskytuje nejlepší data, jsou dobře oddělena. Když se datové body překrývají, toto shlukování není vhodné. K Means je rychlejší ve srovnání s jinými technikami shlukování. Poskytuje silné spojení mezi datovými body. K Means cluster neposkytují jasné informace o kvalitě clusterů. Různé počáteční přiřazení těžiště klastru může vést k různým klastrům. Algoritmus K Means je také citlivý na šum. Možná se to zaseklo v místních minimech.
Co je cílem shlukování k-means?
Cílem shlukování je rozdělit obyvatelstvo resp soubor datových bodů do několika skupin, takže datových bodů v každé skupině je více srovnatelný k sobě navzájem a liší se od datových bodů v ostatních skupinách. Je to v podstatě seskupení věcí na základě toho, jak jsou si navzájem podobné a odlišné.
Jak funguje shlukování k-means?
Dostáváme datovou sadu položek s určitými funkcemi a hodnotami pro tyto funkce (jako je vektor). Úkolem je kategorizovat tyto položky do skupin. Abychom toho dosáhli, použijeme algoritmus K-means, algoritmus učení bez dozoru. „K“ v názvu algoritmu představuje počet skupin/shluků, do kterých chceme naše položky zařadit.
(Pomůže, když si položky představíte jako body v n-rozměrném prostoru). Algoritmus kategorizuje položky do k skupin nebo shluků podobnosti. K výpočtu této podobnosti použijeme jako měření euklidovskou vzdálenost.
Algoritmus funguje následovně:
- Nejprve náhodně inicializujeme k bodů, kterým se říká střední hodnoty nebo těžiště shluků.
- Každou položku kategorizujeme podle nejbližšího průměru a aktualizujeme souřadnice průměru, což jsou průměry položek dosud kategorizovaných v tomto shluku.
- Opakujeme proces pro daný počet iterací a na konci máme své shluky.
Výše uvedené body se nazývají průměry, protože se jedná o střední hodnoty položek v nich kategorizovaných. K inicializaci těchto prostředků máme mnoho možností. Intuitivní metodou je inicializace prostředků na náhodných položkách v sadě dat. Další metodou je inicializace střední hodnoty na náhodné hodnoty mezi hranicemi datové sady (pokud jde o funkci X, položky mají hodnoty v [0,3], inicializujeme průměr s hodnotami pro X při [0,3]).
Výše uvedený algoritmus v pseudokódu je následující:
Initialize k means with random values -->Pro daný počet iterací: --> Iterujte položky: --> Najděte průměr, který je nejblíže k položce, výpočtem euklidovské vzdálenosti položky s každým z těchto prostředků --> Přiřaďte položku k významu --> Aktualizujte průměr podle posunutím na průměr položek v tomto shluku>
Implementace K-Means Clustering v Pythonu
Příklad 1
Importujte potřebné knihovny
Dovážíme Numpy pro statistické výpočty, Matplotlib naplánovat graf, a make_blobs ze sklearn.datasets.
Python3
jarní rám
import> numpy as np> import> matplotlib.pyplot as plt> from> sklearn.datasets> import> make_blobs> |
>
>
Vytvořte vlastní datovou sadu pomocí make_blobs a vykreslete ji
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ýstup :

Shlukování datové sady
Inicializujte náhodné centroidy
Kód inicializuje tři clustery pro shlukování K-means. Nastaví náhodné semeno a generuje náhodná centra clusteru v určeném rozsahu a vytvoří prázdný seznam bodů za každý shluk.
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ýstup:
{0: {'center': array([0.06919154, 1.78785042]), 'points': []}, 1: {'center': array([ 1.06183904, -0.87041662]), 'points': []}, 2: {'center': array([-1.11581855, 0.74488834]), 'points': []}}>
Vykreslete centrum náhodné inicializace s datovými body
Python3
sloučit řazení java
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()> |
>
>
Výstup :

Datové body s náhodným středem
Graf zobrazuje bodový graf datových bodů (X[:,0], X[:,1]) s čarami mřížky. Označuje také počáteční středy shluků (červené hvězdy) vytvořené pro shlukování K-středů.
Definujte euklidovskou vzdálenost
Python3
def> distance(p1,p2):> > return> np.sqrt(np.> sum> ((p1> -> p2)> *> *> 2> ))> |
>
>
Vytvořte funkci pro přiřazení a aktualizaci centra clusteru
E-krok přiřadí datové body nejbližšímu centru clusteru a M-krok aktualizuje centra clusteru na základě průměru přiřazených bodů v shlukování 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: Vytvořte funkci pro predikci clusteru pro datové 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> |
>
>
Přiřaďte, aktualizujte a predikujte centrum clusteru
Python3
clusters> => assign_clusters(X,clusters)> clusters> => update_clusters(X,clusters)> pred> => pred_cluster(X,clusters)> |
>
>
Vykreslete datové body s jejich předpokládaným středem shluku
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()> |
tlačítko tkinter
>
>
Výstup :

K-means Clustering
Graf ukazuje datové body zbarvené jejich předpokládanými shluky. Červené značky představují aktualizované středy shluků po krocích E-M v algoritmu shlukování K-means.
Příklad 2
Importujte potřebné knihovny
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čtěte datovou sadu
Python3
X, y> => load_iris(return_X_y> => True> )> |
co je zpracování výjimek v Javě
>
>
Metoda loktů
Nalezení ideálního počtu skupin pro rozdělení dat je základní fází každého neřízeného algoritmu. Jednou z nejběžnějších technik pro určení této ideální hodnoty k je přístup loktem.
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_)> |
>
>
Vykreslete graf kolena, abyste našli optimální počet shluků
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ýstup:

Metoda loktů
Z výše uvedeného grafu můžeme pozorovat, že při k=2 ak=3 je situace podobná kolenu. Takže uvažujeme K=3
Sestavte model shlukování Kmeans
Python3
kmeans> => KMeans(n_clusters> => 3> , random_state> => 2> )> kmeans.fit(X)> |
>
>
Výstup:
KMeans KMeans(n_clusters=3, random_state=2)>
Najděte centrum clusteru
Python3
řetězec v c
kmeans.cluster_centers_> |
>
>
Výstup:
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]])>
Předpovězte skupinu clusteru:
Python3
pred> => kmeans.fit_predict(X)> pred> |
>
>
Výstup:
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)>
Vykreslete střed clusteru pomocí datových bodů
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ýstup:

K-znamená shlukování
Podgraf na levé straně zobrazuje délku okvětních lístků vs. šířku okvětních lístků s datovými body zbarvenými podle shluků a červené značky označují středy shluků K-středů. Dílčí graf vpravo ukazuje délku sepalu vs. šířku sepalu podobně.
Závěr
Závěrem lze říci, že shlukování K-means je výkonný algoritmus strojového učení bez dozoru pro seskupování neoznačených datových sad. Jeho cílem je rozdělit data do shluků, čímž se podobné datové body stanou součástí stejné skupiny. Algoritmus inicializuje těžiště klastru a iterativně přiřazuje datové body nejbližšímu těžišti, přičemž aktualizuje těžiště na základě průměru bodů v každém shluku.
Často kladené otázky (FAQ)
1. Co je to shlukování k-means pro analýzu dat?
K-means je rozdělovací metoda, která rozděluje datovou sadu na „k“ odlišných, nepřekrývajících se podmnožin (shluků) na základě podobnosti s cílem minimalizovat rozptyl v každém shluku.
2.Jaký je příklad k-means v reálném životě?
Segmentace zákazníků v marketingu, kde k-means seskupuje zákazníky na základě nákupního chování, což podnikům umožňuje přizpůsobit marketingové strategie pro různé segmenty.
3. Jaký typ dat je model shlukování k-means?
K-means funguje dobře s numerickými daty, kde je smysluplný koncept vzdálenosti mezi datovými body. Běžně se používá pro spojité proměnné.
4. Používá se K-means pro predikci?
K-means se primárně používá pro shlukování a seskupování podobných datových bodů. Nepředvídá popisky pro nová data; přiřazuje je k existujícím shlukům na základě podobnosti.
5.Co je cílem shlukování k-means?
Cílem je rozdělit data do „k“ shluků a minimalizovat tak rozdíly uvnitř clusteru. Snaží se vytvořit skupiny, kde jsou datové body v každém shluku navzájem podobnější než těm v jiných shlucích.