{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "from sklearn.preprocessing import MinMaxScaler\n", "import matplotlib.pyplot as plt\n", "from sklearn.metrics import silhouette_score\n", "#from scipy.spatial.distance import pdist\n", "from scipy.cluster.hierarchy import dendrogram, linkage, fcluster\n", "#import matplotlib" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Prvih 5 instanci\n", " breed height weight\n", "0 Border Collie 19 45\n", "1 Boston Terrier 12 20\n", "2 Brittany Spaniel 18 35\n", "3 Bullmastiff 29 120\n", "4 Chihuahua 8 8\n" ] } ], "source": [ "#ucitavanje skupa\n", "df = pd.read_csv(\"C:/Users/student/Desktop/ipVezbe122021/primeri/dogs.csv\")\n", "\n", "#prikaz imena kolona + 5 prvih instanci\n", "print('Prvih 5 instanci')\n", "print(df.head())\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Za klasterovanje ce se koristiti atributi visina i tezina psa,\n", "# a rasa nece biti uzeta u obzir.\n", "features = df.columns[1:]\n", "\n", "#vrednost atributa breed (tj. rasa) postaje oznaka (indeks) instance\n", "df.set_index('breed', inplace=True)\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
heightweight
breed
Border Collie1945
Boston Terrier1220
Brittany Spaniel1835
Bullmastiff29120
Chihuahua88
German Shepherd2278
Golden Retriever2370
Great Dane32160
Portuguese Water Dog2150
Standard Poodle1965
Yorkshire Terrier67
\n", "
" ], "text/plain": [ " height weight\n", "breed \n", "Border Collie 19 45\n", "Boston Terrier 12 20\n", "Brittany Spaniel 18 35\n", "Bullmastiff 29 120\n", "Chihuahua 8 8\n", "German Shepherd 22 78\n", "Golden Retriever 23 70\n", "Great Dane 32 160\n", "Portuguese Water Dog 21 50\n", "Standard Poodle 19 65\n", "Yorkshire Terrier 6 7" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "#normalizacija vrednosti atributa\n", "scaler = MinMaxScaler().fit(df)\n", "x = pd.DataFrame(scaler.transform(df), columns=features, index=df.index)\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
heightweight
breed
Border Collie0.5000000.248366
Boston Terrier0.2307690.084967
Brittany Spaniel0.4615380.183007
Bullmastiff0.8846150.738562
Chihuahua0.0769230.006536
German Shepherd0.6153850.464052
Golden Retriever0.6538460.411765
Great Dane1.0000001.000000
Portuguese Water Dog0.5769230.281046
Standard Poodle0.5000000.379085
Yorkshire Terrier0.0000000.000000
\n", "
" ], "text/plain": [ " height weight\n", "breed \n", "Border Collie 0.500000 0.248366\n", "Boston Terrier 0.230769 0.084967\n", "Brittany Spaniel 0.461538 0.183007\n", "Bullmastiff 0.884615 0.738562\n", "Chihuahua 0.076923 0.006536\n", "German Shepherd 0.615385 0.464052\n", "Golden Retriever 0.653846 0.411765\n", "Great Dane 1.000000 1.000000\n", "Portuguese Water Dog 0.576923 0.281046\n", "Standard Poodle 0.500000 0.379085\n", "Yorkshire Terrier 0.000000 0.000000" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "#postavljanje parametara za sliku\n", "#matplotlib.rcParams['font.size']=8\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 5. 6. 0.06490979 2. ]\n", " [ 0. 2. 0.07583634 2. ]\n", " [ 4. 10. 0.07720025 2. ]\n", " [ 8. 12. 0.11749404 3. ]\n", " [ 9. 11. 0.15028617 3. ]\n", " [14. 15. 0.20912385 6. ]\n", " [ 1. 13. 0.20929971 3. ]\n", " [ 3. 7. 0.28576807 2. ]\n", " [16. 17. 0.54224963 9. ]\n", " [18. 19. 0.84284893 11. ]]\n" ] } ], "source": [ "#Primena hijerarhijskg sakupljajuceg klasterovanja koriscenjem euklidskog rastojanja\n", "# i 'average' veze pri odredjivanju bliskosti dva klastera.\n", "#Rezultat je matrica spajanja pri klasterovanju.\n", "Z = linkage(x, 'average')\n", "print(Z)\n" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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ra2tG5Q9+OCD7LXXXr2bQed72qB4GswwurlwoNW0/SRJkiQNqYhYmJlN1caNjJ62Yf40GEmSJEnqSo9Pjxw2hvHTYCRJkiSpKyOjp02SJEmSRiiTNkmSJEmqYyZtkiRJklTHTNokSZIkqY6ZtHXhoYceYsqUKRuV33rrrRx++OE1z+/JJ5/kwgsv7HdcM2fOZI899mDKlCm8//3v57nnnuv3PCVJkiTVL5O2F0lfkrbM5Pnnn9+gbObMmfz617/m/vvv589//jPf/OY3BzJMSZIkSXXGpK0Xli9fzrRp07jnnns2KL/77ruZPn0606ZN43Wvex1LliwBYNGiRey///5MnTqVffbZh6VLl3L66afz29/+lqlTp3LqqacCcN5557Hffvuxzz77cNZZZwFFD98ee+zBcccdx5QpU3j44Yc3WOZhhx1GRBAR7L///qxatepF2AKSJEmShsqISdpaWqCxETbZpPjf0jIw812yZAnvfve7mTdvHvvtt98G4/bcc09uv/127r33Xs455xzOPPNMAC666CJOOeUU2traaG1tZcKECZx77rnstttutLW1cd5557FgwQKWLl3K3XffTVtbGwsXLuS2224DYOnSpZx44oksWrSIiRMnVo3rueee4zvf+Q6HHHLIwKyoJEmSpLo0In5cu6UFZs+GtWuL4RUrimHo3+9tt7e3M2PGDK6++momT5680fg1a9Ywa9Ysli5dSkSsv79s+vTpzJ07l1WrVvGud72LSZMmbTTtggULWLBgAdOmTQPgmWeeYenSpTQ0NDBx4kQOOOCAbmM78cQTeeMb38gb3vCGvq+gJEmSpLrXY09bRFwcEY9FxANVxn0sIjIidiyHIyK+EhHLIuK+iPi7wQi6szlzXkjYOqxdW5T3x9ixY2loaOCOO+6oOv6Tn/wkb3rTm3jggQe47rrrePbZZwE49thjmT9/PltttRWHHXYYN99880bTZiZnnHEGbW1ttLW1sWzZMk444QQAtt56627j+vSnP017eztf/OIX+7eCkiRJkupeby6PnAdsdA1eROwMvB1YWVF8KDCp/JsNfK3/IfZs5crayntriy224JprruHSSy/lsssu22j8mjVrGD9+PADz5s1bX758+XJ23XVXPvKRjzBjxgzuu+8+tt12W55++un1dQ4++GAuvvhinnnmGQBWr17NY4891mNM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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# pravljenje slike sa graficima\n", "fig = plt.figure(figsize=(15, 8))\n", "\n", "# Podela slike na 2x1 celije. U prvoj celiji se crta dendogram.\n", "fig.add_subplot(2,1,1)\n", "\n", "#prikaz izvrsenog hijerarhijskog klasterovanja pomocu dendograma\n", "dn = dendrogram(Z, labels=x.index, leaf_font_size=8, color_threshold=0 )\n", "plt.title('Dendogram')\n", "# Definisanje boja koje se koriste pri crtanju instanci klastera.\n", "# Instance jednog klastera ce biti prikazane istom bojom.\n", "colors = ['red', 'blue', 'green']\n", "\n", "# U drugoj celiji na slici prikazuju se instance klastera pomocu seme sa\n", "# rasprsenim elementima.\n", "fig.add_subplot(2,1,2)\n", "\n", "#Odredjivanje kom klasteru pripada svaka instanca u skupu.\n", "#Kao prag za rastojanje pri spajanju klastera postavlja se vrednost 0.3,\n", "# tj. prekida se spajanje klastera cije je rastojanje iznad 0.3.\n", "#Ako je criterion='maxclust' onda se preko t zadaje zeljeni broj klastera.\n", "\n", "df['label'] = fcluster(Z, t=0.3, criterion='distance')\n", "\n", "#Napomena: Nakon promene parametra color_threshold=0.3 u funkciji dendrogram\n", "# plavom bojom se prikazuju spajanja klastera koja se ne izvrsavaju. Razlicitim\n", "# bojama se prikazuju instance klastera koji ce biti izdvojeni. Oznake klastera su\n", "#u intervalu [1,k], gde je k ukupan broj klastera.\n", "\n", "for i in range(1, max(df['label'])+1):\n", " # izdvajanje instanci klastera koji se obradjuje\n", " cluster = df.loc[df['label']==i]\n", "\n", " # crtanje instanci klastera pomocu seme sa rasprsenim elementima\n", " plt.scatter(cluster['height'], cluster['weight'], color=colors[i-1], label='klaster %d' %i)\n", "\n", "# postavljanje legende i naslova za drugu celiju\n", "plt.title('Silueta koeficijent {0:0.3}'.format(silhouette_score(x, df['label'])))\n", "t=plt.legend()\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "#Komentar: izdvojena su tri klastera kojima su grupisani psi malog, srednjeg i velikog rasta.\n", "\n", "#Na dendogramu se jasno vidi da postoje 3 dobro odvojena klastera, tj. da ne treba izvrsiti\n", "# poslednja 2 spajanja klastera, sto se i postize sa zadatim pragom za rastojanje od 0.3.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.6" } }, "nbformat": 4, "nbformat_minor": 2 }