{ "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 }