KMedoids visualization

This commit is contained in:
Adam Wojdyla 2022-06-15 22:16:06 +02:00
parent b0decebad3
commit 8aca985483
3 changed files with 255 additions and 66 deletions

View File

@ -797,7 +797,7 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": "Python 3 (ipykernel)", "display_name": "Python 3.8.13 ('pytorch_m1')",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
@ -811,9 +811,14 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.8.9" "version": "3.8.13"
},
"vscode": {
"interpreter": {
"hash": "8a8c11200ab875bf4be543ce12265edee0c7e0345ae0b6d9e205fdf23b03e663"
}
} }
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 1 "nbformat_minor": 1
} }

163
kMedoids.py Normal file
View File

@ -0,0 +1,163 @@
import random
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import MinMaxScaler
class TrainModel:
def __init__(self, data, k_value):
self.data = data
scaler = MinMaxScaler()
# self.data = scaler.fit_transform(self.data)
self.k_value = k_value
self.kmedoids(self.data)
def get_random_medoids(self, data):
points = random.sample(range(0, len(data)), self.k_value)
medoids = []
for i in range(self.k_value):
medoids.append(data[i])
return medoids
def get_closest_medoids(self, sample_point, medoids):
min_distance = float('inf')
closest_medoid = None
for i in range(len(medoids)):
distance = self.calculateDistance(sample_point, medoids[i])
if distance < min_distance:
min_distance = distance
closest_medoid = i
return closest_medoid
def get_clusters(self, data_points, medoids):
clusters = [[] for _ in range(self.k_value)]
for i in range(len(data_points)):
x = self.get_closest_medoids(data_points[i], medoids)
clusters[x].append(data_points[i])
return clusters
def calculate_cost(self, data_points, clusters, medoids):
cost = 0
for i in range(len(clusters)):
for j in range(len(clusters[i])):
cost += self.calculateDistance(medoids[i], clusters[i][j])
return cost
def get_non_medoids(self, data_points, medoids):
non_medoids = []
for sample in data_points:
flag = False
for m in medoids:
if (sample == m).all():
flag = True
if flag == False:
non_medoids.append(sample)
return non_medoids
def get_clusters_label(self, data_points, clusters):
labels = []
for i in range(len(data_points)):
labels.append(0)
for i in range(len(clusters)):
cluster = clusters[i]
for j in range(len(cluster)):
for k in range(len(data_points)):
if (cluster[j] == data_points[k]).all():
labels[k] = i
break
return labels
def kmedoids(self, data):
medoids = self.get_random_medoids(data)
clusters = self.get_clusters(data, medoids)
initial_cost = self.calculate_cost(data, clusters, medoids)
while True:
best_medoids = medoids
lowest_cost = initial_cost
for i in range(len(medoids)):
non_medoids = self.get_non_medoids(data, medoids)
for j in range(len(non_medoids)):
new_medoids = medoids.copy()
for k in range(len(new_medoids)):
if (new_medoids[k] == medoids[i]).all():
new_medoids[k] = non_medoids[j]
new_clusters = self.get_clusters(data, new_medoids)
new_cost = self.calculate_cost(data, new_clusters, new_medoids)
if new_cost < lowest_cost:
lowest_cost = new_cost
best_medoids = new_medoids
if lowest_cost < initial_cost:
initial_cost = lowest_cost
medoids = best_medoids
else:
break
final_clusters = self.get_clusters(data, medoids)
cluster_labels = self.get_clusters_label(data, final_clusters)
silhouette_avg = silhouette_score(data, cluster_labels)
# First cluster
x0 = np.squeeze(final_clusters[0])[:, 0]
y0 = np.squeeze(final_clusters[0])[:, 1]
# Second cluster
x1 = np.squeeze(final_clusters[1])[:, 0]
y1 = np.squeeze(final_clusters[1])[:, 1]
plt.scatter(x0, y0, c='red')
plt.scatter(x1, y1, c='green')
# Draw medoids
mx = []
my = []
for m in medoids:
mx.append(m[0])
my.append(m[1])
plt.scatter(mx, my, c='yellow', marker='*')
plt.xlabel("X")
plt.ylabel("Y")
plt.title("K-medoids clusters")
plt.show()
print('Sylwetka (ang. Silhouette) dla algorytmu k-medoid dla k =', self.k_value, 10 * '-', silhouette_avg)
def calculateDistance(self, x, y):
return np.linalg.norm(x - y)
# Prepare dataset
dataset = np.array([
[5, 6],
[4, 7],
[4, 8],
[4, 6],
[5, 7],
[5, 8],
[7, 6],
[8, 8],
[7, 7],
[7, 8]]
)
column_values = ['x', 'y']
df = pd.DataFrame(data=dataset, columns=column_values, index=None)
# Draw data distribution
sns.set_theme(style='darkgrid')
sns.scatterplot(data=df, x='x', y='y')
plt.show()
# Run K-Medoids algorithm
model = TrainModel(dataset, 2)
# dataset = pd.read_csv('iris.csv')
# dataset = dataset.iloc[:,:-1]
# dataset = dataset.iloc[: , 1:]
# dataset = dataset.values

