diff --git a/jupyter.ipynb b/jupyter.ipynb
index eee29df..6d6d003 100644
--- a/jupyter.ipynb
+++ b/jupyter.ipynb
@@ -797,7 +797,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3.8.13 ('pytorch_m1')",
"language": "python",
"name": "python3"
},
@@ -811,9 +811,14 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.8.9"
+ "version": "3.8.13"
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "8a8c11200ab875bf4be543ce12265edee0c7e0345ae0b6d9e205fdf23b03e663"
+ }
}
},
"nbformat": 4,
"nbformat_minor": 1
-}
+}
\ No newline at end of file
diff --git a/kMedoids.py b/kMedoids.py
new file mode 100644
index 0000000..4e03bfd
--- /dev/null
+++ b/kMedoids.py
@@ -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
diff --git a/kmedoids.ipynb b/kmedoids.ipynb
index 0609c18..3ae89b1 100644
--- a/kmedoids.ipynb
+++ b/kmedoids.ipynb
@@ -3,7 +3,11 @@
{
"cell_type": "markdown",
"id": "e1e5a2b7",
- "metadata": {},
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
"source": [
"# Analiza skupień metodą k-medoids (PAM) "
]
@@ -11,7 +15,11 @@
{
"cell_type": "markdown",
"id": "80d5deaf",
- "metadata": {},
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
"source": [
"### Co to jest klasteryzacja? "
]
@@ -19,7 +27,11 @@
{
"cell_type": "markdown",
"id": "4040df16",
- "metadata": {},
+ "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. 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",
"id": "3dc57d21",
- "metadata": {},
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
"source": [
"W naszym projekcie przedstawimy metodę k-medoid i porównamy ją z metodą k-średnich."
]
@@ -35,7 +51,11 @@
{
"cell_type": "markdown",
"id": "f7c684c9",
- "metadata": {},
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
"source": [
"### Algorytm k-medoid"
]
@@ -43,7 +63,11 @@
{
"cell_type": "markdown",
"id": "af45d7c7",
- "metadata": {},
+ "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",
@@ -56,7 +80,11 @@
{
"cell_type": "markdown",
"id": "d8f6dd1e",
- "metadata": {},
+ "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. 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",
"id": "ab825d40",
- "metadata": {},
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
"source": [
"
$s(x_i) = \\frac{b(x_i)-a(x_i)}{max(a(x_i),b(x_i))}$
\n"
]
@@ -72,7 +104,11 @@
{
"cell_type": "markdown",
"id": "f6d344cf",
- "metadata": {},
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
"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."
]
@@ -81,56 +117,12 @@
"cell_type": "code",
"execution_count": 1,
"id": "73cffc81",
- "metadata": {},
- "outputs": [
- {
- "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"
- ]
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
}
- ],
+ },
+ "outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
@@ -259,11 +251,40 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"id": "3a8a592f",
- "metadata": {},
- "outputs": [],
- "source": []
+ "metadata": {
+ "pycharm": {
+ "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\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\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": {
@@ -287,4 +308,4 @@
},
"nbformat": 4,
"nbformat_minor": 5
-}
+}
\ No newline at end of file
| |