{ "cells": [ { "cell_type": "code", "execution_count": 96, "id": "e6e27297", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import random\n", "import matplotlib.pyplot as plt\n", "from sklearn.preprocessing import MinMaxScaler\n", "from sklearn.metrics import silhouette_score\n", "from sklearn.decomposition import PCA\n", "from IPython.display import Image" ] }, { "cell_type": "markdown", "id": "e1e5a2b7", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "# Analiza skupień metodą k-medoids " ] }, { "cell_type": "markdown", "id": "80d5deaf", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "### Co to jest klasteryzacja? " ] }, { "cell_type": "markdown", "id": "4040df16", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ " Analiza skupień lub klasteryzacja to zadanie polegające na grupowaniu zbioru obiektów w taki sposób, aby obiekty w tej samej grupie lub klastrze były do siebie bardziej podobne niż obiekty w innych grupach lub klastrach. " ] }, { "cell_type": "markdown", "id": "493a0d16", "metadata": {}, "source": [ " Idea algorytmu klastrowania:" ] }, { "cell_type": "code", "execution_count": 99, "id": "e84b8c18", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApUAAAFTCAYAAABoCPeTAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAClaADAAQAAAABAAABUwAAAACrrMwpAAAHXnRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMmFwcC5kaWFncmFtcy5uZXQlMjIlMjBtb2RpZmllZCUzRCUyMjIwMjItMDYtMTdUMTclM0ExOSUzQTA4Ljg0NFolMjIlMjBhZ2VudCUzRCUyMjUuMCUyMChNYWNpbnRvc2glM0IlMjBJbnRlbCUyME1hYyUyME9TJTIwWCUyMDEwXzE1XzcpJTIwQXBwbGVXZWJLaXQlMkY2MDUuMS4xNSUyMChLSFRNTCUyQyUyMGxpa2UlMjBHZWNrbyklMjBWZXJzaW9uJTJGMTUuNCUyMFNhZmFyaSUyRjYwNS4xLjE1JTIyJTIwZXRhZyUzRCUyMkdLTWZucmFaYnFtcTFvVVBvV3ZJJTIyJTIwdmVyc2lvbiUzRCUyMjIwLjAuMSUyMiUyMHR5cGUlM0QlMjJkZXZpY2UlMjIlM0UlM0NkaWFncmFtJTIwaWQlM0QlMjJXU1V2Q0RDNkVjdTRGcnJHTVJvRSUyMiUyMG5hbWUlM0QlMjJQYWdlLTElMjIlM0U3WnRkajZNMkZJWiUyRlRTNWJnWTBKdWR5azIxMjFxclRTU0szVW04b0I4NkU0T0NMT0pObGZYN044SkJ3WU5UTmlmYlNlM2tSd2pHMTRYc2YyT1FjV2RMTyUyRmZLcjRJZjlESlVJdWlKZGNGdlNYQlNHcklEUyUyRnRlSGFHTUtBTllhc0twTEc1TjhNVDhWWDBScTkxbm9xRW5FY1hLaVZrcm80REkyeEtrc1I2NEdOVjVVNkR5OUxsUnoyZXVDWkdCbWVZaTdIMXIlMkJLUk9lTk5TTExtJTJGMnpLTEs4NjlrUFYwM0pubmNYdDA5eXpIbWl6bmNtJTJCbkZCTjVWU3VqbmFYelpDMXV3NkxrMjlYMThvN1clMkJzRXFWJTJCcE1MZnY1ODIlMkY1QThYNmRaOXR2dWFlZiUyRnVUdiUyRjFMYnl6T1dwZmVEMlp2VzFJeURLNUVNTjBwekZraCUyQlBSYnlnNjF6dnBUSDQ1ckJTcHpJUmRTZWVPVXNMS1RkS3F1cGJaWnB3RWFWMWhhT3UxRTdjbFlSeEpMYXBLV2s2Rk1sSWg5dUQlMkJUMHVNOHlFMmd0ZFhjMGw1NXNncklXYzMyblIyU29odVM2ZWg4M3pkbHhrZlhOOUQxOVVZVG9tWGp1RWc3YVpkZ0RUVHMlMkJ1aGFNNlZiRm9LOTN6QiUyQjMwRlY5cVNQTXFFM3JVa0RtNGUlMkJxYjZadThyNUNhJTJGQyUyRjFmMGtkQVlYQ04wb04yb25zQ2swZkVGcEtNNEdhayUyRlU1TDdSNE92QzRMam1iS1h5b09EOGVtbGsxTFM2MThDUFJtWWlTWUVyMGlHeHBHUGFpUDR0S2k4dHJaZThxZ0wlMkJPMzYwT2Q4UENueGdXdnZmeUNCaFFmeTNpd0gzRUFUSmk1aDVpc0pMNEZCbHg2QjdpRUNCbXlJaVg3aUZtQUxHSGpEaHlEJTJGRnlpSmhnejhVcjl4RXZrUkYzRGJ2RWVBVVloOWlNSCUyRkYyZnl6R1BheU9jWVROJTJCQkUzOHdkajdBSEcyUHMyMzcwbGo4QmRCV1hJak4xYjgwYU1RMlRHeEwwMWo0QjloYyUyQndHVHU0NW9GOWhiJTJGRVp1emdtZ2RDbUQ3Qlp2eElWUE9kaDY4RHNGRjVjNm9paElGdzI2bUtSJTJCS3I3MTFzbUpkNmE3SUNObVE1VzBIY0MlMkZRR2NQTEVUbGNROXlLOUk4YllNVExpWHFpWGdmVUVQV0ZCM0hOOEdjeTdZV2NzaUh1T0x3TkJNdlNVUmZjJTJGc3NJNFRVVVlUJTJCNTFrdVZxNjNrek1hWkR4dWc1QzJyVDhVVmlqSjIwb0RZZFgwdU1RWkFNUFdsQmJiN09ZNGt4VEw1aEp5Mm96ZmQ1TERFR2IwS2dKeTJvVFQ4dmpXSXh6WGdic1lETnhEaUUlMkJ3cnNwQVcxNmVjaE1jWk9XbENiZnA0bHhtQmZnWjYwb0RiOVBFdU1ZZklOTzJsQmJmcDVsaGpERnl5eGt4YmQlMkZjekMlMkJCNXBxVXJ4M1NOc3dmSm5OdUM1bXRoQyUyQkd6TUUwYVE1JTJCTTVwMCUyRjNDTTg1UnlkYlFwNDlQRHlnY3pwd2p3Q2RjNHNickNEUSUyRmxz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0pp2IG/QRhsLYAO5z85x9V40rlHIrEjABPDEhCc3PHVh+MJYzBJwQhFyA3pJMXyEJ308+WJuKXoRsA9poAGLlzB0hHmxaqWgnsAfaBqMTwIkQAIgoFYfC/amxGJIjFLgfSQGzO/EvpCYqoWeVKwpwFx2jKxhgVOggb+RgRGLDSw6Y7uNAAQR5vFhuJ2C8puti3mwmHIAEYlhf8yHDbbxhijFxHnMXcL8VAYSIAESCJYAhsKxKAjDvaecckqwyTj+PqxQx7Ay5qOvW7dOt9cYpjamGQVaQf5GBkaMPZWB8WJsEiABEiABEiABEiABLwS4UMcLFJ4iARIgARIgARIgARIIjABFZWC8GJsESIAESIAESIAESMALAYpKL1B4igRIgARIgARIgARIIDACFJWB8WJsEiABEiABEiABEiABLwQoKr1A4SkSIAESIAESIAESIIHACFBUBsaLsUmABEiABEiABEiABLwQoKj0AoWnSIAESIAESIAESIAEAiNAURkYL8YmARIgARIgARIgARLwQoCi0gsUniIBEiABEiABEiABEgiMAEVlYLwYmwRIgARIgARIgARIwAsBikovUHiKBEiABEiABEiABEggMAIUlYHxYmwSIAESIAESIAESIAEvBCgqvUDhKRIgARIgARIgARIggcAIUFQGxouxSYAESIAESIAESIAEvBCgqPQChadIgARIgARIgARIgAQCI0BRGRgvxiYBEiABEiABEiABEvBCgKLSCxSeIgESIAESIAESIAESCIwARWVgvBibBEiABEiABEiABEjACwGKSi9QeIoESIAESIAESIAESCAwAhSVgfFibBIgARIgARIgARIgAS8EKCq9QOEpEiABEiABEiABEiCBwAhQVAbGi7FJgARIgARIgARIgAS8EKCo9AKFp0iABEiABEiABEiABAIjQFEZGC/GJgESIAESIAESIAES8EKAotILFJ4iARIgARIgARIgARIIjABFZWC8GJsESIAESIAESIAESMALAYpKL1B4igRIgARIgARIgARIIDACjhWVNXWN8tisLwSvDCRAAiRAAvYhwPbZPrZgSUgglAQcKyo/Wl4qW3cekNnLdoSSF/MiARIgARL4BgJsn78BEC+TgEsJOFJU1tY3yRwlKhuaWmTuip2CzwwkQAIkQALhJ8D2Ofw2YAlIIFwEHCkq0Tvp8RxB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dWs8fPiIkFy0QPavXyfZI0YqMTlDRtxym8TEx4eqGEflQ1F5FA5+IAESIAESIAEScDMBCK6uSkTiaKqrUwJzaavAxLB41uChkjVUHQMHS2xysm1QNNXUSOW6NVK5apVUrlklGObuPHS42rR8hgz/2a0Sm5gY9rJSVIbdBCwACZAACZAACZBAOAhAiHWbpDYVV0eL2nLnoBo6rlyzWu/huPLR30lqfk9J7dlT0noWSGpBodogvFDi1ebjVocGtbl5dUmxHFJHdUmJHNqxXR+d+vZTQnKYDLriaklXQ/jRNtsyiaLS6m8G0ycBEiABEiABErA9AQi0DLVyHAc2Fccm4Qe2bjki7LaXyG41X7G6eJvEqSHypC5dJTErSxKyOn/1mp2tXRzCzWFscoreUBz7ZEbHxkpLU5Ngn0hs1N5Uc1iaamv1UVdRIfWV+6SusvLI6759au7nHsHQdlphkfZyg/mf3WeeIJ169bb9pu4Ulbb/mrOAJEACJEACJEACoSYQHRen93M8dk/H2vK9eujZEIM1e3ZL5dq1WhRiiLqprlbobkHdAAAhcklEQVSa1bA6RKkhJLFBuxaYKs0Y1Tsam6iEpxKnCZlZagPyI+IUbhITO2frxTVJOaFdYGMWW4pKs0gyHRIgARIgARIgAdcTgOBzquiz2jjmOHu0upRMnwRIgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2YilJgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2YilJgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2YilJgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2YilJgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2YilJgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2YilJgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2YilJgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2YilJgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2YilJgARIgARIgARIwNYEKCptbR4WjgRIgARIgARIgAScQYCi0hl2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AAmQgI0IWNk+U1TayNAsCgm4icDQ3tluqg7rQgIkQAKuIWBV+8wthVzzFWFFSIAESIAESIAESCB8BCgqw8eeOZMACZAACZAACZCAawhQVLrGlKwICZAACZAACZAACYSPAEVl+NgzZxIgARIgARIgARJwDQGKSteYkhUhARIgARIgARIggfARoKgMH3vmTAIkQAIkQAIkQAKuIUBR6RpTsiIkQAIkQAIkQAIkED4CFJXhY8+cSYAESIAESIAESMA1BCgqXWNKVoQESIAESIAESIAEwkeAojJ87JkzCZAACZAACZAACbiGAEWla0zJipAACZAACZAACZBA+AhQVIaPPXMmARIgARIgARIgAdcQoKh0jSlZERIgARIgARIgARIIHwGKyvCxZ84kQAIkQAIkQAIk4BoCFJWuMSUrQgIkQAIkQAIkQALhI0BRGT72zJkESIAESIAESIAEXEOAotI1pmRFSIAESIAESIAESCB8BCgqw8eeOZMACZAACZAACZCAawhQVLrGlKwICZAACZAACZAACYSPAEVl+NgzZxIgARIgARIgARJwDQGKSteYkhUhARIgARIgARIggfARoKgMH3vmTAIkQAIkQAIkQAKuIUBR6RpTsiIkQAIkQAIkQAIkED4CFJXhY8+cSYAESIAESIAESMA1BCgqXWNKVoQESIAESIAESIAEwkeAojJ87JkzCZAACZAACZAACbiGAEWla0zJipAACZAACZAACZBA+AhQVIaPPXMmARIgARIgARIgAdcQoKh0jSlZERIgARIgARIgARIIHwGKyvCxZ84kQAIkQAIkQAIk4BoCFJWuMSUrQgIkQAIkQAIkQALhI0BRGT72zJkESIAESIAESIAEXEOAotI1pmRFSIAESIAESIAESCB8BCgqw8eeOZMACZAACZAACZCAawg4WlSePL7QNYZgRUiABEjATQTYPrvJmqwLCfhHIMqjgn9RGYsESIAESIAESIAESIAEvBNwdE+l9yrxLAmQAAmQAAmQAAmQQKgJUFSGmjjzIwESIAESIAESIAEXEqCodKFRWSUSIAESIAESIAESCDUBispQE2d+JEACJEACJEACJOBCAhSVLjQqq0QCJEACJEACJEACoSZAURlq4syPBEiABEiABEiABFxIgKLShUZllUiABEiABEiABEgg1AT+Hz8JfMoE6SI2AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(\"algorithm.png\")" ] }, { "cell_type": "markdown", "id": "5813bd1a", "metadata": {}, "source": [ " Sama analiza skupień nie jest jednym konkretnym algorytmem, lecz ogólnym zadaniem do rozwiązania. Można je zrealizować za pomocą różnych algorytmów (algorytm $k-średnich$, algorytm $k-medoid$), które różnią się znacznie w rozumieniu tego, czym jest klaster i jak skutecznie je znaleźć. Popularne pojęcia klastrów obejmują grupy o małych odległościach między elementami klastra. Klastrowanie można zatem sformułować jako wieloprzedmiotowy problem optymalizacyjny. Wybór odpowiedniego algorytmu grupowania i ustawień parametrów zależy od indywidualnego zbioru danych i przeznaczenia wyników. Analiza skupień jako taka nie jest zadaniem automatycznym, lecz iteracyjnym procesem odkrywania wiedzy lub interaktywnej optymalizacji wieloprzedmiotowej, który wymaga prób i błędów. Często konieczne jest modyfikowanie wstępnego przetwarzania danych i parametrów modelu, aż do uzyskania pożądanych właściwości." ] }, { "cell_type": "markdown", "id": "3dc57d21", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ " W naszym projekcie przedstawimy metodę $k-medoid$ i porównamy ją z metodą $k-średnich$." ] }, { "cell_type": "markdown", "id": "2e28109b", "metadata": {}, "source": [ "### Algorytm k-średnich" ] }, { "cell_type": "markdown", "id": "01b24fd7", "metadata": {}, "source": [ " W uczeniu maszynowym występują głównie dwa rodzaje algorytmów uczenia. Są to algorytm uczenia nadzorowanego i algorytm uczenia nienadzorowanego. \n", "Klastrowanie metodą $k-średnich$ jest algorytmem uczenia nienadzorowanego, który grupuje nieoznakowane zbiory danych w różne klastry lub grupy. W algorytmie $k-średnich$ $k$ określa liczbę wstępnie zdefiniowanych klastrów lub grup, które należy utworzyć w danym zbiorze danych. Na przykład jeśli $k = 3$, powstaną trzy klastry, dla $k = 5$ będzie pięć klastrów itd." ] }, { "cell_type": "markdown", "id": "7f4d7284", "metadata": {}, "source": [ " Algorytm $k-średnich$ pomaga grupować dane w różne klastry w sposób konwencjonalny, umożliwiając samodzielne odkrywanie kategorii grup w nieoznakowanym zbiorze danych bez konieczności uczenia. Algorytm klasteryzacji $k-średnich$ jest algorytmem opartym na centroidach, w którym każdy klaster jest powiązany z centroidem. Głównym celem tego algorytmu jest zminimalizowanie sumy odległości wewnętrznych punktów danych w odpowiadających im klastrach. Algorytm przyjmuje jako dane wejściowe nieuporządkowany zbiór danych i dzieli go na $k$ grup, a następnie powtarza ten proces aż do uzyskania najlepszych klastrów. Wartość $k$ jest zawsze określona z góry." ] }, { "cell_type": "markdown", "id": "22642017", "metadata": {}, "source": [ " Główne zadanie algorytmu $k-średnich$ jest następujące:\n", "\n", "  $1.$ Wybierz liczbę klastrów $k$. \n", "  $2.$ Wybierz losowo $k$ punktów z zestawu danych jako centroidy. \n", "  $3.$ Przypisz każdy punkt danych do najbliższego mu centroida. \n", "  $4.$ Oblicz wariancję i umieść nowy centroid dla każdego klastra. \n", "  $5.$ Powtórz $krok 3$, czyli ponownie przypisz każdy punkt danych do nowego najbliższego centroidu." ] }, { "cell_type": "markdown", "id": "15d683c2", "metadata": {}, "source": [ " **Rozwiązanie**: Implementacja algorytmu $k-średnich$ przy użyciu Pythona. Do wykonania algorytmu $k-średnich$ potrzebne jest wstępne przetwarzanie danych. W naszym rozwiązaniu przeprowadziliśmy wstępne przetwarzanie danych w celu zaimplementowania algorytmu. Dodatkowo oceniliśmy jaka jest jakość naszego grupowania. Posłużyliśmy się tzw. sylwetką (ang. silhouette) $s(x_i)$ obliczaną dla każdego obiektu $x_i$. Najpierw dla $x_i$ znajduje się jego średnią odległość $a(x_i)$ od pozostałych obiektów grupy, do której został przydzielony, a następnie wybiera się minimalną wartość $b(x_i)$ spośród obliczonych odległości od $x_i$ do każdej spośród pozostałych grup osobno. Odległość $x_i$ od danej grupy oblicza się jako średnią odległość od $x_i$ do wszystkich elementów tej grupy. Obie wielkości zestawia się we wzorze: " ] }, { "cell_type": "markdown", "id": "e276f546", "metadata": {}, "source": [ "

$s(x_i) = \\frac{b(x_i)-a(x_i)}{max(a(x_i),b(x_i))}$

" ] }, { "cell_type": "markdown", "id": "9af1d9d2", "metadata": {}, "source": [ "otrzymując wartość sylwetki dla danego obiektu $x_i$. Jej zbiór wartości to $[-1, 1]$. Zatem ma ona prostą interpretację: obiekty, dla których wskaźnik jest bliski $1$, zostały trafnie zgrupowane, pozostałe (o wartości ok. $0$ i $ujemnej$) prawdopodobnie trafiły do złych grup." ] }, { "cell_type": "code", "execution_count": 16, "id": "409d4187", "metadata": {}, "outputs": [], "source": [ "class TrainModel_means:\n", " def __init__(self, data, k_value, max_iteration):\n", " self.data = data\n", " scaler = MinMaxScaler()\n", " self.data = scaler.fit_transform(self.data)\n", " self.k_value = k_value\n", " self.max_iteration = max_iteration\n", " self.centroids = []\n", " self.final_clusters, self.silhouette = self.data_cluster()\n", "\n", " def generate_column(self, col, data):\n", " values = []\n", " for i in range(len(data)):\n", " values.append(data[i][col])\n", " return values\n", "\n", " def calculateDistance(self, x, y):\n", " return np.linalg.norm(x-y)\n", "\n", " def get_closest_centroid(self, points, centroids):\n", " closest_centroids = []\n", " for i in points:\n", " distance = []\n", " for c in centroids:\n", " dis = self.calculateDistance(i, c)\n", " distance.append(dis)\n", " closest_centroids.append(np.argmin(distance))\n", " return closest_centroids\n", "\n", " def calculate_new_centroids(self, clusters, X):\n", " new_centroids = []\n", " new_df = pd.concat([pd.DataFrame(X), pd.DataFrame(clusters, columns=['cluster'])], axis=1)\n", " for c in set(new_df['cluster']):\n", " current_cluster = new_df[new_df['cluster'] == c][new_df.columns[:-1]]\n", " cluster_mean = current_cluster.mean(axis=0)\n", " new_centroids.append(cluster_mean)\n", " return new_centroids\n", "\n", " def get_clustered_data(self, points, centroids):\n", " closest_centroids = self.get_closest_centroid(points, centroids)\n", " clustered_data = {}\n", " for i in range(self.k_value):\n", " clustered_data[i] = []\n", " for i in range(len(points)):\n", " clustered_data[closest_centroids[i]].append(points[i])\n", " return clustered_data\n", "\n", " def get_clusters_label(self, data_points, clusters):\n", " labels = []\n", " for i in range(len(data_points)):\n", " labels.append(0)\n", " for i in clusters.keys():\n", " cluster = clusters[i]\n", " for j in range(len(cluster)):\n", " for k in range(len(data_points)):\n", " if (cluster[j] == data_points[k]).all():\n", " labels[k] = i\n", " break\n", " return labels\n", "\n", " def data_cluster(self):\n", " centroid_points = random.sample(range(0, len(self.data)), self.k_value)\n", " for i in centroid_points:\n", " self.centroids.append(self.data[i])\n", " for i in range(self.max_iteration):\n", " closest_centroids = self.get_closest_centroid(self.data, self.centroids)\n", " self.centroids = self.calculate_new_centroids(closest_centroids, np.array(self.data))\n", " final_clusters = self.get_clustered_data(self.data, self.centroids)\n", " cluster_labels = self.get_clusters_label(self.data, final_clusters)\n", " silhouette_avg = silhouette_score(self.data, cluster_labels)\n", " print(\"Sylwetka (ang.silhouette) dla metody k-medoid i dla k =\", self.k_value, round(silhouette_avg,2))\n", " \n", " return final_clusters, round(silhouette_avg,2)\n", " \n", " def return_values(self):\n", " return self.centroids, self.final_clusters, self.silhouette" ] }, { "cell_type": "code", "execution_count": 55, "id": "b42a9194", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sylwetka (ang.silhouette) dla metody k-medoid i dla k = 3 0.44\n" ] } ], "source": [ "# iris\n", "dataset = pd.read_csv('iris.csv')\n", "dataset = dataset.iloc[: , 1:-1]\n", "dataset = dataset.values\n", "model = TrainModel_means(dataset, 3, 10)\n", "centroids, final_clusters, silhouette = model.return_values()" ] }, { "cell_type": "code", "execution_count": 60, "id": "15541704", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sylwetka (ang.silhouette) dla metody k-medoid i dla k = 4 0.28\n" ] } ], "source": [ "# glass\n", "dataset2= pd.read_csv('glass.csv')\n", "dataset2 = dataset2.iloc[:,:-1]\n", "dataset2 = dataset2.values\n", "model2 = TrainModel_means(dataset2, 4, 10)\n", "centroids2, final_clusters2, silhouette2 = model2.return_values()" ] }, { "cell_type": "code", "execution_count": 70, "id": "c29dca2b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sylwetka (ang.silhouette) dla metody k-medoid i dla k = 3 0.3\n" ] } ], "source": [ "# wine\n", "dataset3= pd.read_csv('wine.csv')\n", "dataset3 = dataset3.values\n", "model3 = TrainModel_means(dataset3, 3, 10)\n", "centroids3, final_clusters3, silhouette3 = model3.return_values()" ] }, { "cell_type": "markdown", "id": "f7c684c9", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "### Algorytm k-medoid" ] }, { "cell_type": "markdown", "id": "af45d7c7", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "$1.$ Inicjalizacja: wybierz $k$ losowych punktów spośród $n$ punktów danych jako medoidy. \n", "$2.$ Przyporządkuj każdy punkt danych do najbliższego medoidu, używając dowolnych popularnych metod metryki odległości. \n", "$3.$ Podczas gdy koszt maleje: \n", "  Dla każdej medoidy $m$, dla każdego punktu danych $o$, który nie jest medoidą: \n", "    $i.$ Zamień punkty $m$ i $o$, przyporządkuj każdy punkt danych do najbliższej medoidy, ponownie oblicz koszt. \n", "    $ii.$ Jeśli całkowity koszt jest większy niż w poprzednim kroku, cofnij zamianę." ] }, { "cell_type": "markdown", "id": "d8f6dd1e", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ " **Rozwiązanie**: Implementacja algorytmu k-medoid w Pythonie. Do wykonania algorytmu k-medoidy potrzebne jest wstępne przetworzenie danych. W naszym rozwiązaniu przeprowadziliśmy wstępne przetwarzanie danych w celu zaimplementowania algorytmu k-medoid. " ] }, { "cell_type": "code", "execution_count": 20, "id": "73cffc81", "metadata": { "pycharm": { "name": "#%%\n" } }, "outputs": [], "source": [ "class TrainModel_medoids:\n", " def __init__(self, data, k_value):\n", " self.data = data\n", " scaler = MinMaxScaler()\n", " self.data = scaler.fit_transform(self.data)\n", " self.k_value = k_value\n", " self.medoids, self.res_cluster, self.cluster_labels, self.silhouette = self.kmedoids(self.data)\n", "\n", " def get_random_medoids(self, data):\n", " points = random.sample(range(0, len(data)), self.k_value)\n", " medoids = []\n", " for i in points:\n", " medoids.append(data[i])\n", " return medoids\n", "\n", " def get_closest_medoids(self, sample_point, medoids):\n", " min_distance = float('inf')\n", " closest_medoid = None\n", " for i in range(len(medoids)):\n", " distance = self.calculateDistance(sample_point, medoids[i])\n", " if distance < min_distance:\n", " min_distance = distance\n", " closest_medoid = i\n", " return closest_medoid\n", "\n", " def get_clusters(self, data_points, medoids):\n", " clusters = [[] for _ in range(self.k_value)]\n", " for i in range(len(data_points)):\n", " x = self.get_closest_medoids(data_points[i], medoids)\n", " clusters[x].append(data_points[i])\n", " return clusters\n", "\n", " def calculate_cost(self, data_points, clusters, medoids):\n", " cost = 0\n", " for i in range(len(clusters)):\n", " for j in range(len(clusters[i])):\n", " cost += self.calculateDistance(medoids[i], clusters[i][j])\n", " return cost\n", "\n", " def get_non_medoids(self, data_points, medoids):\n", " non_medoids = []\n", " for sample in data_points:\n", " flag = False\n", " for m in medoids:\n", " if (sample == m).all():\n", " flag = True\n", " if flag == False:\n", " non_medoids.append(sample)\n", " return non_medoids\n", "\n", " def get_clusters_label(self, data_points, clusters):\n", " labels = []\n", " for i in range(len(data_points)):\n", " labels.append(0)\n", " for i in range(len(clusters)):\n", " cluster = clusters[i]\n", " for j in range(len(cluster)):\n", " for k in range(len(data_points)):\n", " if (cluster[j] == data_points[k]).all():\n", " labels[k] = i\n", " break\n", " return labels\n", "\n", " def kmedoids(self, data):\n", " medoids = self.get_random_medoids(data)\n", " clusters = self.get_clusters(data, medoids)\n", " initial_cost = self.calculate_cost(data, clusters, medoids)\n", " while True:\n", " best_medoids = medoids\n", " lowest_cost = initial_cost\n", " for i in range(len(medoids)):\n", " non_medoids = self.get_non_medoids(data, medoids)\n", " for j in range(len(non_medoids)):\n", " new_medoids = medoids.copy()\n", " for k in range(len(new_medoids)):\n", " if (new_medoids[k] == medoids[i]).all():\n", " new_medoids[k] = non_medoids[j]\n", " new_clusters = self.get_clusters(data, new_medoids)\n", " new_cost = self.calculate_cost(data, new_clusters, new_medoids)\n", " if new_cost < lowest_cost:\n", " lowest_cost = new_cost\n", " best_medoids = new_medoids\n", " if lowest_cost < initial_cost:\n", " initial_cost = lowest_cost\n", " medoids = best_medoids\n", " else:\n", " break\n", " final_clusters = self.get_clusters(data, medoids)\n", " cluster_labels = self.get_clusters_label(data, final_clusters)\n", " silhouette_avg = silhouette_score(data, cluster_labels)\n", "\n", " print(\"Sylwetka (ang.silhouette) dla metody k-medoid i dla k =\", self.k_value, round(silhouette_avg,2))\n", "\n", " res_cluster = []\n", " for i in range(0, self.k_value):\n", " res_cluster.append([data[s] for s in range(0, len(data)) if cluster_labels[s] == i])\n", " return medoids, res_cluster, cluster_labels, round(silhouette_avg,2)\n", "\n", " def calculateDistance(self, x, y):\n", " return np.linalg.norm(x-y)\n", "\n", " def return_values(self):\n", " return self.medoids, self.res_cluster, self.cluster_labels, self.silhouette" ] }, { "cell_type": "markdown", "id": "c5290f06", "metadata": {}, "source": [ "#### Uruchomienie algorytmu k-medoid dla zbioru danych iris" ] }, { "cell_type": "code", "execution_count": 117, "id": "4c1f8423", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sylwetka (ang.silhouette) dla metody k-medoid i dla k = 3 0.48\n" ] }, { "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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Długość kielichaSzerokość kielichaDługość płatkaSzerokość płatkaWartość medoidu 0Wartość medoidu 1Wartość medoidu 2Medoid
00.170.460.080.00(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
10.170.460.080.00(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
20.750.500.630.54(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
30.580.500.590.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
40.720.460.660.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
50.330.120.510.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
60.610.330.610.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
70.390.330.590.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
80.560.540.630.63(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
90.170.170.390.38(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
100.640.380.610.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
110.250.290.490.54(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
120.190.000.420.38(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
130.440.420.540.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
140.470.080.510.38(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
150.500.380.630.54(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
160.360.380.440.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
170.670.460.580.54(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
180.360.420.590.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
190.420.290.530.38(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
200.530.080.590.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
210.360.210.490.42(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
220.440.500.640.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
230.500.330.510.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
240.560.210.660.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
250.500.330.630.46(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
260.580.380.560.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
270.640.420.580.54(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
280.690.330.640.54(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
290.470.380.590.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
300.390.250.420.38(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
310.330.170.470.42(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
320.330.170.460.38(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
330.420.290.490.46(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
340.470.290.690.63(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
350.310.420.590.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
360.470.580.590.63(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
370.670.460.630.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
380.560.120.580.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
390.360.420.530.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
400.330.210.510.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
410.330.250.580.46(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
420.500.420.610.54(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
430.420.250.510.46(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
440.190.120.390.38(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
450.360.290.540.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
460.390.420.540.46(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
470.390.380.540.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
480.530.380.560.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
490.220.210.340.42(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)2
500.390.330.530.50(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
510.420.290.690.75(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
520.170.210.590.67(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
530.390.210.680.79(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
540.470.080.680.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
550.360.330.660.79(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
560.560.290.660.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
570.530.330.640.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
580.500.420.660.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
590.560.330.690.58(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
600.500.250.780.54(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
610.470.420.640.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
620.420.290.690.75(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
630.560.210.680.75(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
640.440.420.690.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
650.670.420.680.67(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
660.560.540.851.00(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
670.780.420.830.83(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
680.560.380.780.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
690.610.420.810.88(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
700.920.420.950.83(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
710.830.380.900.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
720.670.210.810.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
730.810.670.861.00(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
740.610.500.690.79(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
750.580.290.730.75(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
760.690.420.760.83(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
770.420.330.690.96(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
780.580.500.730.92(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
790.610.420.760.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
800.940.750.970.88(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
810.940.251.000.92(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
820.720.500.800.92(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
830.940.330.970.79(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
840.670.540.800.83(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
850.810.500.850.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
860.580.330.780.83(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
870.810.420.810.63(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
880.860.330.860.75(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
891.000.750.920.79(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
900.580.330.780.88(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
910.940.420.860.92(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
920.560.580.780.96(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
930.580.460.760.71(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
940.720.460.750.83(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
950.670.460.780.96(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
960.720.460.690.92(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
970.690.500.830.92(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
980.670.540.801.00(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
990.670.420.710.92(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1000.610.420.710.79(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1010.530.580.750.92(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1020.220.620.070.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1030.170.420.070.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1040.110.500.050.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1050.080.460.080.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1060.190.670.070.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1070.310.790.120.12(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1080.080.580.070.08(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1090.190.580.080.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1100.030.380.070.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1110.170.460.080.00(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1120.310.710.080.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1130.140.580.100.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1140.140.420.070.00(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1150.000.420.020.00(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1160.420.830.030.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1170.391.000.080.12(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1180.310.790.050.12(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1190.220.620.070.08(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1200.390.750.120.08(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1210.220.750.080.08(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1220.310.580.120.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1230.220.710.080.12(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1240.080.670.000.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1250.220.540.120.17(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1260.140.580.150.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1270.190.420.100.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1280.190.580.100.12(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1290.250.620.080.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1300.250.580.070.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1310.110.500.100.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1320.140.460.100.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1330.310.580.080.12(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1340.250.870.080.00(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1350.330.920.070.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1360.190.500.030.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1370.330.620.050.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1380.030.420.050.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1390.220.580.080.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1400.190.620.050.08(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1410.060.120.050.08(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1420.030.500.050.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1430.190.620.100.21(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1440.220.750.150.12(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1450.140.420.070.08(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1460.220.750.100.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
1470.080.500.070.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1480.280.710.080.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)1
1490.190.540.070.04(0.47, 0.38, 0.59, 0.58)(0.69, 0.42, 0.76, 0.83)(0.19, 0.58, 0.08, 0.04)0
\n", "
" ], "text/plain": [ " Długość kielicha \\\n", "0 0.17 \n", "1 0.17 \n", "2 0.75 \n", "3 0.58 \n", "4 0.72 \n", "5 0.33 \n", "6 0.61 \n", "7 0.39 \n", "8 0.56 \n", "9 0.17 \n", "10 0.64 \n", "11 0.25 \n", "12 0.19 \n", "13 0.44 \n", "14 0.47 \n", "15 0.50 \n", "16 0.36 \n", "17 0.67 \n", "18 0.36 \n", "19 0.42 \n", "20 0.53 \n", "21 0.36 \n", "22 0.44 \n", "23 0.50 \n", "24 0.56 \n", "25 0.50 \n", "26 0.58 \n", "27 0.64 \n", "28 0.69 \n", "29 0.47 \n", "30 0.39 \n", "31 0.33 \n", "32 0.33 \n", "33 0.42 \n", "34 0.47 \n", "35 0.31 \n", "36 0.47 \n", "37 0.67 \n", "38 0.56 \n", "39 0.36 \n", "40 0.33 \n", "41 0.33 \n", "42 0.50 \n", "43 0.42 \n", "44 0.19 \n", "45 0.36 \n", "46 0.39 \n", "47 0.39 \n", "48 0.53 \n", "49 0.22 \n", "50 0.39 \n", "51 0.42 \n", "52 0.17 \n", "53 0.39 \n", "54 0.47 \n", "55 0.36 \n", "56 0.56 \n", "57 0.53 \n", "58 0.50 \n", "59 0.56 \n", "60 0.50 \n", "61 0.47 \n", "62 0.42 \n", "63 0.56 \n", "64 0.44 \n", "65 0.67 \n", "66 0.56 \n", "67 0.78 \n", "68 0.56 \n", "69 0.61 \n", "70 0.92 \n", "71 0.83 \n", "72 0.67 \n", "73 0.81 \n", "74 0.61 \n", "75 0.58 \n", "76 0.69 \n", "77 0.42 \n", "78 0.58 \n", "79 0.61 \n", "80 0.94 \n", "81 0.94 \n", "82 0.72 \n", "83 0.94 \n", "84 0.67 \n", "85 0.81 \n", "86 0.58 \n", "87 0.81 \n", "88 0.86 \n", "89 1.00 \n", "90 0.58 \n", "91 0.94 \n", "92 0.56 \n", "93 0.58 \n", "94 0.72 \n", "95 0.67 \n", "96 0.72 \n", "97 0.69 \n", "98 0.67 \n", "99 0.67 \n", "100 0.61 \n", "101 0.53 \n", "102 0.22 \n", "103 0.17 \n", "104 0.11 \n", "105 0.08 \n", "106 0.19 \n", "107 0.31 \n", "108 0.08 \n", "109 0.19 \n", "110 0.03 \n", "111 0.17 \n", "112 0.31 \n", "113 0.14 \n", "114 0.14 \n", "115 0.00 \n", "116 0.42 \n", "117 0.39 \n", "118 0.31 \n", "119 0.22 \n", "120 0.39 \n", "121 0.22 \n", "122 0.31 \n", "123 0.22 \n", "124 0.08 \n", "125 0.22 \n", "126 0.14 \n", "127 0.19 \n", "128 0.19 \n", "129 0.25 \n", "130 0.25 \n", "131 0.11 \n", "132 0.14 \n", "133 0.31 \n", "134 0.25 \n", "135 0.33 \n", "136 0.19 \n", "137 0.33 \n", "138 0.03 \n", "139 0.22 \n", "140 0.19 \n", "141 0.06 \n", "142 0.03 \n", "143 0.19 \n", "144 0.22 \n", "145 0.14 \n", "146 0.22 \n", "147 0.08 \n", "148 0.28 \n", "149 0.19 \n", "\n", " Szerokość kielicha \\\n", "0 0.46 \n", "1 0.46 \n", "2 0.50 \n", "3 0.50 \n", "4 0.46 \n", "5 0.12 \n", "6 0.33 \n", "7 0.33 \n", "8 0.54 \n", "9 0.17 \n", "10 0.38 \n", "11 0.29 \n", "12 0.00 \n", "13 0.42 \n", "14 0.08 \n", "15 0.38 \n", "16 0.38 \n", "17 0.46 \n", "18 0.42 \n", "19 0.29 \n", "20 0.08 \n", "21 0.21 \n", "22 0.50 \n", "23 0.33 \n", "24 0.21 \n", "25 0.33 \n", "26 0.38 \n", "27 0.42 \n", "28 0.33 \n", "29 0.38 \n", "30 0.25 \n", "31 0.17 \n", "32 0.17 \n", "33 0.29 \n", "34 0.29 \n", "35 0.42 \n", "36 0.58 \n", "37 0.46 \n", "38 0.12 \n", "39 0.42 \n", "40 0.21 \n", "41 0.25 \n", "42 0.42 \n", "43 0.25 \n", "44 0.12 \n", "45 0.29 \n", "46 0.42 \n", "47 0.38 \n", "48 0.38 \n", "49 0.21 \n", "50 0.33 \n", "51 0.29 \n", "52 0.21 \n", "53 0.21 \n", "54 0.08 \n", "55 0.33 \n", "56 0.29 \n", "57 0.33 \n", "58 0.42 \n", "59 0.33 \n", "60 0.25 \n", "61 0.42 \n", "62 0.29 \n", "63 0.21 \n", "64 0.42 \n", "65 0.42 \n", "66 0.54 \n", "67 0.42 \n", "68 0.38 \n", "69 0.42 \n", "70 0.42 \n", "71 0.38 \n", "72 0.21 \n", "73 0.67 \n", "74 0.50 \n", "75 0.29 \n", "76 0.42 \n", "77 0.33 \n", "78 0.50 \n", "79 0.42 \n", "80 0.75 \n", "81 0.25 \n", "82 0.50 \n", "83 0.33 \n", "84 0.54 \n", "85 0.50 \n", "86 0.33 \n", "87 0.42 \n", "88 0.33 \n", "89 0.75 \n", "90 0.33 \n", "91 0.42 \n", "92 0.58 \n", "93 0.46 \n", "94 0.46 \n", "95 0.46 \n", "96 0.46 \n", "97 0.50 \n", "98 0.54 \n", "99 0.42 \n", "100 0.42 \n", "101 0.58 \n", "102 0.62 \n", "103 0.42 \n", "104 0.50 \n", "105 0.46 \n", "106 0.67 \n", "107 0.79 \n", "108 0.58 \n", "109 0.58 \n", "110 0.38 \n", "111 0.46 \n", "112 0.71 \n", "113 0.58 \n", "114 0.42 \n", "115 0.42 \n", "116 0.83 \n", "117 1.00 \n", "118 0.79 \n", "119 0.62 \n", "120 0.75 \n", "121 0.75 \n", "122 0.58 \n", "123 0.71 \n", "124 0.67 \n", "125 0.54 \n", "126 0.58 \n", "127 0.42 \n", "128 0.58 \n", "129 0.62 \n", "130 0.58 \n", "131 0.50 \n", "132 0.46 \n", "133 0.58 \n", "134 0.87 \n", "135 0.92 \n", "136 0.50 \n", "137 0.62 \n", "138 0.42 \n", "139 0.58 \n", "140 0.62 \n", "141 0.12 \n", "142 0.50 \n", "143 0.62 \n", "144 0.75 \n", "145 0.42 \n", "146 0.75 \n", "147 0.50 \n", "148 0.71 \n", "149 0.54 \n", "\n", " Długość płatka \\\n", "0 0.08 \n", "1 0.08 \n", "2 0.63 \n", "3 0.59 \n", "4 0.66 \n", "5 0.51 \n", "6 0.61 \n", "7 0.59 \n", "8 0.63 \n", "9 0.39 \n", "10 0.61 \n", "11 0.49 \n", "12 0.42 \n", "13 0.54 \n", "14 0.51 \n", "15 0.63 \n", "16 0.44 \n", "17 0.58 \n", "18 0.59 \n", "19 0.53 \n", "20 0.59 \n", "21 0.49 \n", "22 0.64 \n", "23 0.51 \n", "24 0.66 \n", "25 0.63 \n", "26 0.56 \n", "27 0.58 \n", "28 0.64 \n", "29 0.59 \n", "30 0.42 \n", "31 0.47 \n", "32 0.46 \n", "33 0.49 \n", "34 0.69 \n", "35 0.59 \n", "36 0.59 \n", "37 0.63 \n", "38 0.58 \n", "39 0.53 \n", "40 0.51 \n", "41 0.58 \n", "42 0.61 \n", "43 0.51 \n", "44 0.39 \n", "45 0.54 \n", "46 0.54 \n", "47 0.54 \n", "48 0.56 \n", "49 0.34 \n", "50 0.53 \n", "51 0.69 \n", "52 0.59 \n", "53 0.68 \n", "54 0.68 \n", "55 0.66 \n", "56 0.66 \n", "57 0.64 \n", "58 0.66 \n", "59 0.69 \n", "60 0.78 \n", "61 0.64 \n", "62 0.69 \n", "63 0.68 \n", "64 0.69 \n", "65 0.68 \n", "66 0.85 \n", "67 0.83 \n", "68 0.78 \n", "69 0.81 \n", "70 0.95 \n", "71 0.90 \n", "72 0.81 \n", "73 0.86 \n", "74 0.69 \n", "75 0.73 \n", "76 0.76 \n", "77 0.69 \n", "78 0.73 \n", "79 0.76 \n", "80 0.97 \n", "81 1.00 \n", "82 0.80 \n", "83 0.97 \n", "84 0.80 \n", "85 0.85 \n", "86 0.78 \n", "87 0.81 \n", "88 0.86 \n", "89 0.92 \n", "90 0.78 \n", "91 0.86 \n", "92 0.78 \n", "93 0.76 \n", "94 0.75 \n", "95 0.78 \n", "96 0.69 \n", "97 0.83 \n", "98 0.80 \n", "99 0.71 \n", "100 0.71 \n", "101 0.75 \n", "102 0.07 \n", "103 0.07 \n", "104 0.05 \n", "105 0.08 \n", "106 0.07 \n", "107 0.12 \n", "108 0.07 \n", "109 0.08 \n", "110 0.07 \n", "111 0.08 \n", "112 0.08 \n", "113 0.10 \n", "114 0.07 \n", "115 0.02 \n", "116 0.03 \n", "117 0.08 \n", "118 0.05 \n", "119 0.07 \n", "120 0.12 \n", "121 0.08 \n", "122 0.12 \n", "123 0.08 \n", "124 0.00 \n", "125 0.12 \n", "126 0.15 \n", "127 0.10 \n", "128 0.10 \n", "129 0.08 \n", "130 0.07 \n", "131 0.10 \n", "132 0.10 \n", "133 0.08 \n", "134 0.08 \n", "135 0.07 \n", "136 0.03 \n", "137 0.05 \n", "138 0.05 \n", "139 0.08 \n", "140 0.05 \n", "141 0.05 \n", "142 0.05 \n", "143 0.10 \n", "144 0.15 \n", "145 0.07 \n", "146 0.10 \n", "147 0.07 \n", "148 0.08 \n", "149 0.07 \n", "\n", " Szerokość płatka \\\n", "0 0.00 \n", "1 0.00 \n", "2 0.54 \n", "3 0.58 \n", "4 0.58 \n", "5 0.50 \n", "6 0.58 \n", "7 0.50 \n", "8 0.63 \n", "9 0.38 \n", "10 0.50 \n", "11 0.54 \n", "12 0.38 \n", "13 0.58 \n", "14 0.38 \n", "15 0.54 \n", "16 0.50 \n", "17 0.54 \n", "18 0.58 \n", "19 0.38 \n", "20 0.58 \n", "21 0.42 \n", "22 0.71 \n", "23 0.50 \n", "24 0.58 \n", "25 0.46 \n", "26 0.50 \n", "27 0.54 \n", "28 0.54 \n", "29 0.58 \n", "30 0.38 \n", "31 0.42 \n", "32 0.38 \n", "33 0.46 \n", "34 0.63 \n", "35 0.58 \n", "36 0.63 \n", "37 0.58 \n", "38 0.50 \n", "39 0.50 \n", "40 0.50 \n", "41 0.46 \n", "42 0.54 \n", "43 0.46 \n", "44 0.38 \n", "45 0.50 \n", "46 0.46 \n", "47 0.50 \n", "48 0.50 \n", "49 0.42 \n", "50 0.50 \n", "51 0.75 \n", "52 0.67 \n", "53 0.79 \n", "54 0.58 \n", "55 0.79 \n", "56 0.71 \n", "57 0.71 \n", "58 0.71 \n", "59 0.58 \n", "60 0.54 \n", "61 0.71 \n", "62 0.75 \n", "63 0.75 \n", "64 0.71 \n", "65 0.67 \n", "66 1.00 \n", "67 0.83 \n", "68 0.71 \n", "69 0.88 \n", "70 0.83 \n", "71 0.71 \n", "72 0.71 \n", "73 1.00 \n", "74 0.79 \n", "75 0.75 \n", "76 0.83 \n", "77 0.96 \n", "78 0.92 \n", "79 0.71 \n", "80 0.88 \n", "81 0.92 \n", "82 0.92 \n", "83 0.79 \n", "84 0.83 \n", "85 0.71 \n", "86 0.83 \n", "87 0.63 \n", "88 0.75 \n", "89 0.79 \n", "90 0.88 \n", "91 0.92 \n", "92 0.96 \n", "93 0.71 \n", "94 0.83 \n", "95 0.96 \n", "96 0.92 \n", "97 0.92 \n", "98 1.00 \n", "99 0.92 \n", "100 0.79 \n", "101 0.92 \n", "102 0.04 \n", "103 0.04 \n", "104 0.04 \n", "105 0.04 \n", "106 0.04 \n", "107 0.12 \n", "108 0.08 \n", "109 0.04 \n", "110 0.04 \n", "111 0.00 \n", "112 0.04 \n", "113 0.04 \n", "114 0.00 \n", "115 0.00 \n", "116 0.04 \n", "117 0.12 \n", "118 0.12 \n", "119 0.08 \n", "120 0.08 \n", "121 0.08 \n", "122 0.04 \n", "123 0.12 \n", "124 0.04 \n", "125 0.17 \n", "126 0.04 \n", "127 0.04 \n", "128 0.12 \n", "129 0.04 \n", "130 0.04 \n", "131 0.04 \n", "132 0.04 \n", "133 0.12 \n", "134 0.00 \n", "135 0.04 \n", "136 0.04 \n", "137 0.04 \n", "138 0.04 \n", "139 0.04 \n", "140 0.08 \n", "141 0.08 \n", "142 0.04 \n", "143 0.21 \n", "144 0.12 \n", "145 0.08 \n", "146 0.04 \n", "147 0.04 \n", "148 0.04 \n", "149 0.04 \n", "\n", " Wartość medoidu 0 \\\n", "0 (0.47, 0.38, 0.59, 0.58) \n", "1 (0.47, 0.38, 0.59, 0.58) \n", "2 (0.47, 0.38, 0.59, 0.58) \n", "3 (0.47, 0.38, 0.59, 0.58) \n", "4 (0.47, 0.38, 0.59, 0.58) \n", "5 (0.47, 0.38, 0.59, 0.58) \n", "6 (0.47, 0.38, 0.59, 0.58) \n", "7 (0.47, 0.38, 0.59, 0.58) \n", "8 (0.47, 0.38, 0.59, 0.58) \n", "9 (0.47, 0.38, 0.59, 0.58) \n", "10 (0.47, 0.38, 0.59, 0.58) \n", "11 (0.47, 0.38, 0.59, 0.58) \n", "12 (0.47, 0.38, 0.59, 0.58) \n", "13 (0.47, 0.38, 0.59, 0.58) \n", "14 (0.47, 0.38, 0.59, 0.58) \n", "15 (0.47, 0.38, 0.59, 0.58) \n", "16 (0.47, 0.38, 0.59, 0.58) \n", "17 (0.47, 0.38, 0.59, 0.58) \n", "18 (0.47, 0.38, 0.59, 0.58) \n", "19 (0.47, 0.38, 0.59, 0.58) \n", "20 (0.47, 0.38, 0.59, 0.58) \n", "21 (0.47, 0.38, 0.59, 0.58) \n", "22 (0.47, 0.38, 0.59, 0.58) \n", "23 (0.47, 0.38, 0.59, 0.58) \n", "24 (0.47, 0.38, 0.59, 0.58) \n", "25 (0.47, 0.38, 0.59, 0.58) \n", "26 (0.47, 0.38, 0.59, 0.58) \n", "27 (0.47, 0.38, 0.59, 0.58) \n", "28 (0.47, 0.38, 0.59, 0.58) \n", "29 (0.47, 0.38, 0.59, 0.58) \n", "30 (0.47, 0.38, 0.59, 0.58) \n", "31 (0.47, 0.38, 0.59, 0.58) \n", "32 (0.47, 0.38, 0.59, 0.58) \n", "33 (0.47, 0.38, 0.59, 0.58) \n", "34 (0.47, 0.38, 0.59, 0.58) \n", "35 (0.47, 0.38, 0.59, 0.58) \n", "36 (0.47, 0.38, 0.59, 0.58) \n", "37 (0.47, 0.38, 0.59, 0.58) \n", "38 (0.47, 0.38, 0.59, 0.58) \n", "39 (0.47, 0.38, 0.59, 0.58) \n", "40 (0.47, 0.38, 0.59, 0.58) \n", "41 (0.47, 0.38, 0.59, 0.58) \n", "42 (0.47, 0.38, 0.59, 0.58) \n", "43 (0.47, 0.38, 0.59, 0.58) \n", "44 (0.47, 0.38, 0.59, 0.58) \n", "45 (0.47, 0.38, 0.59, 0.58) \n", "46 (0.47, 0.38, 0.59, 0.58) \n", "47 (0.47, 0.38, 0.59, 0.58) \n", "48 (0.47, 0.38, 0.59, 0.58) \n", "49 (0.47, 0.38, 0.59, 0.58) \n", "50 (0.47, 0.38, 0.59, 0.58) \n", "51 (0.47, 0.38, 0.59, 0.58) \n", "52 (0.47, 0.38, 0.59, 0.58) \n", "53 (0.47, 0.38, 0.59, 0.58) \n", "54 (0.47, 0.38, 0.59, 0.58) \n", "55 (0.47, 0.38, 0.59, 0.58) \n", "56 (0.47, 0.38, 0.59, 0.58) \n", "57 (0.47, 0.38, 0.59, 0.58) \n", "58 (0.47, 0.38, 0.59, 0.58) \n", "59 (0.47, 0.38, 0.59, 0.58) \n", "60 (0.47, 0.38, 0.59, 0.58) \n", "61 (0.47, 0.38, 0.59, 0.58) \n", "62 (0.47, 0.38, 0.59, 0.58) \n", "63 (0.47, 0.38, 0.59, 0.58) \n", "64 (0.47, 0.38, 0.59, 0.58) \n", "65 (0.47, 0.38, 0.59, 0.58) \n", "66 (0.47, 0.38, 0.59, 0.58) \n", "67 (0.47, 0.38, 0.59, 0.58) \n", "68 (0.47, 0.38, 0.59, 0.58) \n", "69 (0.47, 0.38, 0.59, 0.58) \n", "70 (0.47, 0.38, 0.59, 0.58) \n", "71 (0.47, 0.38, 0.59, 0.58) \n", "72 (0.47, 0.38, 0.59, 0.58) \n", "73 (0.47, 0.38, 0.59, 0.58) \n", "74 (0.47, 0.38, 0.59, 0.58) \n", "75 (0.47, 0.38, 0.59, 0.58) \n", "76 (0.47, 0.38, 0.59, 0.58) \n", "77 (0.47, 0.38, 0.59, 0.58) \n", "78 (0.47, 0.38, 0.59, 0.58) \n", "79 (0.47, 0.38, 0.59, 0.58) \n", "80 (0.47, 0.38, 0.59, 0.58) \n", "81 (0.47, 0.38, 0.59, 0.58) \n", "82 (0.47, 0.38, 0.59, 0.58) \n", "83 (0.47, 0.38, 0.59, 0.58) \n", "84 (0.47, 0.38, 0.59, 0.58) \n", "85 (0.47, 0.38, 0.59, 0.58) \n", "86 (0.47, 0.38, 0.59, 0.58) \n", "87 (0.47, 0.38, 0.59, 0.58) \n", "88 (0.47, 0.38, 0.59, 0.58) \n", "89 (0.47, 0.38, 0.59, 0.58) \n", "90 (0.47, 0.38, 0.59, 0.58) \n", "91 (0.47, 0.38, 0.59, 0.58) \n", "92 (0.47, 0.38, 0.59, 0.58) \n", "93 (0.47, 0.38, 0.59, 0.58) \n", "94 (0.47, 0.38, 0.59, 0.58) \n", "95 (0.47, 0.38, 0.59, 0.58) \n", "96 (0.47, 0.38, 0.59, 0.58) \n", "97 (0.47, 0.38, 0.59, 0.58) \n", "98 (0.47, 0.38, 0.59, 0.58) \n", "99 (0.47, 0.38, 0.59, 0.58) \n", "100 (0.47, 0.38, 0.59, 0.58) \n", "101 (0.47, 0.38, 0.59, 0.58) \n", "102 (0.47, 0.38, 0.59, 0.58) \n", "103 (0.47, 0.38, 0.59, 0.58) \n", "104 (0.47, 0.38, 0.59, 0.58) \n", "105 (0.47, 0.38, 0.59, 0.58) \n", "106 (0.47, 0.38, 0.59, 0.58) \n", "107 (0.47, 0.38, 0.59, 0.58) \n", "108 (0.47, 0.38, 0.59, 0.58) \n", "109 (0.47, 0.38, 0.59, 0.58) \n", "110 (0.47, 0.38, 0.59, 0.58) \n", "111 (0.47, 0.38, 0.59, 0.58) \n", "112 (0.47, 0.38, 0.59, 0.58) \n", "113 (0.47, 0.38, 0.59, 0.58) \n", "114 (0.47, 0.38, 0.59, 0.58) \n", "115 (0.47, 0.38, 0.59, 0.58) \n", "116 (0.47, 0.38, 0.59, 0.58) \n", "117 (0.47, 0.38, 0.59, 0.58) \n", "118 (0.47, 0.38, 0.59, 0.58) \n", "119 (0.47, 0.38, 0.59, 0.58) \n", "120 (0.47, 0.38, 0.59, 0.58) \n", "121 (0.47, 0.38, 0.59, 0.58) \n", "122 (0.47, 0.38, 0.59, 0.58) \n", "123 (0.47, 0.38, 0.59, 0.58) \n", "124 (0.47, 0.38, 0.59, 0.58) \n", "125 (0.47, 0.38, 0.59, 0.58) \n", "126 (0.47, 0.38, 0.59, 0.58) \n", "127 (0.47, 0.38, 0.59, 0.58) \n", "128 (0.47, 0.38, 0.59, 0.58) \n", "129 (0.47, 0.38, 0.59, 0.58) \n", "130 (0.47, 0.38, 0.59, 0.58) \n", "131 (0.47, 0.38, 0.59, 0.58) \n", "132 (0.47, 0.38, 0.59, 0.58) \n", "133 (0.47, 0.38, 0.59, 0.58) \n", "134 (0.47, 0.38, 0.59, 0.58) \n", "135 (0.47, 0.38, 0.59, 0.58) \n", "136 (0.47, 0.38, 0.59, 0.58) \n", "137 (0.47, 0.38, 0.59, 0.58) \n", "138 (0.47, 0.38, 0.59, 0.58) \n", "139 (0.47, 0.38, 0.59, 0.58) \n", "140 (0.47, 0.38, 0.59, 0.58) \n", "141 (0.47, 0.38, 0.59, 0.58) \n", "142 (0.47, 0.38, 0.59, 0.58) \n", "143 (0.47, 0.38, 0.59, 0.58) \n", "144 (0.47, 0.38, 0.59, 0.58) \n", "145 (0.47, 0.38, 0.59, 0.58) \n", "146 (0.47, 0.38, 0.59, 0.58) \n", "147 (0.47, 0.38, 0.59, 0.58) \n", "148 (0.47, 0.38, 0.59, 0.58) \n", "149 (0.47, 0.38, 0.59, 0.58) \n", "\n", " Wartość medoidu 1 \\\n", "0 (0.69, 0.42, 0.76, 0.83) \n", "1 (0.69, 0.42, 0.76, 0.83) \n", "2 (0.69, 0.42, 0.76, 0.83) \n", "3 (0.69, 0.42, 0.76, 0.83) \n", "4 (0.69, 0.42, 0.76, 0.83) \n", "5 (0.69, 0.42, 0.76, 0.83) \n", "6 (0.69, 0.42, 0.76, 0.83) \n", "7 (0.69, 0.42, 0.76, 0.83) \n", "8 (0.69, 0.42, 0.76, 0.83) \n", "9 (0.69, 0.42, 0.76, 0.83) \n", "10 (0.69, 0.42, 0.76, 0.83) \n", "11 (0.69, 0.42, 0.76, 0.83) \n", "12 (0.69, 0.42, 0.76, 0.83) \n", "13 (0.69, 0.42, 0.76, 0.83) \n", "14 (0.69, 0.42, 0.76, 0.83) \n", "15 (0.69, 0.42, 0.76, 0.83) \n", "16 (0.69, 0.42, 0.76, 0.83) \n", "17 (0.69, 0.42, 0.76, 0.83) \n", "18 (0.69, 0.42, 0.76, 0.83) \n", "19 (0.69, 0.42, 0.76, 0.83) \n", "20 (0.69, 0.42, 0.76, 0.83) \n", "21 (0.69, 0.42, 0.76, 0.83) \n", "22 (0.69, 0.42, 0.76, 0.83) \n", "23 (0.69, 0.42, 0.76, 0.83) \n", "24 (0.69, 0.42, 0.76, 0.83) \n", "25 (0.69, 0.42, 0.76, 0.83) \n", "26 (0.69, 0.42, 0.76, 0.83) \n", "27 (0.69, 0.42, 0.76, 0.83) \n", "28 (0.69, 0.42, 0.76, 0.83) \n", "29 (0.69, 0.42, 0.76, 0.83) \n", "30 (0.69, 0.42, 0.76, 0.83) \n", "31 (0.69, 0.42, 0.76, 0.83) \n", "32 (0.69, 0.42, 0.76, 0.83) \n", "33 (0.69, 0.42, 0.76, 0.83) \n", "34 (0.69, 0.42, 0.76, 0.83) \n", "35 (0.69, 0.42, 0.76, 0.83) \n", "36 (0.69, 0.42, 0.76, 0.83) \n", "37 (0.69, 0.42, 0.76, 0.83) \n", "38 (0.69, 0.42, 0.76, 0.83) \n", "39 (0.69, 0.42, 0.76, 0.83) \n", "40 (0.69, 0.42, 0.76, 0.83) \n", "41 (0.69, 0.42, 0.76, 0.83) \n", "42 (0.69, 0.42, 0.76, 0.83) \n", "43 (0.69, 0.42, 0.76, 0.83) \n", "44 (0.69, 0.42, 0.76, 0.83) \n", "45 (0.69, 0.42, 0.76, 0.83) \n", "46 (0.69, 0.42, 0.76, 0.83) \n", "47 (0.69, 0.42, 0.76, 0.83) \n", "48 (0.69, 0.42, 0.76, 0.83) \n", "49 (0.69, 0.42, 0.76, 0.83) \n", "50 (0.69, 0.42, 0.76, 0.83) \n", "51 (0.69, 0.42, 0.76, 0.83) \n", "52 (0.69, 0.42, 0.76, 0.83) \n", "53 (0.69, 0.42, 0.76, 0.83) \n", "54 (0.69, 0.42, 0.76, 0.83) \n", "55 (0.69, 0.42, 0.76, 0.83) \n", "56 (0.69, 0.42, 0.76, 0.83) \n", "57 (0.69, 0.42, 0.76, 0.83) \n", "58 (0.69, 0.42, 0.76, 0.83) \n", "59 (0.69, 0.42, 0.76, 0.83) \n", "60 (0.69, 0.42, 0.76, 0.83) \n", "61 (0.69, 0.42, 0.76, 0.83) \n", "62 (0.69, 0.42, 0.76, 0.83) \n", "63 (0.69, 0.42, 0.76, 0.83) \n", "64 (0.69, 0.42, 0.76, 0.83) \n", "65 (0.69, 0.42, 0.76, 0.83) \n", "66 (0.69, 0.42, 0.76, 0.83) \n", "67 (0.69, 0.42, 0.76, 0.83) \n", "68 (0.69, 0.42, 0.76, 0.83) \n", "69 (0.69, 0.42, 0.76, 0.83) \n", "70 (0.69, 0.42, 0.76, 0.83) \n", "71 (0.69, 0.42, 0.76, 0.83) \n", "72 (0.69, 0.42, 0.76, 0.83) \n", "73 (0.69, 0.42, 0.76, 0.83) \n", "74 (0.69, 0.42, 0.76, 0.83) \n", "75 (0.69, 0.42, 0.76, 0.83) \n", "76 (0.69, 0.42, 0.76, 0.83) \n", "77 (0.69, 0.42, 0.76, 0.83) \n", "78 (0.69, 0.42, 0.76, 0.83) \n", "79 (0.69, 0.42, 0.76, 0.83) \n", "80 (0.69, 0.42, 0.76, 0.83) \n", "81 (0.69, 0.42, 0.76, 0.83) \n", "82 (0.69, 0.42, 0.76, 0.83) \n", "83 (0.69, 0.42, 0.76, 0.83) \n", "84 (0.69, 0.42, 0.76, 0.83) \n", "85 (0.69, 0.42, 0.76, 0.83) \n", "86 (0.69, 0.42, 0.76, 0.83) \n", "87 (0.69, 0.42, 0.76, 0.83) \n", "88 (0.69, 0.42, 0.76, 0.83) \n", "89 (0.69, 0.42, 0.76, 0.83) \n", "90 (0.69, 0.42, 0.76, 0.83) \n", "91 (0.69, 0.42, 0.76, 0.83) \n", "92 (0.69, 0.42, 0.76, 0.83) \n", "93 (0.69, 0.42, 0.76, 0.83) \n", "94 (0.69, 0.42, 0.76, 0.83) \n", "95 (0.69, 0.42, 0.76, 0.83) \n", "96 (0.69, 0.42, 0.76, 0.83) \n", "97 (0.69, 0.42, 0.76, 0.83) \n", "98 (0.69, 0.42, 0.76, 0.83) \n", "99 (0.69, 0.42, 0.76, 0.83) \n", "100 (0.69, 0.42, 0.76, 0.83) \n", "101 (0.69, 0.42, 0.76, 0.83) \n", "102 (0.69, 0.42, 0.76, 0.83) \n", "103 (0.69, 0.42, 0.76, 0.83) \n", "104 (0.69, 0.42, 0.76, 0.83) \n", "105 (0.69, 0.42, 0.76, 0.83) \n", "106 (0.69, 0.42, 0.76, 0.83) \n", "107 (0.69, 0.42, 0.76, 0.83) \n", "108 (0.69, 0.42, 0.76, 0.83) \n", "109 (0.69, 0.42, 0.76, 0.83) \n", "110 (0.69, 0.42, 0.76, 0.83) \n", "111 (0.69, 0.42, 0.76, 0.83) \n", "112 (0.69, 0.42, 0.76, 0.83) \n", "113 (0.69, 0.42, 0.76, 0.83) \n", "114 (0.69, 0.42, 0.76, 0.83) \n", "115 (0.69, 0.42, 0.76, 0.83) \n", "116 (0.69, 0.42, 0.76, 0.83) \n", "117 (0.69, 0.42, 0.76, 0.83) \n", "118 (0.69, 0.42, 0.76, 0.83) \n", "119 (0.69, 0.42, 0.76, 0.83) \n", "120 (0.69, 0.42, 0.76, 0.83) \n", "121 (0.69, 0.42, 0.76, 0.83) \n", "122 (0.69, 0.42, 0.76, 0.83) \n", "123 (0.69, 0.42, 0.76, 0.83) \n", "124 (0.69, 0.42, 0.76, 0.83) \n", "125 (0.69, 0.42, 0.76, 0.83) \n", "126 (0.69, 0.42, 0.76, 0.83) \n", "127 (0.69, 0.42, 0.76, 0.83) \n", "128 (0.69, 0.42, 0.76, 0.83) \n", "129 (0.69, 0.42, 0.76, 0.83) \n", "130 (0.69, 0.42, 0.76, 0.83) \n", "131 (0.69, 0.42, 0.76, 0.83) \n", "132 (0.69, 0.42, 0.76, 0.83) \n", "133 (0.69, 0.42, 0.76, 0.83) \n", "134 (0.69, 0.42, 0.76, 0.83) \n", "135 (0.69, 0.42, 0.76, 0.83) \n", "136 (0.69, 0.42, 0.76, 0.83) \n", "137 (0.69, 0.42, 0.76, 0.83) \n", "138 (0.69, 0.42, 0.76, 0.83) \n", "139 (0.69, 0.42, 0.76, 0.83) \n", "140 (0.69, 0.42, 0.76, 0.83) \n", "141 (0.69, 0.42, 0.76, 0.83) \n", "142 (0.69, 0.42, 0.76, 0.83) \n", "143 (0.69, 0.42, 0.76, 0.83) \n", "144 (0.69, 0.42, 0.76, 0.83) \n", "145 (0.69, 0.42, 0.76, 0.83) \n", "146 (0.69, 0.42, 0.76, 0.83) \n", "147 (0.69, 0.42, 0.76, 0.83) \n", "148 (0.69, 0.42, 0.76, 0.83) \n", "149 (0.69, 0.42, 0.76, 0.83) \n", "\n", " Wartość medoidu 2 \\\n", "0 (0.19, 0.58, 0.08, 0.04) \n", "1 (0.19, 0.58, 0.08, 0.04) \n", "2 (0.19, 0.58, 0.08, 0.04) \n", "3 (0.19, 0.58, 0.08, 0.04) \n", "4 (0.19, 0.58, 0.08, 0.04) \n", "5 (0.19, 0.58, 0.08, 0.04) \n", "6 (0.19, 0.58, 0.08, 0.04) \n", "7 (0.19, 0.58, 0.08, 0.04) \n", "8 (0.19, 0.58, 0.08, 0.04) \n", "9 (0.19, 0.58, 0.08, 0.04) \n", "10 (0.19, 0.58, 0.08, 0.04) \n", "11 (0.19, 0.58, 0.08, 0.04) \n", "12 (0.19, 0.58, 0.08, 0.04) \n", "13 (0.19, 0.58, 0.08, 0.04) \n", "14 (0.19, 0.58, 0.08, 0.04) \n", "15 (0.19, 0.58, 0.08, 0.04) \n", "16 (0.19, 0.58, 0.08, 0.04) \n", "17 (0.19, 0.58, 0.08, 0.04) \n", "18 (0.19, 0.58, 0.08, 0.04) \n", "19 (0.19, 0.58, 0.08, 0.04) \n", "20 (0.19, 0.58, 0.08, 0.04) \n", "21 (0.19, 0.58, 0.08, 0.04) \n", "22 (0.19, 0.58, 0.08, 0.04) \n", "23 (0.19, 0.58, 0.08, 0.04) \n", "24 (0.19, 0.58, 0.08, 0.04) \n", "25 (0.19, 0.58, 0.08, 0.04) \n", "26 (0.19, 0.58, 0.08, 0.04) \n", "27 (0.19, 0.58, 0.08, 0.04) \n", "28 (0.19, 0.58, 0.08, 0.04) \n", "29 (0.19, 0.58, 0.08, 0.04) \n", "30 (0.19, 0.58, 0.08, 0.04) \n", "31 (0.19, 0.58, 0.08, 0.04) \n", "32 (0.19, 0.58, 0.08, 0.04) \n", "33 (0.19, 0.58, 0.08, 0.04) \n", "34 (0.19, 0.58, 0.08, 0.04) \n", "35 (0.19, 0.58, 0.08, 0.04) \n", "36 (0.19, 0.58, 0.08, 0.04) \n", "37 (0.19, 0.58, 0.08, 0.04) \n", "38 (0.19, 0.58, 0.08, 0.04) \n", "39 (0.19, 0.58, 0.08, 0.04) \n", "40 (0.19, 0.58, 0.08, 0.04) \n", "41 (0.19, 0.58, 0.08, 0.04) \n", "42 (0.19, 0.58, 0.08, 0.04) \n", "43 (0.19, 0.58, 0.08, 0.04) \n", "44 (0.19, 0.58, 0.08, 0.04) \n", "45 (0.19, 0.58, 0.08, 0.04) \n", "46 (0.19, 0.58, 0.08, 0.04) \n", "47 (0.19, 0.58, 0.08, 0.04) \n", "48 (0.19, 0.58, 0.08, 0.04) \n", "49 (0.19, 0.58, 0.08, 0.04) \n", "50 (0.19, 0.58, 0.08, 0.04) \n", "51 (0.19, 0.58, 0.08, 0.04) \n", "52 (0.19, 0.58, 0.08, 0.04) \n", "53 (0.19, 0.58, 0.08, 0.04) \n", "54 (0.19, 0.58, 0.08, 0.04) \n", "55 (0.19, 0.58, 0.08, 0.04) \n", "56 (0.19, 0.58, 0.08, 0.04) \n", "57 (0.19, 0.58, 0.08, 0.04) \n", "58 (0.19, 0.58, 0.08, 0.04) \n", "59 (0.19, 0.58, 0.08, 0.04) \n", "60 (0.19, 0.58, 0.08, 0.04) \n", "61 (0.19, 0.58, 0.08, 0.04) \n", "62 (0.19, 0.58, 0.08, 0.04) \n", "63 (0.19, 0.58, 0.08, 0.04) \n", "64 (0.19, 0.58, 0.08, 0.04) \n", "65 (0.19, 0.58, 0.08, 0.04) \n", "66 (0.19, 0.58, 0.08, 0.04) \n", "67 (0.19, 0.58, 0.08, 0.04) \n", "68 (0.19, 0.58, 0.08, 0.04) \n", "69 (0.19, 0.58, 0.08, 0.04) \n", "70 (0.19, 0.58, 0.08, 0.04) \n", "71 (0.19, 0.58, 0.08, 0.04) \n", "72 (0.19, 0.58, 0.08, 0.04) \n", "73 (0.19, 0.58, 0.08, 0.04) \n", "74 (0.19, 0.58, 0.08, 0.04) \n", "75 (0.19, 0.58, 0.08, 0.04) \n", "76 (0.19, 0.58, 0.08, 0.04) \n", "77 (0.19, 0.58, 0.08, 0.04) \n", "78 (0.19, 0.58, 0.08, 0.04) \n", "79 (0.19, 0.58, 0.08, 0.04) \n", "80 (0.19, 0.58, 0.08, 0.04) \n", "81 (0.19, 0.58, 0.08, 0.04) \n", "82 (0.19, 0.58, 0.08, 0.04) \n", "83 (0.19, 0.58, 0.08, 0.04) \n", "84 (0.19, 0.58, 0.08, 0.04) \n", "85 (0.19, 0.58, 0.08, 0.04) \n", "86 (0.19, 0.58, 0.08, 0.04) \n", "87 (0.19, 0.58, 0.08, 0.04) \n", "88 (0.19, 0.58, 0.08, 0.04) \n", "89 (0.19, 0.58, 0.08, 0.04) \n", "90 (0.19, 0.58, 0.08, 0.04) \n", "91 (0.19, 0.58, 0.08, 0.04) \n", "92 (0.19, 0.58, 0.08, 0.04) \n", "93 (0.19, 0.58, 0.08, 0.04) \n", "94 (0.19, 0.58, 0.08, 0.04) \n", "95 (0.19, 0.58, 0.08, 0.04) \n", "96 (0.19, 0.58, 0.08, 0.04) \n", "97 (0.19, 0.58, 0.08, 0.04) \n", "98 (0.19, 0.58, 0.08, 0.04) \n", "99 (0.19, 0.58, 0.08, 0.04) \n", "100 (0.19, 0.58, 0.08, 0.04) \n", "101 (0.19, 0.58, 0.08, 0.04) \n", "102 (0.19, 0.58, 0.08, 0.04) \n", "103 (0.19, 0.58, 0.08, 0.04) \n", "104 (0.19, 0.58, 0.08, 0.04) \n", "105 (0.19, 0.58, 0.08, 0.04) \n", "106 (0.19, 0.58, 0.08, 0.04) \n", "107 (0.19, 0.58, 0.08, 0.04) \n", "108 (0.19, 0.58, 0.08, 0.04) \n", "109 (0.19, 0.58, 0.08, 0.04) \n", "110 (0.19, 0.58, 0.08, 0.04) \n", "111 (0.19, 0.58, 0.08, 0.04) \n", "112 (0.19, 0.58, 0.08, 0.04) \n", "113 (0.19, 0.58, 0.08, 0.04) \n", "114 (0.19, 0.58, 0.08, 0.04) \n", "115 (0.19, 0.58, 0.08, 0.04) \n", "116 (0.19, 0.58, 0.08, 0.04) \n", "117 (0.19, 0.58, 0.08, 0.04) \n", "118 (0.19, 0.58, 0.08, 0.04) \n", "119 (0.19, 0.58, 0.08, 0.04) \n", "120 (0.19, 0.58, 0.08, 0.04) \n", "121 (0.19, 0.58, 0.08, 0.04) \n", "122 (0.19, 0.58, 0.08, 0.04) \n", "123 (0.19, 0.58, 0.08, 0.04) \n", "124 (0.19, 0.58, 0.08, 0.04) \n", "125 (0.19, 0.58, 0.08, 0.04) \n", "126 (0.19, 0.58, 0.08, 0.04) \n", "127 (0.19, 0.58, 0.08, 0.04) \n", "128 (0.19, 0.58, 0.08, 0.04) \n", "129 (0.19, 0.58, 0.08, 0.04) \n", "130 (0.19, 0.58, 0.08, 0.04) \n", "131 (0.19, 0.58, 0.08, 0.04) \n", "132 (0.19, 0.58, 0.08, 0.04) \n", "133 (0.19, 0.58, 0.08, 0.04) \n", "134 (0.19, 0.58, 0.08, 0.04) \n", "135 (0.19, 0.58, 0.08, 0.04) \n", "136 (0.19, 0.58, 0.08, 0.04) \n", "137 (0.19, 0.58, 0.08, 0.04) \n", "138 (0.19, 0.58, 0.08, 0.04) \n", "139 (0.19, 0.58, 0.08, 0.04) \n", "140 (0.19, 0.58, 0.08, 0.04) \n", "141 (0.19, 0.58, 0.08, 0.04) \n", "142 (0.19, 0.58, 0.08, 0.04) \n", "143 (0.19, 0.58, 0.08, 0.04) \n", "144 (0.19, 0.58, 0.08, 0.04) \n", "145 (0.19, 0.58, 0.08, 0.04) \n", "146 (0.19, 0.58, 0.08, 0.04) \n", "147 (0.19, 0.58, 0.08, 0.04) \n", "148 (0.19, 0.58, 0.08, 0.04) \n", "149 (0.19, 0.58, 0.08, 0.04) \n", "\n", " Medoid \n", "0 2 \n", "1 2 \n", "2 2 \n", "3 2 \n", "4 2 \n", "5 2 \n", "6 2 \n", "7 2 \n", "8 2 \n", "9 2 \n", "10 2 \n", "11 2 \n", "12 2 \n", "13 2 \n", "14 2 \n", "15 2 \n", "16 2 \n", "17 2 \n", "18 2 \n", "19 2 \n", "20 2 \n", "21 2 \n", "22 2 \n", "23 2 \n", "24 2 \n", "25 2 \n", "26 2 \n", "27 2 \n", "28 2 \n", "29 2 \n", "30 2 \n", "31 2 \n", "32 2 \n", "33 2 \n", "34 0 \n", "35 2 \n", "36 2 \n", "37 0 \n", "38 2 \n", "39 2 \n", "40 2 \n", "41 2 \n", "42 2 \n", "43 2 \n", "44 2 \n", "45 2 \n", "46 2 \n", "47 2 \n", "48 2 \n", "49 2 \n", "50 0 \n", "51 0 \n", "52 0 \n", "53 0 \n", "54 0 \n", "55 0 \n", "56 0 \n", "57 0 \n", "58 0 \n", "59 0 \n", "60 0 \n", "61 0 \n", "62 0 \n", "63 0 \n", "64 0 \n", "65 0 \n", "66 0 \n", "67 0 \n", "68 0 \n", "69 0 \n", "70 0 \n", "71 0 \n", "72 0 \n", "73 0 \n", "74 0 \n", "75 0 \n", "76 0 \n", "77 1 \n", "78 0 \n", "79 0 \n", "80 0 \n", "81 0 \n", "82 0 \n", "83 0 \n", "84 0 \n", "85 0 \n", "86 0 \n", "87 0 \n", "88 0 \n", "89 0 \n", "90 0 \n", "91 0 \n", "92 0 \n", "93 0 \n", "94 0 \n", "95 0 \n", "96 0 \n", "97 0 \n", "98 0 \n", "99 0 \n", "100 1 \n", "101 0 \n", "102 1 \n", "103 1 \n", "104 1 \n", "105 1 \n", "106 0 \n", "107 1 \n", "108 1 \n", "109 1 \n", "110 1 \n", "111 1 \n", "112 1 \n", "113 0 \n", "114 1 \n", "115 1 \n", "116 1 \n", "117 1 \n", "118 1 \n", "119 0 \n", "120 1 \n", "121 0 \n", "122 1 \n", "123 0 \n", "124 1 \n", "125 1 \n", "126 0 \n", "127 0 \n", "128 1 \n", "129 1 \n", "130 1 \n", "131 1 \n", "132 1 \n", "133 0 \n", "134 0 \n", "135 1 \n", "136 1 \n", "137 1 \n", "138 0 \n", "139 1 \n", "140 1 \n", "141 1 \n", "142 0 \n", "143 1 \n", "144 1 \n", "145 1 \n", "146 0 \n", "147 1 \n", "148 1 \n", "149 0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# iris\n", "model4 = TrainModel_medoids(dataset, 3)\n", "medoids4, res_cluster4, cluster_labels4, silhouette4 = model4.return_values()\n", "\n", "res = res_cluster4[0] + res_cluster4[1] + res_cluster4[2]\n", "\n", "data = {'Długość kielicha': [round(res[i][0],2) for i in range(0, len(res))],\n", " 'Szerokość kielicha': [round(res[i][1],2) for i in range(0, len(res))],\n", " 'Długość płatka': [round(res[i][2],2) for i in range(0, len(res))],\n", " 'Szerokość płatka': [round(res[i][3],2) for i in range(0, len(res))],\n", " 'Wartość medoidu 0': [(round(medoids4[0][0],2),round(medoids4[0][1],2), round(medoids4[0][2],2), round(medoids4[0][3],2)) for i in range(150)],\n", " 'Wartość medoidu 1': [(round(medoids4[1][0],2), round(medoids4[1][1],2), round(medoids4[1][2],2), round(medoids4[1][3],2)) for i in range(150)],\n", " 'Wartość medoidu 2': [(round(medoids4[2][0],2), round(medoids4[2][1],2), round(medoids4[2][2],2), round(medoids4[2][3],2)) for i in range(150)],\n", " 'Medoid': cluster_labels4}\n", "df = pd.DataFrame(data)\n", "df.to_csv('iris_data.csv')\n", "\n", "pd.set_option('display.max_rows', None)\n", "pd.set_option('display.max_columns', None)\n", "pd.set_option('display.width', 10)\n", "pd.set_option('display.colheader_justify', 'center')\n", "pd.set_option('display.precision', 5)\n", "display(df)" ] }, { "cell_type": "markdown", "id": "655da39a", "metadata": {}, "source": [ "#### Uruchomienie algorytmu k-medoid dla zbioru danych glass" ] }, { "cell_type": "code", "execution_count": 36, "id": "bb83f704", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sylwetka (ang.silhouette) dla metody k-medoid i dla k = 4 0.35\n" ] } ], "source": [ "# glass\n", "model5 = TrainModel_medoids(dataset2, 4)\n", "medoids5, res_cluster5, cluster_labels5, silhouette5 = model5.return_values()" ] }, { "cell_type": "markdown", "id": "17f279ec", "metadata": {}, "source": [ "#### Uruchomienie algorytmu k-medoid dla zbioru danych wine" ] }, { "cell_type": "code", "execution_count": 74, "id": "6ffe3810", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sylwetka (ang.silhouette) dla metody k-medoid i dla k = 3 0.28\n" ] } ], "source": [ "# wine\n", "model6 = TrainModel_medoids(dataset3, 3)\n", "medoids6, res_cluster6, cluster_labels6, silhouette6 = model6.return_values()" ] }, { "cell_type": "markdown", "id": "3db40fc5", "metadata": {}, "source": [ "### Algorytm k-medoid + PCA" ] }, { "cell_type": "code", "execution_count": 39, "id": "662d4cf5", "metadata": {}, "outputs": [], "source": [ "pca = PCA(n_components=2)" ] }, { "cell_type": "markdown", "id": "ab279486", "metadata": {}, "source": [ "#### Redukcja wymiaru z 4 do 2 przy pomocy PCA na zbiorze danych iris" ] }, { "cell_type": "code", "execution_count": 40, "id": "21f2332b", "metadata": {}, "outputs": [], "source": [ "pca.fit(dataset)\n", "dataset_pca = pca.transform(dataset)" ] }, { "cell_type": "code", "execution_count": 47, "id": "71128af5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sylwetka (ang.silhouette) dla metody k-medoid i dla k = 3 0.5\n" ] } ], "source": [ "# iris\n", "model7 = TrainModel_medoids(dataset_pca, 3)\n", "medoids7, res_cluster7, cluster_labels7, silhouette7 = model7.return_values()" ] }, { "cell_type": "markdown", "id": "7a82f399", "metadata": {}, "source": [ "#### Redukcja wymiaru z 9 do 2 przy pomocy PCA na zbiorze danych glass" ] }, { "cell_type": "code", "execution_count": 42, "id": "5c305f99", "metadata": {}, "outputs": [], "source": [ "pca.fit(dataset2)\n", "dataset2_pca = pca.transform(dataset2)" ] }, { "cell_type": "code", "execution_count": 43, "id": "e4621daf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sylwetka (ang.silhouette) dla metody k-medoid i dla k = 4 0.5\n" ] } ], "source": [ "# glass\n", "model8 = TrainModel_medoids(dataset2_pca, 4)\n", "medoids8, res_cluster8, cluster_labels8, silhouette8 = model8.return_values()" ] }, { "cell_type": "markdown", "id": "14a5a5dd", "metadata": {}, "source": [ "#### Redukcja wymiaru z 13 do 2 przy pomocy PCA na zbiorze danych wine" ] }, { "cell_type": "code", "execution_count": 48, "id": "b63e355c", "metadata": {}, "outputs": [], "source": [ "pca.fit(dataset3)\n", "dataset3_pca = pca.transform(dataset3)" ] }, { "cell_type": "code", "execution_count": 49, "id": "bf13c5e4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sylwetka (ang.silhouette) dla metody k-medoid i dla k = 3 0.45\n" ] } ], "source": [ "# wine\n", "model9 = TrainModel_medoids(dataset3_pca, 3)\n", "medoids9, res_cluster9, cluster_labels9, silhouette9 = model9.return_values()" ] }, { "cell_type": "markdown", "id": "ba1dd5c6", "metadata": {}, "source": [ "### Porównanie metody k-średnich, k-medoid, k-medoid + PCA" ] }, { "cell_type": "markdown", "id": "80537977", "metadata": {}, "source": [ " W celu porównania przedstawionych powyżej trzech metod został stworzony wykres. Na wykresie zostały porównane wartości sylwetek trzech metod na trzech zbiorach danych (iris, glass, wine): " ] }, { "cell_type": "code", "execution_count": 125, "id": "c5909200", "metadata": {}, "outputs": [], "source": [ "result_data = {'Iris': [silhouette, silhouette4, silhouette7],\n", " 'Glass': [silhouette2, silhouette5, silhouette8],\n", " 'Wine': [silhouette3, silhouette6, silhouette9]}\n", "df_shoulette = pd.DataFrame(result_data)\n", "df_shoulette.index = ['k-średnich', 'k-medoid', 'k-medoid + PCA']" ] }, { "cell_type": "code", "execution_count": 126, "id": "a8983527", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtcAAAHmCAYAAAC4QKLIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAyIklEQVR4nO3de7hVdbn3//ctChIithV3JJpYmuEhD+ApE8o0sx7JjdtjHrB9GW2pXT4d9Om3c9m2jWlS8mQP0QEi8bA9RGa4zcxDIimSeA41gkQtEVOWbgXR+/fHnCyXi8ViTfiuNZmL9+u61rXmGN/vHOOecM36MLzHd0RmIkmSJGn9bVLvAiRJkqSewnAtSZIkFWK4liRJkgoxXEuSJEmFGK4lSZKkQgzXkiRJUiGb1ruAUrbZZpvccccd612GJEmSeri5c+c+l5kD2xvrMeF6xx135N577613GZIkSerhImLRmsZsC5EkSZIKMVxLkiRJhRiuJUmSpEJ6TM+1JElSvb322mssXryYV199td6lqIDNN9+cwYMHs9lmm3X6PYZrSZKkQhYvXkz//v3ZcccdiYh6l6P1kJksXbqUxYsXM2TIkE6/z7YQSZKkQl599VW23nprg3UPEBFsvfXWNf9XCMO1JElSQY0UrC+++GLGjx9f7zI2WOvyd2m4liRJ6kEWLlzI7rvvvtZ5jz32GPfddx/nnHPOep1vxx135Lnnnutwzte//nV+85vfrHF86tSpjBs3br3q2FDYcy1JktRFJky4gObm5cWO179/H8466+wix9pll1247LLL2h1buXIlm25aLiZ+4xvfKHasDZ3hWpIkqYs0Ny9nxIimYse7/fbajrVgwQJGjx7N5MmTGT58eMv+iRMnMmnSJDbddFOGDh3KlVdeSVNTE08//TQLFy5km2224ZJLLmHs2LH85S9/AeC73/0uH/jAB1i6dCknnHACS5YsYb/99iMzgcoV84997GMcfPDB3HXXXWy33Xb84he/oG/fvpx22ml84hOf4JhjjmHOnDn827/9Gy+//DJ9+vThlltuAeDpp5/miCOO4E9/+hNHH300F154YZk/tG5muJYkSeqB5s+fz/HHH8+UKVPYa6+93jJ2wQUX8Oc//5k+ffrwwgsvtOyfO3cud955J3379uXEE0/ki1/8IgcffDB/+ctf+OhHP8qjjz7Keeedx8EHH8zXv/51fvWrXzF58uSW9z/++ONcccUV/PCHP+TYY4/l2muv5VOf+lTL+IoVKzjuuOO46qqrGD58OMuWLaNv374AzJs3j/vuu48+ffrw3ve+l8997nNsv/32Xfpn1BUM15IkST3MkiVLGDVqFNdeey277bbbauN77rknJ510Ep/85Cf55Cc/2bL/qKOOagm7v/nNb3jkkUdaxpYtW0ZzczN33HEH1113HQAf//jHefvb394yZ8iQIS1Bft9992XhwoVvOe/8+fMZNGhQy1X0LbfcsmXs0EMPZcCAAQAMHTqURYsWNWS49oZGSZKkHmbAgAFsv/32zJo1C4AxY8aw1157ceSRRwLwq1/9ijPPPJO5c+ey7777snLlSgD69evXcow33niD2bNnM2/ePObNm8dTTz1F//79gTWvotGnT5+W17169Wo57iqZuc7vbRSGa0mSpB6md+/ezJgxg2nTpnH55ZczZcoU5s2bx8yZM3njjTd48skn+dCHPsSFF17ICy+8wEsvvbTaMQ4//HC+973vtWzPmzcPgEMOOYTp06cDcOONN/L3v/+903XtuuuuPP3008yZMweA5ubmhg3Ra2JbiCRJUg/Ur18/brjhBg477DD69evHqFGjAHj99df51Kc+xYsvvkhm8sUvfpGtttpqtfdPnDiRM888kz333JOVK1dyyCGHMGnSJM4991xOOOEE9tlnH0aMGMEOO+zQ6Zp69+7NVVddxec+9zleeeUV+vbt2+ESfY0oVt3h2a0njTgCuAToBfwoMy9oMz4S+AXw5+qu6zKzwzVchg0blvfee2/5YiVJkjrp0Ucf5X3ve1/L9oa8FJ86p+3fKUBEzM3MYe3N7/Yr1xHRC7gUOAxYDMyJiOsz85E2U3+XmZ/o7vokSZJKMQhvfOrRc70f8ERmLsjMFcCVwKg61CFJkiQVVY9wvR3wZKvtxdV9bR0YEfdHxI0RsfoaMpIkSdIGph43NLa3/krbxu8/AO/KzJci4khgBrDzageKOAM4A6ipmV4CuGDCBJY3N9e7jC7Tp39/zj7rrHqXIb1FT/7e+Z2TBPUJ14uB1iuCDwaebj0hM5e1ej0zIr4fEdtk5nNt5k0GJkPlhsauK1k90fLmZppGjKh3GV2m6fbb612CtJqe/L3zOycJ6tMWMgfYOSKGRERv4Hjg+tYTIuIdUV1hPCL2o1Ln0m6vVJIkSapBt4frzFwJjANuAh4F/iszH46IsRExtjrtGOChiLgfmAgcn/VYM1CSJKnBLFy4kN13373bzjd16lTGjRvX4ZxJkyYxbdq01fZ3d63doS4PkcnMmcDMNvsmtXr9PeB7bd8nSZLUSCZcMIHm5eXuM+jfpz9nnd14vf1jx45d+6Qewic0SpIkdZHm5c2MaCp3n8HtTbX19i9YsIDRo0czefJkhg8f3rJ/5MiR7L333sydO5clS5Ywbdo0xo8fz4MPPshxxx3H+eefD8Bll13GxIkTWbFiBfvvvz/f//736dWrF1OmTGH8+PEMGjSIXXbZhT59+gCwaNEiTj/9dJYsWcLAgQOZMmUKO+ywA01NTWyxxRZ86UtfYu7cuZx++um87W1v4+CDDy72Z7OhqEfPtSRJkrrY/PnzGT16NFOmTHlLsF6ld+/e3HHHHYwdO5ZRo0Zx6aWX8tBDDzF16lSWLl3Ko48+ylVXXcWsWbOYN28evXr1Yvr06TzzzDOce+65zJo1i5tvvplHHnnzOYDjxo3jlFNO4YEHHuCkk07i85///GrnHTNmDBMnTmT27Nld+vnrxXAtSZLUwyxZsoRRo0Zx2WWXsddee7U756ijjgJgjz32YLfddmPQoEH06dOHnXbaiSeffJJbbrmFuXPnMnz4cPbaay9uueUWFixYwN13383IkSMZOHAgvXv35rjjjms55uzZsznxxBMBOPnkk7nzzjvfcs4XX3yRF154gRHVVYNOPvnkLvj09WW4liRJ6mEGDBjA9ttvz6xZs4DK1eK99tqLI488smXOqlaOTTbZpOX1qu2VK1eSmZx66qnMmzePefPmMX/+fJqamgCoLuq2Vm3nZWan39uoDNeSJEk9TO/evZkxYwbTpk3j8ssvZ8qUKcybN4+ZM2eu/c1Vhx56KNdccw3PPvssAM8//zyLFi1i//3357bbbmPp0qW89tprXH311S3vOeigg7jyyisBmD59+mo91VtttRUDBgxouaI9ffr09f2oGxxvaJQkSeqB+vXrxw033MBhhx1Gv379GDVqVE3vHzp0KOeffz6HH344b7zxBpttthmXXnopBxxwAE1NTRx44IEMGjSIffbZh9dffx2AiRMncvrpp3PRRRe13NDY1pQpU1puaPzoRz9a5LNuSAzXkiRJXaR/n/41r/CxtuOtzY477shDDz0EVK4Uz5kzZ7U5t912W8vrkSNHMnLkyHbHjjvuuLf0VK8yZswYxowZ0+65f/vb3662f1U7CcC+++7L/fff3+5YT2C4liRJ6iKNuCa11o8915IkSVIhhmtJkiSpEMO1JEmSVIg91+rQhAsm0Ly8ud5lSJIkNQTDtTrUvLyZEU0j6l1Glyh597YkSRLYFiJJktRjLFy4kN13371bzzl16lTGjRvX4ZxJkyYxbdq01faXqve0005jyJAh7LXXXuyzzz7Mnj27Zezb3/42u+66K7vvvjvvf//731LHkiVL2GyzzfjBD36w3jWs4pVrSZKkLnLBhAksby7XXtmnf3/OPqvxlvcbO3bsOr936tSpLFy4cK3rYV900UUcc8wx/PrXv+Yzn/kMDzzwAJMmTeLmm2/mnnvuYcstt+TFF19kxowZLe+5+uqrOeCAA7jiiiv4zGc+s841tma4liRJ6iLLm5tpGlGuvbLp9s63NC5YsIDRo0czefJkhg8f/paxkSNHsvfeezN37lyWLFnCtGnTGD9+PA8++CDHHXcc559/PgCXXXYZEydOZMWKFey///58//vfp1evXkyZMoXx48czaNAgdtllF/r06QPAokWLOP3001myZEnLExp32GEHmpqa2GKLLfjSl77E3LlzW57Q2Pbx6CUccsghPPHEEwD853/+J7feeitbbrklAAMGDODUU09tmXvFFVdw8cUXc+KJJ/LUU0+x3Xbbrff5bQuRJEnqYebPn8/o0aOZMmXKasF6ld69e3PHHXcwduxYRo0axaWXXspDDz3E1KlTWbp0KY8++ihXXXUVs2bNYt68efTq1Yvp06fzzDPPcO655zJr1ixuvvlmHnnkkZZjjhs3jlNOOYUHHniAk046ic9//vOrnXfMmDFMnDjxLa0bJf3yl79kjz32oLm5mebmZt797ne3O+/JJ5/kr3/9K/vttx/HHnssV111VZHze+VakiSpB1myZAmjRo3i2muvZbfddlvjvKOOOgqAPfbYg912241BgwYBsNNOO/Hkk09y5513Mnfu3JZw/sorr7Dtttty9913M3LkSAYOHAhUHpH+2GOPATB79myuu+46AE4++WS+8pWvvOWcL774Ii+88AIjqlfzTz75ZG688cbValu6dCmHHnooAM8//zwrVqxoaef42c9+xh577LHae7785S9z/vnnM3DgQH784x+TmUTEGj//lVdeybHHHgvA8ccfz6c//WnOKtByY7iWJEnqQQYMGMD222/PrFmzWsL1mDFjuO+++3jnO9/JzJkzAVpaOTbZZJOW16u2V65cSWZy6qmnMn78+Lccf8aMGR2G1tbazltb4F1l6623Zt68eUDtPdet9evXjwULFrDTTjutNv+KK67gb3/7G9OnTwfg6aef5vHHH2fnnXdea30dsS1EkiSpB+nduzczZsxg2rRpXH755QBMmTKFefPmtQTrzjj00EO55pprePbZZ4HKFeRFixax//77c9ttt7F06VJee+01rr766pb3HHTQQVx55ZUATJ8+fbWe6q222ooBAwZw5513tszpSueccw5nnnkmy5YtA2DZsmVMnjyZ+fPn8/LLL/PUU0+xcOFCFi5cyDnnnNNS+/owXEuSJPUw/fr144YbbuA73/kOv/jFL9bpGEOHDuX888/n8MMPZ8899+Swww7jmWeeYdCgQTQ1NXHggQfykY98hH322aflPRMnTmTKlCnsueee/OxnP+OSSy5Z7bhTpkzhzDPP5MADD6Rv377r/Bk747Of/Swf+tCHGD58OLvvvjsjRozgbW97G1dccQVHH330W+aOHj2aK664Yr3PGZm53gfZEAwbNizvvffeepfR45x33nk9+iEyJe/g3tA03X475557br3LkN7ivPPO67HfO79zAnj00Ud53/ve17LtUnyNr+3fKUBEzM3MYe3Nt+dakiSpixiENz62hUiSJEmFGK4lSZKkQgzXkiRJBfWU+9m0bn+XhmtJkqRCNt98c5YuXWrA7gEyk6VLl7L55pvX9D5vaJQkSSpk8ODBLF68mCVLltS7FBWw+eabM3jw4JreY7iWJEkqZLPNNmPIkCH1LkN1ZFuIJEmSVIjhWpIkSSrEcC1JkiQVYriWJEmSCjFcS5IkSYUYriVJkqRCDNeSJElSIa5zLUmS1ENdMGECy5ub611Gl+jTvz9nn3VWvctYjeFakiSph1re3EzTiBH1LqNLNN1+e71LaJdtIZIkSVIhhmtJkiSpEMO1JEmSVIjhWpIkSSrEcC1JkiQVYriWJEmSCnEpvgImTLiA5ubl9S5DkiRJdWa4LqC5eTkjRjTVu4wucfvtTfUuQZIkqWHYFiJJkiQVYriWJEmSCjFcS5IkSYUYriVJkqRCDNeSJElSIYZr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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "barWidth = 0.25\n", "fig = plt.subplots(figsize =(12, 8))\n", "\n", "iris = [silhouette, silhouette2, silhouette3]\n", "glass = [silhouette4, silhouette5, silhouette6]\n", "wine = [silhouette7, silhouette8, silhouette9]\n", "\n", "br1 = np.arange(len(iris))\n", "br2 = [x + barWidth for x in br1]\n", "br3 = [x + barWidth for x in br2]\n", "\n", "plt.bar(br1, iris, color ='y', width = barWidth, edgecolor ='grey', label ='k-średnich')\n", "plt.bar(br2, glass, color ='m', width = barWidth, edgecolor ='grey', label ='k-medoid')\n", "plt.bar(br3, wine, color ='c', width = barWidth, edgecolor ='grey', label ='k-medoid + PCA')\n", "\n", "plt.xlabel('Zbiór danych', fontsize = 15)\n", "plt.ylabel('Wartość sylwetki', fontsize = 15)\n", "plt.xticks([r + barWidth for r in range(len(iris))], ['Iris', 'Glass', 'Wine'])\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 127, "id": "74fc7277", "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", "
IrisGlassWine
k-średnich0.440.280.30
k-medoid0.480.350.28
k-medoid + PCA0.500.500.45
\n", "
" ], "text/plain": [ " Iris \\\n", "k-średnich 0.44 \n", "k-medoid 0.48 \n", "k-medoid + PCA 0.50 \n", "\n", " Glass \\\n", "k-średnich 0.28 \n", "k-medoid 0.35 \n", "k-medoid + PCA 0.50 \n", "\n", " Wine \n", "k-średnich 0.30 \n", "k-medoid 0.28 \n", "k-medoid + PCA 0.45 " ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_shoulette" ] }, { "cell_type": "markdown", "id": "cf18c7b0", "metadata": {}, "source": [ " W wyniku tego porównania można dojść do wniosku, że najlepszą z metod jest metoda k-medoid wraz z redukcją wymiaru zbiorów danych przy pomocy PCA. " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.13" } }, "nbformat": 4, "nbformat_minor": 5 }