diff --git a/K-Means/AClusteringExample.ipynb b/K-Means/AClusteringExample.ipynb
index 57964430fb153b1d2460959c61e21ad98447109a..7691cbef9110cd4a3ac8a95d015a6e424827ce2e 100644
--- a/K-Means/AClusteringExample.ipynb
+++ b/K-Means/AClusteringExample.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 1,
    "id": "chicken-minneapolis",
    "metadata": {},
    "outputs": [],
@@ -10,7 +10,8 @@
     "import numpy as np\n",
     "import matplotlib.pyplot as plt\n",
     "from sklearn.cluster import KMeans\n",
-    "from sklearn.cluster import Birch"
+    "from sklearn.cluster import Birch\n",
+    "from ipywidgets import interactive"
    ]
   },
   {
@@ -23,13 +24,13 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 22,
    "id": "chicken-marshall",
    "metadata": {},
    "outputs": [
     {
      "data": {
-      "image/png": "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\n",
+      "image/png": "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\n",
       "text/plain": [
        "<Figure size 432x288 with 1 Axes>"
       ]
@@ -44,8 +45,10 @@
     "rng = np.random.default_rng(seed=1)\n",
     "x = 7 + rng.random(20)\n",
     "x = np.append(x, 5 + rng.random(20))\n",
+    "x = np.append(x, 7 + rng.random(20))\n",
     "y = 5 + rng.random(20)\n",
-    "y = np.append(y, 4 + rng.random(20))\n",
+    "y = np.append(y, 3 + rng.random(20))\n",
+    "y = np.append(y, 1 + rng.random(20))\n",
     "plt.plot(x, y, '.')\n",
     "\n",
     "data = np.stack((x, y), axis=1)\n",
@@ -63,26 +66,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 3,
    "id": "generic-dating",
    "metadata": {},
    "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "25.16143318862738\n",
-      "2.0092105896679273\n",
-      "0.0\n"
-     ]
-    },
     {
      "data": {
       "text/plain": [
-       "<matplotlib.collections.PathCollection at 0x12b0973d0>"
+       "<matplotlib.collections.PathCollection at 0x131775280>"
       ]
      },
-     "execution_count": 20,
+     "execution_count": 3,
      "metadata": {},
      "output_type": "execute_result"
     },
@@ -154,11 +148,55 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 43,
    "id": "upper-moment",
    "metadata": {},
-   "outputs": [],
-   "source": []
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "60f12fe5b3914b06bee45a9a018f5936",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "interactive(children=(IntSlider(value=1, description='step', max=10, min=1), Output()), _dom_classes=('widget-…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%matplotlib inline\n",
+    "import random\n",
+    "def kmeans(step=1):\n",
+    "    cur_steps = 0\n",
+    "    ks = np.arange(0, 15)\n",
+    "    ks = [3]\n",
+    "\n",
+    "    # für jedes Cluster\n",
+    "    for k in ks:\n",
+    "        cs = data[0:k].copy()\n",
+    "\n",
+    "        last_cog = [np.array([0, 0]) for i in range(k)]\n",
+    "        while cur_steps < step:\n",
+    "            dist = np.stack([[np.linalg.norm(c-d) for d in data] for c in cs], axis=1)\n",
+    "            z = np.array([np.argmin(d) for d in dist])\n",
+    "            df = [data[z == i] for i in range(k)]\n",
+    "            current_cog = [np.sum(d, axis=0)/len(d) for d in df]\n",
+    "            diff_cog = np.sum(np.abs([last - current for last, current in zip(last_cog, current_cog)]))\n",
+    "            last_cog = current_cog\n",
+    "            cs = current_cog\n",
+    "            cur_steps += 1\n",
+    "            \n",
+    "    for i in range(ks[0]):\n",
+    "        plt.scatter(df[i][:, 0], df[i][:, 1])\n",
+    "    cs = np.squeeze(cs)\n",
+    "    plt.plot(cs[:, 0], cs[:, 1], 'bo')\n",
+    "    \n",
+    "interactive(kmeans, step=(1, 10))"
+   ]
   },
   {
    "cell_type": "markdown",