View File

@ -3,7 +3,11 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "e1e5a2b7", "id": "e1e5a2b7",
"metadata": {}, "metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [ "source": [
"# Analiza skupień metodą k-medoids (PAM) " "# Analiza skupień metodą k-medoids (PAM) "
] ]
@ -11,7 +15,11 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "80d5deaf", "id": "80d5deaf",
"metadata": {}, "metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [ "source": [
"### Co to jest klasteryzacja? " "### Co to jest klasteryzacja? "
] ]
@ -19,7 +27,11 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "4040df16", "id": "4040df16",
"metadata": {}, "metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [ "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. 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." "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. 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."
] ]
@ -27,7 +39,11 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "3dc57d21", "id": "3dc57d21",
"metadata": {}, "metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [ "source": [
"W naszym projekcie przedstawimy metodę k-medoid i porównamy ją z metodą k-średnich." "W naszym projekcie przedstawimy metodę k-medoid i porównamy ją z metodą k-średnich."
] ]
@ -35,7 +51,11 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "f7c684c9", "id": "f7c684c9",
"metadata": {}, "metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [ "source": [
"### Algorytm k-medoid" "### Algorytm k-medoid"
] ]
@ -43,7 +63,11 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "af45d7c7", "id": "af45d7c7",
"metadata": {}, "metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [ "source": [
"1. Inicjalizacja: wybierz k losowych punktów spośród n punktów danych jako medoidy.\n", "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", "2. Przyporządkuj każdy punkt danych do najbliższego medoidu, używając dowolnych popularnych metod metryki odległości.\n",
@ -56,7 +80,11 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "d8f6dd1e", "id": "d8f6dd1e",
"metadata": {}, "metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [ "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. 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: " "**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. 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: "
] ]
@ -64,7 +92,11 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "ab825d40", "id": "ab825d40",
"metadata": {}, "metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [ "source": [
"<h1><center>$s(x_i) = \\frac{b(x_i)-a(x_i)}{max(a(x_i),b(x_i))}$</center></h1>\n" "<h1><center>$s(x_i) = \\frac{b(x_i)-a(x_i)}{max(a(x_i),b(x_i))}$</center></h1>\n"
] ]
@ -72,7 +104,11 @@
{ {
"cell_type": "markdown", "cell_type": "markdown",
"id": "f6d344cf", "id": "f6d344cf",
"metadata": {}, "metadata": {
"pycharm": {
"name": "#%% md\n"
}
},
"source": [ "source": [
"otrzymując wartość sylwetki dla danego obiektu $x_i$. 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." "otrzymując wartość sylwetki dla danego obiektu $x_i$. 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."
] ]
@ -81,56 +117,12 @@
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 1,
"id": "73cffc81", "id": "73cffc81",
"metadata": {}, "metadata": {
"outputs": [ "pycharm": {
{ "name": "#%%\n"
"name": "stdout",
"output_type": "stream",
"text": [
" Długość kielicha Szerokość kielicha Długość płatka Szerokość płatka \\\n",
"0 0.222222 0.625000 0.067797 0.041667 \n",
"1 0.166667 0.416667 0.067797 0.041667 \n",
"2 0.111111 0.500000 0.050847 0.041667 \n",
"3 0.083333 0.458333 0.084746 0.041667 \n",
"4 0.194444 0.666667 0.067797 0.041667 \n",
".. ... ... ... ... \n",
"145 0.666667 0.416667 0.711864 0.916667 \n",
"146 0.555556 0.208333 0.677966 0.750000 \n",
"147 0.611111 0.416667 0.711864 0.791667 \n",
"148 0.527778 0.583333 0.745763 0.916667 \n",
"149 0.444444 0.416667 0.694915 0.708333 \n",
"\n",
" Wartość medoidu 0 \\\n",
"0 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
"1 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
"2 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
"3 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
"4 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
".. ... \n",
"145 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
"146 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
"147 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
"148 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
"149 [0.19444444444444442, 0.5833333333333333, 0.08... \n",
"\n",
" Wartość medoidu 1 Medoid \n",
"0 [0.5277777777777779, 0.33333333333333326, 0.64... 0 \n",
"1 [0.5277777777777779, 0.33333333333333326, 0.64... 0 \n",
"2 [0.5277777777777779, 0.33333333333333326, 0.64... 0 \n",
"3 [0.5277777777777779, 0.33333333333333326, 0.64... 0 \n",
"4 [0.5277777777777779, 0.33333333333333326, 0.64... 0 \n",
".. ... ... \n",
"145 [0.5277777777777779, 0.33333333333333326, 0.64... 1 \n",
"146 [0.5277777777777779, 0.33333333333333326, 0.64... 1 \n",
"147 [0.5277777777777779, 0.33333333333333326, 0.64... 1 \n",
"148 [0.5277777777777779, 0.33333333333333326, 0.64... 1 \n",
"149 [0.5277777777777779, 0.33333333333333326, 0.64... 1 \n",
"\n",
"[150 rows x 7 columns]\n",
"Sylwetka (ang. Silhouette) dla algorytmu k-medoid dla k = 2 ---------- 0.6114567207221335\n"
]
} }
], },
"outputs": [],
"source": [ "source": [
"import numpy as np\n", "import numpy as np\n",
"import pandas as pd\n", "import pandas as pd\n",
@ -259,11 +251,40 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"id": "3a8a592f", "id": "3a8a592f",
"metadata": {}, "metadata": {
"outputs": [], "pycharm": {
"source": [] "name": "#%%\n"
}
},
"outputs": [
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[0;31mKeyboardInterrupt\u001B[0m Traceback (most recent call last)",
"Input \u001B[0;32mIn [2]\u001B[0m, in \u001B[0;36m<cell line: 5>\u001B[0;34m()\u001B[0m\n\u001B[1;32m 3\u001B[0m dataset \u001B[38;5;241m=\u001B[39m pd\u001B[38;5;241m.\u001B[39mread_csv(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124miris.csv\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m 4\u001B[0m dataset \u001B[38;5;241m=\u001B[39m dataset\u001B[38;5;241m.\u001B[39miloc[:,:\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m]\n\u001B[0;32m----> 5\u001B[0m dataset \u001B[38;5;241m=\u001B[39m \u001B[43mdataset\u001B[49m\u001B[38;5;241m.\u001B[39miloc[: , \u001B[38;5;241m1\u001B[39m:]\n\u001B[1;32m 6\u001B[0m dataset \u001B[38;5;241m=\u001B[39m dataset\u001B[38;5;241m.\u001B[39mvalues\n\u001B[1;32m 7\u001B[0m model \u001B[38;5;241m=\u001B[39m TrainModel(dataset, \u001B[38;5;241m2\u001B[39m)\n",
"Input \u001B[0;32mIn [2]\u001B[0m, in \u001B[0;36m<cell line: 5>\u001B[0;34m()\u001B[0m\n\u001B[1;32m 3\u001B[0m dataset \u001B[38;5;241m=\u001B[39m pd\u001B[38;5;241m.\u001B[39mread_csv(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124miris.csv\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m 4\u001B[0m dataset \u001B[38;5;241m=\u001B[39m dataset\u001B[38;5;241m.\u001B[39miloc[:,:\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m]\n\u001B[0;32m----> 5\u001B[0m dataset \u001B[38;5;241m=\u001B[39m \u001B[43mdataset\u001B[49m\u001B[38;5;241m.\u001B[39miloc[: , \u001B[38;5;241m1\u001B[39m:]\n\u001B[1;32m 6\u001B[0m dataset \u001B[38;5;241m=\u001B[39m dataset\u001B[38;5;241m.\u001B[39mvalues\n\u001B[1;32m 7\u001B[0m model \u001B[38;5;241m=\u001B[39m TrainModel(dataset, \u001B[38;5;241m2\u001B[39m)\n",
"File \u001B[0;32m/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydevd_bundle/pydevd_frame.py:747\u001B[0m, in \u001B[0;36mPyDBFrame.trace_dispatch\u001B[0;34m(self, frame, event, arg)\u001B[0m\n\u001B[1;32m 745\u001B[0m \u001B[38;5;66;03m# if thread has a suspend flag, we suspend with a busy wait\u001B[39;00m\n\u001B[1;32m 746\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m info\u001B[38;5;241m.\u001B[39mpydev_state \u001B[38;5;241m==\u001B[39m STATE_SUSPEND:\n\u001B[0;32m--> 747\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdo_wait_suspend\u001B[49m\u001B[43m(\u001B[49m\u001B[43mthread\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mframe\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mevent\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43marg\u001B[49m\u001B[43m)\u001B[49m\n\u001B[1;32m 748\u001B[0m \u001B[38;5;66;03m# No need to reset frame.f_trace to keep the same trace function.\u001B[39;00m\n\u001B[1;32m 749\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mtrace_dispatch\n",
"File \u001B[0;32m/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydevd_bundle/pydevd_frame.py:144\u001B[0m, in \u001B[0;36mPyDBFrame.do_wait_suspend\u001B[0;34m(self, *args, **kwargs)\u001B[0m\n\u001B[1;32m 143\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mdo_wait_suspend\u001B[39m(\u001B[38;5;28mself\u001B[39m, \u001B[38;5;241m*\u001B[39margs, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs):\n\u001B[0;32m--> 144\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_args\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;241;43m0\u001B[39;49m\u001B[43m]\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdo_wait_suspend\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n",
"File \u001B[0;32m/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd.py:1155\u001B[0m, in \u001B[0;36mPyDB.do_wait_suspend\u001B[0;34m(self, thread, frame, event, arg, send_suspend_message, is_unhandled_exception)\u001B[0m\n\u001B[1;32m 1152\u001B[0m from_this_thread\u001B[38;5;241m.\u001B[39mappend(frame_id)\n\u001B[1;32m 1154\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_threads_suspended_single_notification\u001B[38;5;241m.\u001B[39mnotify_thread_suspended(thread_id, stop_reason):\n\u001B[0;32m-> 1155\u001B[0m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_do_wait_suspend\u001B[49m\u001B[43m(\u001B[49m\u001B[43mthread\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mframe\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mevent\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43marg\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43msuspend_type\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mfrom_this_thread\u001B[49m\u001B[43m)\u001B[49m\n",
"File \u001B[0;32m/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd.py:1170\u001B[0m, in \u001B[0;36mPyDB._do_wait_suspend\u001B[0;34m(self, thread, frame, event, arg, suspend_type, from_this_thread)\u001B[0m\n\u001B[1;32m 1167\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_call_mpl_hook()\n\u001B[1;32m 1169\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mprocess_internal_commands()\n\u001B[0;32m-> 1170\u001B[0m \u001B[43mtime\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43msleep\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m0.01\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[1;32m 1172\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mcancel_async_evaluation(get_current_thread_id(thread), \u001B[38;5;28mstr\u001B[39m(\u001B[38;5;28mid\u001B[39m(frame)))\n\u001B[1;32m 1174\u001B[0m \u001B[38;5;66;03m# process any stepping instructions\u001B[39;00m\n",
"\u001B[0;31mKeyboardInterrupt\u001B[0m: "
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"dataset = pd.read_csv('iris.csv')\n",
"dataset = dataset.iloc[:,:-1]\n",
"dataset = dataset.iloc[: , 1:]\n",
"dataset = dataset.values\n",
"model = TrainModel(dataset, 2)"
]
} }
], ],
"metadata": { "metadata": {
@ -287,4 +308,4 @@
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 5 "nbformat_minor": 5
} }