From be81d26e93c6d42ad31f9fd9ccd9c16b274b9cc2 Mon Sep 17 00:00:00 2001 From: Gerardo Marx Date: Mon, 23 Mar 2026 10:53:38 -0600 Subject: [PATCH] initial commit --- Readme.md | 475 +++++++++++++++++++++++++++++++ iris_basic.csv | 151 ++++++++++ main.ipynb | 591 +++++++++++++++++++++++++++++++++++++++ main_files/main_10_1.png | Bin 0 -> 23819 bytes 4 files changed, 1217 insertions(+) create mode 100644 Readme.md create mode 100644 iris_basic.csv create mode 100644 main.ipynb create mode 100644 main_files/main_10_1.png diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..a8a394d --- /dev/null +++ b/Readme.md @@ -0,0 +1,475 @@ +```python +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +df = pd.read_csv("iris_basic.csv") +print(df.head()) +``` + + sl sw pl pw target tNames + 0 5.1 3.5 1.4 0.2 0 setosa + 1 4.9 3.0 1.4 0.2 0 setosa + 2 4.7 3.2 1.3 0.2 0 setosa + 3 4.6 3.1 1.5 0.2 0 setosa + 4 5.0 3.6 1.4 0.2 0 setosa + + + +```python +x = df["pw"].to_numpy().reshape(-1, 1) # (150,1) +x +``` + + + + + array([[0.2], + [0.2], + [0.2], + [0.2], + [0.2], + [0.4], + [0.3], + [0.2], + [0.2], + [0.1], + [0.2], + [0.2], + [0.1], + [0.1], + [0.2], + [0.4], + [0.4], + [0.3], + [0.3], + [0.3], + [0.2], + [0.4], + [0.2], + [0.5], + [0.2], + [0.2], + [0.4], + [0.2], + [0.2], + [0.2], + [0.2], + [0.4], + [0.1], + [0.2], + [0.2], + [0.2], + [0.2], + [0.1], + [0.2], + [0.2], + [0.3], + [0.3], + [0.2], + [0.6], + [0.4], + [0.3], + [0.2], + [0.2], + [0.2], + [0.2], + [1.4], + [1.5], + [1.5], + [1.3], + [1.5], + [1.3], + [1.6], + [1. ], + [1.3], + [1.4], + [1. ], + [1.5], + [1. ], + [1.4], + [1.3], + [1.4], + [1.5], + [1. ], + [1.5], + [1.1], + [1.8], + [1.3], + [1.5], + [1.2], + [1.3], + [1.4], + [1.4], + [1.7], + [1.5], + [1. ], + [1.1], + [1. ], + [1.2], + [1.6], + [1.5], + [1.6], + [1.5], + [1.3], + [1.3], + [1.3], + [1.2], + [1.4], + [1.2], + [1. ], + [1.3], + [1.2], + [1.3], + [1.3], + [1.1], + [1.3], + [2.5], + [1.9], + [2.1], + [1.8], + [2.2], + [2.1], + [1.7], + [1.8], + [1.8], + [2.5], + [2. ], + [1.9], + [2.1], + [2. ], + [2.4], + [2.3], + [1.8], + [2.2], + [2.3], + [1.5], + [2.3], + [2. ], + [2. ], + [1.8], + [2.1], + [1.8], + [1.8], + [1.8], + [2.1], + [1.6], + [1.9], + [2. ], + [2.2], + [1.5], + [1.4], + [2.3], + [2.4], + [1.8], + [1.8], + [2.1], + [2.4], + [2.3], + [1.9], + [2.3], + [2.5], + [2.3], + [1.9], + [2. ], + [2.3], + [1.8]]) + + + + +```python +y = df["target"].to_numpy().reshape(-1, 1) # (150,1) +y = (y == 0).astype(float) +y +``` + + + + + array([[1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [1.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.], + [0.]]) + + + + +```python +def sigmoid(z): + z = np.clip(z, -500, 500) + sig = 1.0 / (1.0 + np.exp(-z)) + return sig +``` + + +```python +def log_loss(y, p, eps=1e-12): + p = np.clip(p, eps, 1 - eps) + return -np.mean(y*np.log(p) + (1-y)*np.log(1-p)) +``` + + +```python +lr=0.1 +epochs=2000 +l2=0.0, +X = np.column_stack([x, np.ones_like(x)]) +m = X.shape[0] +theta = np.zeros((2,1)) +theta +``` + + + + + array([[0.], + [0.]]) + + + + +```python +X.T +``` + + + + + array([[0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, + 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2, + 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, + 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2, 1.4, 1.5, + 1.5, 1.3, 1.5, 1.3, 1.6, 1. , 1.3, 1.4, 1. , 1.5, 1. , 1.4, 1.3, + 1.4, 1.5, 1. , 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, + 1.5, 1. , 1.1, 1. , 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, + 1.4, 1.2, 1. , 1.3, 1.2, 1.3, 1.3, 1.1, 1.3, 2.5, 1.9, 2.1, 1.8, + 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2. , 1.9, 2.1, 2. , 2.4, 2.3, 1.8, + 2.2, 2.3, 1.5, 2.3, 2. , 2. , 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6, + 1.9, 2. , 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 1.9, + 2.3, 2.5, 2.3, 1.9, 2. , 2.3, 1.8], + [1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , + 1. , 1. , 1. , 1. , 1. , 1. , 1. ]]) + + + + +```python +for i in range(epochs): + z = X @ theta # (m,1) + h = sigmoid(z) # (m,1) + grad = (X.T @ (h - y)) / m # (2,1) <-- from your formula + theta -= lr * grad + + #if (i % 0 == 0 or t == epochs-1): + # print(f"{i:4d} loss={log_loss(y, h):.6f} w={theta[0,0]:.6f} b={theta[1,0]:.6f}") + +w, b = theta[0,0], theta[1,0] + +``` + + +```python +def predict_proba(x, w, b): + x = np.asarray(x, float).reshape(-1) + return sigmoid(w*x + b) + +def predict(x, w, b, thresh=0.5): + return (predict_proba(x, w, b) >= thresh).astype(int) + + +``` + + +```python +rng = np.random.default_rng(0) +m = 120 +xNew = np.linspace(-0.5, 2.5, m) +p = predict_proba(xNew, w, b) +print(f"\nLearned: w={w:.3f}, b={b:.3f}, loss={log_loss(p.reshape(-1,1), p.reshape(-1,1)):.4f}") + +``` + + + Learned: w=-5.989, b=4.279, loss=0.1812 + + + +```python +yJitter = y +np.random.uniform(-0.2, 0.2, size=y.shape) +plt.plot(x, yJitter, 'ok', alpha=0.1) +plt.plot(xNew,p) +``` + + + + + [] + + + + + +![png](main_files/main_10_1.png) + + + + +```python + +``` diff --git a/iris_basic.csv b/iris_basic.csv new file mode 100644 index 0000000..3e0132c --- /dev/null +++ b/iris_basic.csv @@ -0,0 +1,151 @@ +sl,sw,pl,pw,target,tNames +5.1,3.5,1.4,0.2,0,setosa +4.9,3.0,1.4,0.2,0,setosa +4.7,3.2,1.3,0.2,0,setosa +4.6,3.1,1.5,0.2,0,setosa +5.0,3.6,1.4,0.2,0,setosa +5.4,3.9,1.7,0.4,0,setosa +4.6,3.4,1.4,0.3,0,setosa +5.0,3.4,1.5,0.2,0,setosa +4.4,2.9,1.4,0.2,0,setosa +4.9,3.1,1.5,0.1,0,setosa +5.4,3.7,1.5,0.2,0,setosa +4.8,3.4,1.6,0.2,0,setosa +4.8,3.0,1.4,0.1,0,setosa +4.3,3.0,1.1,0.1,0,setosa +5.8,4.0,1.2,0.2,0,setosa +5.7,4.4,1.5,0.4,0,setosa +5.4,3.9,1.3,0.4,0,setosa +5.1,3.5,1.4,0.3,0,setosa +5.7,3.8,1.7,0.3,0,setosa +5.1,3.8,1.5,0.3,0,setosa +5.4,3.4,1.7,0.2,0,setosa +5.1,3.7,1.5,0.4,0,setosa +4.6,3.6,1.0,0.2,0,setosa +5.1,3.3,1.7,0.5,0,setosa +4.8,3.4,1.9,0.2,0,setosa +5.0,3.0,1.6,0.2,0,setosa +5.0,3.4,1.6,0.4,0,setosa +5.2,3.5,1.5,0.2,0,setosa +5.2,3.4,1.4,0.2,0,setosa +4.7,3.2,1.6,0.2,0,setosa +4.8,3.1,1.6,0.2,0,setosa +5.4,3.4,1.5,0.4,0,setosa +5.2,4.1,1.5,0.1,0,setosa +5.5,4.2,1.4,0.2,0,setosa +4.9,3.1,1.5,0.2,0,setosa +5.0,3.2,1.2,0.2,0,setosa +5.5,3.5,1.3,0.2,0,setosa +4.9,3.6,1.4,0.1,0,setosa +4.4,3.0,1.3,0.2,0,setosa +5.1,3.4,1.5,0.2,0,setosa +5.0,3.5,1.3,0.3,0,setosa +4.5,2.3,1.3,0.3,0,setosa +4.4,3.2,1.3,0.2,0,setosa +5.0,3.5,1.6,0.6,0,setosa +5.1,3.8,1.9,0.4,0,setosa +4.8,3.0,1.4,0.3,0,setosa +5.1,3.8,1.6,0.2,0,setosa +4.6,3.2,1.4,0.2,0,setosa +5.3,3.7,1.5,0.2,0,setosa +5.0,3.3,1.4,0.2,0,setosa +7.0,3.2,4.7,1.4,1,versicolor +6.4,3.2,4.5,1.5,1,versicolor +6.9,3.1,4.9,1.5,1,versicolor +5.5,2.3,4.0,1.3,1,versicolor +6.5,2.8,4.6,1.5,1,versicolor +5.7,2.8,4.5,1.3,1,versicolor +6.3,3.3,4.7,1.6,1,versicolor +4.9,2.4,3.3,1.0,1,versicolor +6.6,2.9,4.6,1.3,1,versicolor +5.2,2.7,3.9,1.4,1,versicolor +5.0,2.0,3.5,1.0,1,versicolor +5.9,3.0,4.2,1.5,1,versicolor +6.0,2.2,4.0,1.0,1,versicolor +6.1,2.9,4.7,1.4,1,versicolor +5.6,2.9,3.6,1.3,1,versicolor +6.7,3.1,4.4,1.4,1,versicolor +5.6,3.0,4.5,1.5,1,versicolor +5.8,2.7,4.1,1.0,1,versicolor +6.2,2.2,4.5,1.5,1,versicolor +5.6,2.5,3.9,1.1,1,versicolor +5.9,3.2,4.8,1.8,1,versicolor +6.1,2.8,4.0,1.3,1,versicolor +6.3,2.5,4.9,1.5,1,versicolor +6.1,2.8,4.7,1.2,1,versicolor +6.4,2.9,4.3,1.3,1,versicolor +6.6,3.0,4.4,1.4,1,versicolor +6.8,2.8,4.8,1.4,1,versicolor +6.7,3.0,5.0,1.7,1,versicolor +6.0,2.9,4.5,1.5,1,versicolor +5.7,2.6,3.5,1.0,1,versicolor +5.5,2.4,3.8,1.1,1,versicolor +5.5,2.4,3.7,1.0,1,versicolor +5.8,2.7,3.9,1.2,1,versicolor +6.0,2.7,5.1,1.6,1,versicolor +5.4,3.0,4.5,1.5,1,versicolor +6.0,3.4,4.5,1.6,1,versicolor +6.7,3.1,4.7,1.5,1,versicolor +6.3,2.3,4.4,1.3,1,versicolor +5.6,3.0,4.1,1.3,1,versicolor +5.5,2.5,4.0,1.3,1,versicolor +5.5,2.6,4.4,1.2,1,versicolor +6.1,3.0,4.6,1.4,1,versicolor +5.8,2.6,4.0,1.2,1,versicolor +5.0,2.3,3.3,1.0,1,versicolor +5.6,2.7,4.2,1.3,1,versicolor +5.7,3.0,4.2,1.2,1,versicolor +5.7,2.9,4.2,1.3,1,versicolor +6.2,2.9,4.3,1.3,1,versicolor +5.1,2.5,3.0,1.1,1,versicolor +5.7,2.8,4.1,1.3,1,versicolor +6.3,3.3,6.0,2.5,2,virginica +5.8,2.7,5.1,1.9,2,virginica +7.1,3.0,5.9,2.1,2,virginica +6.3,2.9,5.6,1.8,2,virginica +6.5,3.0,5.8,2.2,2,virginica +7.6,3.0,6.6,2.1,2,virginica +4.9,2.5,4.5,1.7,2,virginica +7.3,2.9,6.3,1.8,2,virginica +6.7,2.5,5.8,1.8,2,virginica +7.2,3.6,6.1,2.5,2,virginica +6.5,3.2,5.1,2.0,2,virginica +6.4,2.7,5.3,1.9,2,virginica +6.8,3.0,5.5,2.1,2,virginica +5.7,2.5,5.0,2.0,2,virginica +5.8,2.8,5.1,2.4,2,virginica +6.4,3.2,5.3,2.3,2,virginica +6.5,3.0,5.5,1.8,2,virginica +7.7,3.8,6.7,2.2,2,virginica +7.7,2.6,6.9,2.3,2,virginica +6.0,2.2,5.0,1.5,2,virginica +6.9,3.2,5.7,2.3,2,virginica +5.6,2.8,4.9,2.0,2,virginica +7.7,2.8,6.7,2.0,2,virginica +6.3,2.7,4.9,1.8,2,virginica +6.7,3.3,5.7,2.1,2,virginica +7.2,3.2,6.0,1.8,2,virginica +6.2,2.8,4.8,1.8,2,virginica +6.1,3.0,4.9,1.8,2,virginica +6.4,2.8,5.6,2.1,2,virginica +7.2,3.0,5.8,1.6,2,virginica +7.4,2.8,6.1,1.9,2,virginica +7.9,3.8,6.4,2.0,2,virginica +6.4,2.8,5.6,2.2,2,virginica +6.3,2.8,5.1,1.5,2,virginica +6.1,2.6,5.6,1.4,2,virginica +7.7,3.0,6.1,2.3,2,virginica +6.3,3.4,5.6,2.4,2,virginica +6.4,3.1,5.5,1.8,2,virginica +6.0,3.0,4.8,1.8,2,virginica +6.9,3.1,5.4,2.1,2,virginica +6.7,3.1,5.6,2.4,2,virginica +6.9,3.1,5.1,2.3,2,virginica +5.8,2.7,5.1,1.9,2,virginica +6.8,3.2,5.9,2.3,2,virginica +6.7,3.3,5.7,2.5,2,virginica +6.7,3.0,5.2,2.3,2,virginica +6.3,2.5,5.0,1.9,2,virginica +6.5,3.0,5.2,2.0,2,virginica +6.2,3.4,5.4,2.3,2,virginica +5.9,3.0,5.1,1.8,2,virginica diff --git a/main.ipynb b/main.ipynb new file mode 100644 index 0000000..8de25b8 --- /dev/null +++ b/main.ipynb @@ -0,0 +1,591 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "d902b7ee", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sl sw pl pw target tNames\n", + "0 5.1 3.5 1.4 0.2 0 setosa\n", + "1 4.9 3.0 1.4 0.2 0 setosa\n", + "2 4.7 3.2 1.3 0.2 0 setosa\n", + "3 4.6 3.1 1.5 0.2 0 setosa\n", + "4 5.0 3.6 1.4 0.2 0 setosa\n" + ] + } + ], + "source": [ + "import numpy as np \n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "df = pd.read_csv(\"iris_basic.csv\")\n", + "print(df.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "6f0d1e44", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.2],\n", + " [0.2],\n", + " [0.2],\n", + " [0.2],\n", + " [0.2],\n", + " [0.4],\n", + " [0.3],\n", + " [0.2],\n", + " [0.2],\n", + " [0.1],\n", + " [0.2],\n", + " [0.2],\n", + " [0.1],\n", + " [0.1],\n", + " [0.2],\n", + " [0.4],\n", + " [0.4],\n", + " [0.3],\n", + " [0.3],\n", + " [0.3],\n", + " [0.2],\n", + " [0.4],\n", + " [0.2],\n", + " [0.5],\n", + " [0.2],\n", + " [0.2],\n", + " [0.4],\n", + " [0.2],\n", + " [0.2],\n", + " [0.2],\n", + " [0.2],\n", + " [0.4],\n", + " [0.1],\n", + " [0.2],\n", + " [0.2],\n", + " [0.2],\n", + " [0.2],\n", + " [0.1],\n", + " [0.2],\n", + " [0.2],\n", + " [0.3],\n", + " [0.3],\n", + " [0.2],\n", + " [0.6],\n", + " [0.4],\n", + " [0.3],\n", + " [0.2],\n", + " [0.2],\n", + " [0.2],\n", + " [0.2],\n", + " [1.4],\n", + " [1.5],\n", + " [1.5],\n", + " [1.3],\n", + " [1.5],\n", + " [1.3],\n", + " [1.6],\n", + " [1. ],\n", + " [1.3],\n", + " [1.4],\n", + " [1. ],\n", + " [1.5],\n", + " [1. ],\n", + " [1.4],\n", + " [1.3],\n", + " [1.4],\n", + " [1.5],\n", + " [1. ],\n", + " [1.5],\n", + " [1.1],\n", + " [1.8],\n", + " [1.3],\n", + " [1.5],\n", + " [1.2],\n", + " [1.3],\n", + " [1.4],\n", + " [1.4],\n", + " [1.7],\n", + " [1.5],\n", + " [1. ],\n", + " [1.1],\n", + " [1. ],\n", + " [1.2],\n", + " [1.6],\n", + " [1.5],\n", + " [1.6],\n", + " [1.5],\n", + " [1.3],\n", + " [1.3],\n", + " [1.3],\n", + " [1.2],\n", + " [1.4],\n", + " [1.2],\n", + " [1. ],\n", + " [1.3],\n", + " [1.2],\n", + " [1.3],\n", + " [1.3],\n", + " [1.1],\n", + " [1.3],\n", + " [2.5],\n", + " [1.9],\n", + " [2.1],\n", + " [1.8],\n", + " [2.2],\n", + " [2.1],\n", + " [1.7],\n", + " [1.8],\n", + " [1.8],\n", + " [2.5],\n", + " [2. ],\n", + " [1.9],\n", + " [2.1],\n", + " [2. ],\n", + " [2.4],\n", + " [2.3],\n", + " [1.8],\n", + " [2.2],\n", + " [2.3],\n", + " [1.5],\n", + " [2.3],\n", + " [2. ],\n", + " [2. ],\n", + " [1.8],\n", + " [2.1],\n", + " [1.8],\n", + " [1.8],\n", + " [1.8],\n", + " [2.1],\n", + " [1.6],\n", + " [1.9],\n", + " [2. ],\n", + " [2.2],\n", + " [1.5],\n", + " [1.4],\n", + " [2.3],\n", + " [2.4],\n", + " [1.8],\n", + " [1.8],\n", + " [2.1],\n", + " [2.4],\n", + " [2.3],\n", + " [1.9],\n", + " [2.3],\n", + " [2.5],\n", + " [2.3],\n", + " [1.9],\n", + " [2. ],\n", + " [2.3],\n", + " [1.8]])" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = df[\"pw\"].to_numpy().reshape(-1, 1) # (150,1)\n", + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "99fdd860", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [1.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.],\n", + " [0.]])" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y = df[\"target\"].to_numpy().reshape(-1, 1) # (150,1)\n", + "y = (y == 0).astype(float) \n", + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "b2a5f684", + "metadata": {}, + "outputs": [], + "source": [ + "def sigmoid(z):\n", + " z = np.clip(z, -500, 500)\n", + " sig = 1.0 / (1.0 + np.exp(-z))\n", + " return sig" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "c8d77fc1", + "metadata": {}, + "outputs": [], + "source": [ + "def log_loss(y, p, eps=1e-12):\n", + " p = np.clip(p, eps, 1 - eps)\n", + " return -np.mean(y*np.log(p) + (1-y)*np.log(1-p))" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "46b15c87", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.],\n", + " [0.]])" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lr=0.1\n", + "epochs=2000 \n", + "l2=0.0,\n", + "X = np.column_stack([x, np.ones_like(x)])\n", + "m = X.shape[0]\n", + "theta = np.zeros((2,1))\n", + "theta" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "7e27284a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1,\n", + " 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2,\n", + " 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2,\n", + " 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2, 1.4, 1.5,\n", + " 1.5, 1.3, 1.5, 1.3, 1.6, 1. , 1.3, 1.4, 1. , 1.5, 1. , 1.4, 1.3,\n", + " 1.4, 1.5, 1. , 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7,\n", + " 1.5, 1. , 1.1, 1. , 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2,\n", + " 1.4, 1.2, 1. , 1.3, 1.2, 1.3, 1.3, 1.1, 1.3, 2.5, 1.9, 2.1, 1.8,\n", + " 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2. , 1.9, 2.1, 2. , 2.4, 2.3, 1.8,\n", + " 2.2, 2.3, 1.5, 2.3, 2. , 2. , 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6,\n", + " 1.9, 2. , 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 1.9,\n", + " 2.3, 2.5, 2.3, 1.9, 2. , 2.3, 1.8],\n", + " [1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. ,\n", + " 1. , 1. , 1. , 1. , 1. , 1. , 1. ]])" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.T" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "f2a9c597", + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(epochs):\n", + " z = X @ theta # (m,1)\n", + " h = sigmoid(z) # (m,1)\n", + " grad = (X.T @ (h - y)) / m # (2,1) <-- from your formula\n", + " theta -= lr * grad\n", + "\n", + " #if (i % 0 == 0 or t == epochs-1):\n", + " # print(f\"{i:4d} loss={log_loss(y, h):.6f} w={theta[0,0]:.6f} b={theta[1,0]:.6f}\")\n", + "\n", + "w, b = theta[0,0], theta[1,0]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "a15c9276", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_proba(x, w, b):\n", + " x = np.asarray(x, float).reshape(-1)\n", + " return sigmoid(w*x + b)\n", + "\n", + "def predict(x, w, b, thresh=0.5):\n", + " return (predict_proba(x, w, b) >= thresh).astype(int)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "859cdc10", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Learned: w=-5.989, b=4.279, loss=0.1812\n" + ] + } + ], + "source": [ + "rng = np.random.default_rng(0)\n", + "m = 120\n", + "xNew = np.linspace(-0.5, 2.5, m)\n", + "p = predict_proba(xNew, w, b)\n", + "print(f\"\\nLearned: w={w:.3f}, b={b:.3f}, loss={log_loss(p.reshape(-1,1), p.reshape(-1,1)):.4f}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "d9217b20", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "yJitter = y +np.random.uniform(-0.2, 0.2, size=y.shape)\n", + "plt.plot(x, yJitter, 'ok', alpha=0.1)\n", + "plt.plot(xNew,p)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e678bbaa", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv (3.14.2)", + "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.14.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/main_files/main_10_1.png b/main_files/main_10_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf61c11c8d50bbe572658bb349e76141dd9272c GIT binary patch literal 23819 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 Qmz>~{^3#W9ie`cT0tj6_3jhEB literal 0 HcmV?d00001