{ "cells": [ { "cell_type": "code", "execution_count": 28, "id": "b701ea33-a839-438a-a968-fb69ebf0e192", "metadata": {}, "outputs": [], "source": [ "import torch\n", "import torch.nn as nn\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.datasets import make_regression" ] }, { "cell_type": "code", "execution_count": 60, "id": "479e0638-c9fe-47a6-ade7-d285a62b2353", "metadata": {}, "outputs": [], "source": [ "input_size = 1\n", "output_size = 1\n", "num_epochs = 200\n", "learning_rate = 0.01" ] }, { "cell_type": "code", "execution_count": 61, "id": "0edca26c-1847-4dd8-816e-39fc51b1ed3c", "metadata": {}, "outputs": [], "source": [ "#toy dataset\n", "x_train, y_train = make_regression(n_samples=15, n_features=1, noise=50.0)\n", "x_train = x_train.astype(np.float32)\n", "y_train = y_train.reshape(-1, 1).astype(np.float32)" ] }, { "cell_type": "code", "execution_count": 62, "id": "8bd9d6fa-c6ba-400e-bf6d-86285aa9a079", "metadata": {}, "outputs": [], "source": [ "device = torch.device('mps' if torch.backends.mps.is_available() else 'cpu')\n", "model = nn.Linear(input_size, output_size).to(device)" ] }, { "cell_type": "code", "execution_count": 63, "id": "a83fec2b-6ed2-4dea-a4de-473e7ae4d8ff", "metadata": {}, "outputs": [], "source": [ "criterion = nn.MSELoss()\n", "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) " ] }, { "cell_type": "code", "execution_count": 64, "id": "3eeef939-c192-4e5e-80d7-419adc75371c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch [50/200], Loss: 4204.9902\n", "Epoch [100/200], Loss: 3693.1199\n", "Epoch [150/200], Loss: 3608.7058\n", "Epoch [200/200], Loss: 3593.9524\n" ] } ], "source": [ "#train loop\n", "model.train()\n", "for epoch in range(num_epochs):\n", " # Convert numpy arrays to torch tensors\n", " inputs = torch.from_numpy(x_train).to(device)\n", " targets = torch.from_numpy(y_train).to(device)\n", "\n", " # Forward pass\n", " outputs = model(inputs)\n", " loss = criterion(outputs, targets)\n", " \n", " # Backward and optimize\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", " \n", " if (epoch+1) % 50 == 0:\n", " print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))" ] }, { "cell_type": "code", "execution_count": 66, "id": "e9af254e-a0e0-4882-874a-ff7dd6868eba", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot\n", "model.eval()\n", "x_tensor = torch.from_numpy(x_train).to(device)\n", "predicted = model(x_tensor).detach().cpu().numpy()\n", "\n", "# Plot the original data points and the fitted line\n", "plt.plot(x_train, y_train, 'ro', label='Original data')\n", "plt.plot(x_train, predicted, label='Fitted line')\n", "\n", "# Draw a short vertical line from each point to the predicted line\n", "for x, y_actual, y_pred in zip(x_train, y_train, predicted):\n", " plt.plot([x, x], [y_actual, y_pred], 'k-', linewidth=0.5) # thin black line\n", "\n", "plt.legend()\n", "plt.show()" ] } ], "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.12.9" } }, "nbformat": 4, "nbformat_minor": 5 }