{ "cells": [ { "cell_type": "code", "execution_count": 100, "id": "c42efdb2-91c6-4184-a14a-a46431fbe9d9", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "def dist(X: np.ndarray, Y: np.ndarray) -> float:\n", " return np.sqrt((X-Y).T @ (X-Y))\n", "\n", "def knn(X_train: np.ndarray, k: int, X: np.ndarray, y: np.ndarray) -> int:\n", " distances = []\n", "\n", " for X_i in X_train:\n", " distances.append(dist(X_i, X))\n", "\n", " candidates = np.argsort(distances)[:k]\n", " return 1 if sum([y[c] for c in candidates]) > (len(candidates)/2) else 0\n", "\n", "from sklearn.datasets import make_blobs\n", "\n", "X, y = make_blobs(n_samples=20,\n", " centers = [[1,1], [3,3]],\n", " random_state=123,\n", " cluster_std=0.6)\n", "\n", "import matplotlib.pyplot as plt\n", "plt.scatter(X[:,0], X[:,1], c=y)\n", "\n", "\n", "X1 = [3,3] # expect 1 = yellow\n", "X2 = [0,0] # expect 0 = purple\n", "X3 = [1,1] # expect 0 (purple)\n", "k = 5\n", "X_test = np.array([X1, X2, X3])\n", "y_test = np.array([knn(X, k, p,y) for p in X_test])\n", "plt.scatter(X_test[:,0], X_test[:,1], c=y_test, marker='x')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "f9456790-74ac-4069-9ce2-ae62cb0c665a", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "metal", "language": "python", "name": "metal" }, "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.11.11" } }, "nbformat": 4, "nbformat_minor": 5 }