{ "cells": [ { "cell_type": "markdown", "id": "d2bfa2a8-f2e1-45cc-9b2c-55f4b4dd629e", "metadata": {}, "source": [ "# Practical-4 (Gradient Descent Algorithm)\n", "\n", "---\n", "\n", "Problem Statement: Implement Gradient Descent Algorithm to find the local minima of a function. For example, find the local minima of the function y=(x+3)² starting from the point x=2.\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": 29, "id": "9db74da2-118e-41a1-a5b1-2e4f4b81f59c", "metadata": {}, "outputs": [], "source": [ "# ---------------------------------------------------------------\n", "# STEPS\n", "# ---------------------------------------------------------------\n", "# 1. Define the function and its derivative\n", "# 2. Initialize parameters for Gradient Descent\n", "# 3. Gradient Descent Loop\n", "# 4. Plotting" ] }, { "cell_type": "code", "execution_count": 30, "id": "07488872-be4f-4282-a233-d354c5593577", "metadata": {}, "outputs": [], "source": [ "# ---------------------------------------------------------------\n", "# Import libraries\n", "# ---------------------------------------------------------------\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 31, "id": "fe450fa4-9b08-4f83-9b6d-5e01b323cb08", "metadata": {}, "outputs": [], "source": [ "# ---------------------------------------------------------------\n", "# 1. Define the function and its derivative\n", "# ---------------------------------------------------------------\n", "def f(x):\n", " return (x + 3)**2\n", "\n", "def grad_f(x):\n", " return 2 * (x + 3) # derivative of f(x)" ] }, { "cell_type": "code", "execution_count": 32, "id": "1f64d341-6cf8-4395-accc-26d3b807cc79", "metadata": {}, "outputs": [], "source": [ "# ---------------------------------------------------------------\n", "# 2. Initialize parameters for Gradient Descent\n", "# ---------------------------------------------------------------\n", "x_current = 2 # starting point\n", "learning_rate = 0.1 # step size\n", "tolerance = 1e-6 # convergence tolerance\n", "max_iterations = 25 # maximum iterations\n", "history = [x_current] # sotring history" ] }, { "cell_type": "code", "execution_count": 33, "id": "bd39c7ad-adcf-453b-aa88-6d6bed74e7d8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration 1: x = 1.0000, f(x) = 16.0000\n", "Iteration 2: x = 0.2000, f(x) = 10.2400\n", "Iteration 3: x = -0.4400, f(x) = 6.5536\n", "Iteration 4: x = -0.9520, f(x) = 4.1943\n", "Iteration 5: x = -1.3616, f(x) = 2.6844\n", "Iteration 6: x = -1.6893, f(x) = 1.7180\n", "Iteration 7: x = -1.9514, f(x) = 1.0995\n", "Iteration 8: x = -2.1611, f(x) = 0.7037\n", "Iteration 9: x = -2.3289, f(x) = 0.4504\n", "Iteration 10: x = -2.4631, f(x) = 0.2882\n", "Iteration 11: x = -2.5705, f(x) = 0.1845\n", "Iteration 12: x = -2.6564, f(x) = 0.1181\n", "Iteration 13: x = -2.7251, f(x) = 0.0756\n", "Iteration 14: x = -2.7801, f(x) = 0.0484\n", "Iteration 15: x = -2.8241, f(x) = 0.0309\n", "Iteration 16: x = -2.8593, f(x) = 0.0198\n", "Iteration 17: x = -2.8874, f(x) = 0.0127\n", "Iteration 18: x = -2.9099, f(x) = 0.0081\n", "Iteration 19: x = -2.9279, f(x) = 0.0052\n", "Iteration 20: x = -2.9424, f(x) = 0.0033\n", "Iteration 21: x = -2.9539, f(x) = 0.0021\n", "Iteration 22: x = -2.9631, f(x) = 0.0014\n", "Iteration 23: x = -2.9705, f(x) = 0.0009\n", "Iteration 24: x = -2.9764, f(x) = 0.0006\n", "Iteration 25: x = -2.9811, f(x) = 0.0004\n" ] } ], "source": [ "# ---------------------------------------------------------------\n", "# 3. Gradient Descent Loop\n", "# ---------------------------------------------------------------\n", "for i in range(max_iterations):\n", " gradient = grad_f(x_current)\n", " x_next = x_current - learning_rate * gradient # update step\n", " \n", " # Check convergence\n", " if abs(x_next - x_current) < tolerance:\n", " print(f\"Converged after {i+1} iterations.\")\n", " break\n", " \n", " x_current = x_next\n", " history.append(x_current)\n", " print(f\"Iteration {i+1}: x = {x_current:.4f}, f(x) = {f(x_current):.4f}\")" ] }, { "cell_type": "code", "execution_count": 34, "id": "5a75b310-faab-4111-b356-8be8ad3345de", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Local minima at x = -2.981110534068521\n", "Function value at local minima y = 0.00035681192317650156\n" ] } ], "source": [ "# ---------------------------------------------------------------\n", "# 4. Print the result\n", "# ---------------------------------------------------------------\n", "print(\"Local minima at x =\", x_current)\n", "print(\"Function value at local minima y =\", f(x_current))" ] }, { "cell_type": "code", "execution_count": 35, "id": "67a290aa-314c-4424-aca4-801f1a9ec00e", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# ---------------------------------------------------------------\n", "# 5. Plotting\n", "# ---------------------------------------------------------------\n", "plt.plot(history, [f(val) for val in history], marker='o')\n", "plt.xlabel(\"x values\")\n", "plt.ylabel(\"f(x)\")\n", "plt.title(\"Gradient Descent Convergence\")\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "38165f38-e9c8-4c83-9d26-f9a002a4d703", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.20" } }, "nbformat": 4, "nbformat_minor": 5 }