{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Linear Regression Implementation from Scratch" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In previous sections, we have gained some understanding of linear regression, gradient descent, evaluation metrics, and the role of the loss function in this regression technique. In summary, linear regression utilizes gradient descent to optimize the model's parameters by minimizing the loss function. This enables it to establish a linear relationship between the input features and the target variable, making it a powerful algorithm for predicting continuous values." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Linear regression is a widely used method in data analysis to describe the relationship between independent variables and a dependent variable using a linear equation. It aims to minimize the error between predicted and actual values by finding the best-fit line or surface. Linear regression can be used for predicting trends, exploring relationships, and identifying patterns in the data." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "This chapter will apply the previously learnt knowledge to implement a linear regression model from scratch. The chapter includes steps for data preparation, model development, and model evaluation, and ultimately summarises the process of developing and evaluating linear regression models." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In Python, we can use libraries like NumPy and Pandas for data handling and analysis. We will also use the Matplotlib library for visualizing data and model performance. Here's a simple Python code snippet to demonstrate how a linear regression model works:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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NTE/p6amJup6SZo4cWLk+oaGBjU1NUVdEwwGNXbs2LhfM5OSmWNnR48e1SeffKK+fftGPb5p0yaddtppGjJkiObMmaPm5ua0jj1Ryc7x8OHDGjRokEpLSzVt2jS98cYbkY+Z9jpK6Xkt77//fk2fPl19+vSJetyU1zIZPf1MpuN5M017e7sOHTrU5Wdy9+7dKikp0VlnnaWZM2fq3XffdWiEqRk5cqSKi4s1YcIEvfTSS5HHvfha3n///aqsrNSgQYOiHjf5tWxpaZGkLt9/x8v2vdLXwczf/vY3tbW1acCAAVGPDxgwoMsebVhTU1O314f/a+drZlIyc+zs5ptvVklJSdQ33aRJk/Sf//mfev7557VkyRJt3rxZkydPVltbW1rHn4hk5jhkyBA98MADWrt2rVauXKn29nZdeOGFeu+99ySZ9zpKqb+W27ZtU11dna6//vqox016LZMR72cyFArpo48+SsvPgGl+9atf6fDhw7rqqqsij40dO1YPPvigqqurtWzZMjU0NOjLX/6yDh065OBI7SkuLtY999yjxx9/XI8//rhKS0v11a9+VTt27JCUnt9nJtm/f7+effbZLj+TJr+W7e3tmjdvni666CINGzYs7nXZvld6/tRspGbx4sVavXq1Nm3aFJUgO3369Mj/n3feeRo+fLgGDx6sTZs26dJLL3ViqLZUVFSooqIi8v6FF16oc889V/fee69uv/12B0eWOffff7/OO+88jRkzJupxt7+WfvPII4+oqqpKa9eujcolmTx5cuT/hw8frrFjx2rQoEF69NFHdd111zkxVNuGDBmiIUOGRN6/8MILVV9frzvvvFMPP/ywgyPLjIceekgnn3yyrrjiiqjHTX4t586dq7q6OsfzsTrz9crMqaeeqtzcXL3//vtRj7///vsqKiqK+TlFRUXdXh/+r52vmUnJzDHsV7/6lRYvXqw//vGPGj58eLfXnnXWWTr11FO1Z8+elMdsVypzDDvhhBM0atSoyPhNex2l1OZ55MgRrV69OqFfhE6+lsmI9zNZWFioE088MS3fH6ZYvXq1rr/+ej366KNdlvA7O/nkk/WFL3zBNa9jPGPGjInMwUuvpWVZeuCBB3TNNdeod+/e3V5rymv5/e9/X//93/+tF154Qaeffnq312b7XunrYKZ379764he/qOeffz7yWHt7u55//vmov9qPV1FREXW9JK1fvz5yfVlZmYqKiqKuCYVC+tOf/hT3a2ZSMnOUOrLMb7/9dlVXV+v888/v8d9577331NzcrOLi4rSM245k53i8trY27dy5MzJ+015HKbV5PvbYY2ptbdWsWbN6/HecfC2T0dPPZDq+P0ywatUqfetb39KqVauiSuvjOXz4sOrr613zOsZTW1sbmYNXXkupo0Joz549Cf2B4fRraVmWvv/972vNmjXauHGjysrKevycrN8rbacMe8zq1autvLw868EHH7R27dplfec737FOPvlkq6mpybIsy7rmmmusW265JXL9Sy+9ZPXq1cv61a9+Zb355pvWwoULrRNOOMHauXNn5JrFixdbJ598srV27Vrrf//3f61p06ZZZWVl1kcffZT1+VmW/TkuXrzY6t27t/WHP/zBamxsjLwdOnTIsizLOnTokHXTTTdZNTU1VkNDg7VhwwZr9OjR1tlnn20dO3bMFXOsqqqynnvuOau+vt569dVXrenTp1v5+fnWG2+8EbnGtNfRsuzPM2zcuHHW1Vdf3eVxE1/LQ4cOWa+99pr12muvWZKsX//619Zrr71mvfPOO5ZlWdYtt9xiXXPNNZHr//rXv1onnXSS9aMf/ch68803raVLl1q5ublWdXV15JqenrdsszvH3//+91avXr2spUuXRv1Mfvjhh5FrfvjDH1qbNm2yGhoarJdeesmqrKy0Tj31VOvAgQNZn1+Y3Xneeeed1pNPPmnt3r3b2rlzp3XjjTdaOTk51oYNGyLXuP21DJs1a5Y1duzYmF/TtNdyzpw5VjAYtDZt2hT1/Xf06NHINU7fK30fzFiWZf32t7+1zjjjDKt3797WmDFjrK1bt0Y+dvHFF1uzZ8+Ouv7RRx+1vvCFL1i9e/e2hg4daj399NNRH29vb7duvfVWa8CAAVZeXp516aWXWm+99VY2phKXnTkOGjTIktTlbeHChZZlWdbRo0etyy67zOrfv791wgknWIMGDbJuuOEGx36ZhNmZ47x58yLXDhgwwLr88sutHTt2RH09E19Hy7L//frnP//ZkmT98Y9/7PK1THwtw+W5nd/C85o9e7Z18cUXd/mckSNHWr1797bOOussa8WKFV2+bnfPW7bZnePFF1/c7fWW1VGOXlxcbPXu3dsaOHCgdfXVV1t79uzJ7sQ6sTvPJUuWWIMHD7by8/Otvn37Wl/96letjRs3dvm6bn4tLaujBPnEE0+07rvvvphf07TXMtb8JEX9nDl9rwx8NlAAAABX8nXODAAAcD+CGQAA4GoEMwAAwNUIZgAAgKsRzAAAAFcjmAEAAK5GMAMAAFyNYAYAALgawQwAAHA1ghkArtLW1qYLL7xQX/va16Ieb2lpUWlpqf7t3/7NoZEBcArHGQBwnb/85S8aOXKkli9frpkzZ0qSvvnNb+r111/X9u3b1bt3b4dHCCCbCGYAuNLdd9+t2267TW+88Ya2bdumK6+8Utu3b9eIESOcHhqALCOYAeBKlmXpkksuUW5urnbu3Kl//ud/1k9+8hOnhwXAAQQzAFzrz3/+s84991ydd9552rFjh3r16uX0kAA4gARgAK71wAMP6KSTTlJDQ4Pee+89p4cDwCGszABwpZdfflkXX3yx/vjHP+qOO+6QJG3YsEGBQMDhkQHINlZmALjO0aNHde2112rOnDkaP3687r//fm3btk333HOP00MD4ABWZgC4zo033qhnnnlGr7/+uk466SRJ0r333qubbrpJO3fu1JlnnunsAAFkFcEMAFfZvHmzLr30Um3atEnjxo2L+tjEiRP16aefst0E+AzBDAAAcDVyZgAAgKsRzAAAAFcjmAEAAK5GMAMAAFyNYAYAALgawQwAAHA1ghkAAOBqBDMAAMDVCGYAAICrEcwAAABXI5gBAACu9v9vMnkRjAoSFwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "# Generate some random data\n", "np.random.seed(42)\n", "X = 2 * np.random.rand(100, 1)\n", "y = 4 + 3 * X + np.random.randn(100, 1)\n", "\n", "# Create a DataFrame from the data\n", "data = pd.DataFrame(np.concatenate([X, y], axis=1), columns=['X', 'y'])\n", "\n", "# Create the 'Temp' directory if it doesn't exist\n", "if not os.path.exists('./tmp'):\n", " os.makedirs('./tmp')\n", "\n", "# Save the data to a CSV file in the 'Temp' directory\n", "data.to_csv('./tmp/data.csv', index=False)\n", "\n", "# Plot the data\n", "plt.scatter(X, y)\n", "plt.xlabel('X')\n", "plt.ylabel('y')\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Data Preparation\n", "Before we can start developing the linear regression model, it is important to prepare the data appropriately. This involves importing the necessary libraries, loading the dataset, performing exploratory data analysis, and cleaning and preprocessing the data.\n", "\n", "Let's take a look at the code snippet below to understand how we can perform these steps:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " X y\n", "0 0.749080 6.334288\n", "1 1.901429 9.405278\n", "2 1.463988 8.483724\n", "3 1.197317 5.604382\n", "4 0.312037 4.716440\n" ] }, { "data": { "image/png": "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xsbi66+/bnFkplevXu7/t23bFiaTyb1/kTdt2rRBenq6++vk5GR3+9raWpw4cQJZWVnu+yMiInDttdc224fk5GSUlJSgrKwMDz30EC5cuICCggLk5+fD4XDg7NmzqKysxMSJExEbG+u+zZ8/H5WVlc0+NxGR5IwRzuXXAJoGNBe/zl/IejMS01ydmejoaERHR4f8+yTGxUjaTkpt27b1+HrGjBnYtGkTnnrqKXTu3BmtW7fGXXfdhV9++aXZ54mMjPT42mAweIyI+NNeEKSZZuvRowd69OiBBx54AH/4wx8waNAg7NixA5mZmQCcK54GDBjg8Rjur0REssgcDoxa5aPOzELWmQkBzQUz4ZKVloBkcwyO19Z7zZsxALCYY5CVJv+UxqeffooJEya4E63r6urw/fffh7UPZrMZSUlJ2LNnD2644QYAzo0+9+7diz59+oh6LlcAc/bsWSQlJcFqteLgwYMYO3as1/ZRUVHu70dEFBaZw4GMoawAHCayBjN1dXU4cOCA++uqqirs378fCQkJuOqqq3Dq1CkcPnwYx445I1vXEmTX6h05RRgNKByWicmr98IAz4oCroHFwmGZiDDKv99Ply5d8O6772LYsGEwGAx49NFHmx1hCZU//vGPWLBgATp37oyMjAw899xz+Omnn5rdE2ny5MmwWq24+eabceWVV6K6uhrz589Hhw4dkJ2dDcCZqDx16lSYzWbk5+ejoaEBn3/+OX766SdMnz4diYmJaN26NYqLi3HllVciJiYmLPVxiEjnjBFcfh0msubMfP755+jbty/69u0LAJg+fTr69u2LOXPmAHAuy+3bty+GDh0KALjnnnvQt29fvPjii7L1+XL5PZKxdFw/WMyeU0kWcwyWjusXkjozgXjmmWfQrl075OTkYNiwYcjLy0O/fv3C3o+ZM2dizJgxGD9+PLKzsxEbG4u8vDzExPieisvNzcXu3btx991345prrsGvf/1rxMTEYMuWLWjfvj0A4L777sMrr7yC5cuXo2fPnhg8eDBWrFjhXpLdqlUrLFmyBC+99BKsVitGjBgRlvMlIqLwMAhSJTUolM1mg9lsRm1tLUwmk8d99fX1qKqqQlpaWrMX1JbYHQJKq06h5kw9EuOcU0tKGJFROofDgW7dumHUqFGYN2+e3N2R7PNARETBa+763RhzZiQQYTQgO7293N1Q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REREqsZghoiIiFSNwQwRqYrdbkdOTg7uvPNOj+O1tbVISUnB//t//0+mnhGRXLidARGpzn/+8x/06dMHy5Ytw9ixYwEA48ePx5dffok9e/YgKipK5h4SUTgxmCEiVVqyZAnmzp2Lr776CqWlpbj77ruxZ88e9O7dW+6uEVGYMZghIlUSBAE333wzIiIiUFZWhj/+8Y/461//Kne3iEgGDGaISLW++eYbdOvWDT179sTevXvRqlUrubtERDJgAjARqdZrr72GNm3aoKqqCj/88IPc3SEimXBkhohUadeuXRg8eDA+/vhjzJ8/HwCwefNmGAwGmXtGROHGkRkiUp1z585hwoQJmDx5Mm666Sa8+uqrKC0txYsvvih314hIBhyZISLVeeihh/Dhhx/iyy+/RJs2bQAAL730EmbMmIGysjJ06tRJ3g4SUVgxmCEiVdmxYwduueUWbN++HQMHDvS4Ly8vDxcuXOB0E5HOMJghIiIiVWPODBEREakagxkiIiJSNQYzREREpGoMZoiIiEjVGMwQERGRqjGYISIiIlVjMENERESqxmCGiIiIVI3BDBEREakagxkiIiJSNQYzREREpGr/H5TpXZCW6PvSAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Training set size: (80, 1) (80,)\n", "Testing set size: (20, 1) (20,)\n" ] } ], "source": [ "# Import the necessary libraries\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.model_selection import train_test_split\n", "\n", "# Load the dataset\n", "data = pd.read_csv('./Temp/data.csv')\n", "\n", "# Perform exploratory data analysis\n", "# Display the first few rows of the data\n", "print(data.head())\n", "\n", "# Split the dataset into training and testing sets\n", "X = data[['X']]\n", "y = data['y']\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", "\n", "# Visualize the relationship between features and target variable\n", "plt.scatter(X_train, y_train, label='Training Set')\n", "plt.scatter(X_test, y_test, label='Testing Set')\n", "plt.xlabel('X')\n", "plt.ylabel('y')\n", "plt.legend()\n", "plt.show()\n", "\n", "# Print the sizes of training and testing sets\n", "print(\"Training set size:\", X_train.shape, y_train.shape)\n", "print(\"Testing set size:\", X_test.shape, y_test.shape)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Model Development\n", "Once we have prepared the data, we can proceed with developing the linear regression model. This involves deriving the mathematical formula for linear regression, implementing the formula in code, defining a cost function, and implementing the gradient descent algorithm to train the model.\n", "\n", "Let's take a look at the code snippet below to understand how we can develop the linear regression model:" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Define loss function\n", "\n", " Calculate the loss between the true target variable and the predicted target variable.\n", "\n", " Parameters:\n", " - y_true: The true target variable (numpy array or pandas Series)\n", " - y_pred: The predicted target variable (numpy array or pandas Series)\n", "\n", " Returns:\n", " - loss: The calculated loss (float)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "# Define the loss function\n", "def loss_function(y_true, y_pred):\n", " # Calculate the mean squared error\n", " mse = np.mean((y_true - y_pred) ** 2)\n", " return mse" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Use gradient descent to train the model\n", "\n", "The `gradient_descent` function is responsible for performing gradient descent to optimize the coefficients of the linear regression model. Here is a breakdown of the steps involved:\n", "\n", "1. Scale the data: The input features (`X_train` and `X_test`) are scaled using the `StandardScaler` from scikit-learn. This ensures that all features have a similar scale, which can improve the performance of the gradient descent algorithm.\n", "\n", "2. Add a bias term: A column of ones is added to the input features (`X_train`) to account for the bias term in the linear regression model.\n", "\n", "3. Initialize coefficients: The coefficients are initialized with zeros. The number of coefficients is equal to the number of features plus one (including the bias term).\n", "\n", "4. Perform gradient descent: The function iterates over a specified number of iterations. In each iteration, the following steps are performed:\n", " - Compute the predictions (`y_pred`) by multiplying the input features (`X_train_with_bias`) with the coefficients.\n", " - Compute the gradients by taking the dot product of the transposed input features (`X_train_with_bias.T`) and the difference between the predictions and the true target variable (`y_train`).\n", " - Update the coefficients by subtracting the learning rate multiplied by the gradients.\n", " - Compute the loss by calculating the mean squared error between the true target variable (`y_train`) and the predictions (`y_pred`).\n", "\n", "5. Make predictions on the test set: The function applies the same preprocessing steps to the test set (`X_test`) and computes the predictions (`y_pred_test`) using the updated coefficients.\n", "\n", "This function is a key component in training the linear regression model from scratch. It allows us to iteratively update the coefficients based on the gradients, gradually improving the model's performance." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "# Define the gradient descent function\n", "def gradient_descent(X_train, y_train, X_test, y_test, learning_rate, num_iterations):\n", " # Scale the data\n", " scaler = StandardScaler()\n", " X_train_scaled = scaler.fit_transform(X_train.values.reshape(-1, 1))\n", " X_test_scaled = scaler.transform(X_test.values.reshape(-1, 1))\n", "\n", " # Add a column of ones to X for the bias term\n", " X_train_with_bias = np.c_[np.ones((X_train_scaled.shape[0], 1)), X_train_scaled]\n", "\n", " # Initialize the coefficients with zeros\n", " coefficients = np.zeros((X_train_with_bias.shape[1], 1))\n", "\n", " # Perform gradient descent\n", " for i in range(num_iterations):\n", " # Compute the predictions\n", " y_pred = X_train_with_bias.dot(coefficients)\n", "\n", " # Compute the gradients\n", " gradients = 2 * X_train_with_bias.T.dot(y_pred - y_train.values.reshape(-1, 1)) \n", "\n", " # Update the coefficients\n", " coefficients -= learning_rate * gradients\n", "\n", " # Compute the loss\n", " loss = np.mean((y_train.values.reshape(-1, 1) - y_pred) ** 2)\n", " print(\"Iteration:\", i+1, \"Loss:\", loss)\n", "\n", " # Make predictions on the test set\n", " X_test_with_bias = np.c_[np.ones((X_test_scaled.shape[0], 1)), X_test_scaled]\n", " y_pred_test = X_test_with_bias.dot(coefficients)\n", "\n", " return coefficients, y_pred_test" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Next, we train the linear regression model and make predictions on the test set. \n", "\n", "First, we import the required library and set the learning rate and number of iterations for gradient descent. We then call the gradient descent function and pass in the training and test data, the learning rate, and the number of iterations. The function returns the optimised coefficients and predictions for the test set. Finally, we store the returned results in the variables coefficients and ypred test. \n", "\n", "By running this code, we can train a linear regression model using gradient descent and get the prediction results on the test set to further analyse and evaluate the performance of the model." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration: 1 Loss: 49.252973836909085\n", "Iteration: 2 Loss: 18.27358504939668\n", "Iteration: 3 Loss: 7.121005085892223\n", "Iteration: 4 Loss: 3.1060762990306165\n", "Iteration: 5 Loss: 1.6607019357604422\n", "Iteration: 6 Loss: 1.1403671649831801\n", "Iteration: 7 Loss: 0.9530466475033655\n", "Iteration: 8 Loss: 0.8856112612106326\n", "Iteration: 9 Loss: 0.8613345221452491\n", "Iteration: 10 Loss: 0.8525948960817107\n", "Iteration: 11 Loss: 0.8494486306988371\n", "Iteration: 12 Loss: 0.8483159751610024\n", "Iteration: 13 Loss: 0.8479082191673818\n", "Iteration: 14 Loss: 0.8477614270096787\n", "Iteration: 15 Loss: 0.8477085818329055\n", "Iteration: 16 Loss: 0.8476895575692671\n", "Iteration: 17 Loss: 0.8476827088343573\n", "Iteration: 18 Loss: 0.8476802432897899\n", "Iteration: 19 Loss: 0.8476793556937455\n", "Iteration: 20 Loss: 0.8476790361591695\n", "Iteration: 21 Loss: 0.847678921126722\n", "Iteration: 22 Loss: 0.8476788797150412\n", "Iteration: 23 Loss: 0.8476788648068361\n", "Iteration: 24 Loss: 0.8476788594398821\n", "Iteration: 25 Loss: 0.8476788575077785\n", "Iteration: 26 Loss: 0.8476788568122215\n", "Iteration: 27 Loss: 0.847678856561821\n", "Iteration: 28 Loss: 0.8476788564716766\n", "Iteration: 29 Loss: 0.8476788564392248\n", "Iteration: 30 Loss: 0.847678856427542\n", "Iteration: 31 Loss: 0.8476788564233363\n", "Iteration: 32 Loss: 0.8476788564218222\n", "Iteration: 33 Loss: 0.8476788564212772\n", "Iteration: 34 Loss: 0.8476788564210811\n", "Iteration: 35 Loss: 0.8476788564210102\n", "Iteration: 36 Loss: 0.8476788564209847\n", "Iteration: 37 Loss: 0.8476788564209757\n", "Iteration: 38 Loss: 0.8476788564209723\n", "Iteration: 39 Loss: 0.8476788564209713\n", "Iteration: 40 Loss: 0.8476788564209707\n", "Iteration: 41 Loss: 0.8476788564209705\n", "Iteration: 42 Loss: 0.8476788564209705\n", "Iteration: 43 Loss: 0.8476788564209705\n", "Iteration: 44 Loss: 0.8476788564209704\n", "Iteration: 45 Loss: 0.8476788564209707\n", "Iteration: 46 Loss: 0.8476788564209705\n", "Iteration: 47 Loss: 0.8476788564209705\n", "Iteration: 48 Loss: 0.8476788564209705\n", "Iteration: 49 Loss: 0.8476788564209705\n", "Iteration: 50 Loss: 0.8476788564209705\n", "Iteration: 51 Loss: 0.8476788564209705\n", "Iteration: 52 Loss: 0.8476788564209705\n", "Iteration: 53 Loss: 0.8476788564209705\n", "Iteration: 54 Loss: 0.8476788564209705\n", "Iteration: 55 Loss: 0.8476788564209704\n", "Iteration: 56 Loss: 0.8476788564209705\n", "Iteration: 57 Loss: 0.8476788564209705\n", "Iteration: 58 Loss: 0.8476788564209705\n", "Iteration: 59 Loss: 0.8476788564209705\n", "Iteration: 60 Loss: 0.8476788564209705\n", "Iteration: 61 Loss: 0.8476788564209704\n", "Iteration: 62 Loss: 0.8476788564209705\n", "Iteration: 63 Loss: 0.8476788564209705\n", "Iteration: 64 Loss: 0.8476788564209705\n", "Iteration: 65 Loss: 0.8476788564209705\n", "Iteration: 66 Loss: 0.8476788564209705\n", "Iteration: 67 Loss: 0.8476788564209705\n", "Iteration: 68 Loss: 0.8476788564209704\n", "Iteration: 69 Loss: 0.8476788564209705\n", "Iteration: 70 Loss: 0.8476788564209705\n", "Iteration: 71 Loss: 0.8476788564209705\n", "Iteration: 72 Loss: 0.8476788564209707\n", "Iteration: 73 Loss: 0.8476788564209705\n", "Iteration: 74 Loss: 0.8476788564209705\n", "Iteration: 75 Loss: 0.8476788564209705\n", "Iteration: 76 Loss: 0.8476788564209705\n", "Iteration: 77 Loss: 0.8476788564209705\n", "Iteration: 78 Loss: 0.8476788564209705\n", "Iteration: 79 Loss: 0.8476788564209705\n", "Iteration: 80 Loss: 0.8476788564209705\n", "Iteration: 81 Loss: 0.8476788564209705\n", "Iteration: 82 Loss: 0.8476788564209705\n", "Iteration: 83 Loss: 0.8476788564209705\n", "Iteration: 84 Loss: 0.8476788564209705\n", "Iteration: 85 Loss: 0.8476788564209705\n", "Iteration: 86 Loss: 0.8476788564209705\n", "Iteration: 87 Loss: 0.8476788564209705\n", "Iteration: 88 Loss: 0.8476788564209705\n", "Iteration: 89 Loss: 0.8476788564209705\n", "Iteration: 90 Loss: 0.8476788564209705\n", "Iteration: 91 Loss: 0.8476788564209705\n", "Iteration: 92 Loss: 0.8476788564209705\n", "Iteration: 93 Loss: 0.8476788564209705\n", "Iteration: 94 Loss: 0.8476788564209705\n", "Iteration: 95 Loss: 0.8476788564209705\n", "Iteration: 96 Loss: 0.8476788564209705\n", "Iteration: 97 Loss: 0.8476788564209705\n", "Iteration: 98 Loss: 0.8476788564209705\n", "Iteration: 99 Loss: 0.8476788564209705\n", "Iteration: 100 Loss: 0.8476788564209705\n", "Iteration: 101 Loss: 0.8476788564209705\n", "Iteration: 102 Loss: 0.8476788564209705\n", "Iteration: 103 Loss: 0.8476788564209705\n", "Iteration: 104 Loss: 0.8476788564209705\n", "Iteration: 105 Loss: 0.8476788564209705\n", "Iteration: 106 Loss: 0.8476788564209705\n", "Iteration: 107 Loss: 0.8476788564209705\n", "Iteration: 108 Loss: 0.8476788564209705\n", "Iteration: 109 Loss: 0.8476788564209705\n", "Iteration: 110 Loss: 0.8476788564209705\n", "Iteration: 111 Loss: 0.8476788564209705\n", "Iteration: 112 Loss: 0.8476788564209705\n", "Iteration: 113 Loss: 0.8476788564209705\n", "Iteration: 114 Loss: 0.8476788564209705\n", "Iteration: 115 Loss: 0.8476788564209705\n", "Iteration: 116 Loss: 0.8476788564209705\n", "Iteration: 117 Loss: 0.8476788564209705\n", "Iteration: 118 Loss: 0.8476788564209705\n", "Iteration: 119 Loss: 0.8476788564209705\n", "Iteration: 120 Loss: 0.8476788564209705\n", "Iteration: 121 Loss: 0.8476788564209705\n", "Iteration: 122 Loss: 0.8476788564209705\n", "Iteration: 123 Loss: 0.8476788564209705\n", "Iteration: 124 Loss: 0.8476788564209705\n", "Iteration: 125 Loss: 0.8476788564209705\n", "Iteration: 126 Loss: 0.8476788564209705\n", "Iteration: 127 Loss: 0.8476788564209705\n", "Iteration: 128 Loss: 0.8476788564209705\n", "Iteration: 129 Loss: 0.8476788564209705\n", "Iteration: 130 Loss: 0.8476788564209705\n", "Iteration: 131 Loss: 0.8476788564209705\n", "Iteration: 132 Loss: 0.8476788564209705\n", "Iteration: 133 Loss: 0.8476788564209705\n", "Iteration: 134 Loss: 0.8476788564209705\n", "Iteration: 135 Loss: 0.8476788564209705\n", "Iteration: 136 Loss: 0.8476788564209705\n", "Iteration: 137 Loss: 0.8476788564209705\n", "Iteration: 138 Loss: 0.8476788564209705\n", "Iteration: 139 Loss: 0.8476788564209705\n", "Iteration: 140 Loss: 0.8476788564209705\n", "Iteration: 141 Loss: 0.8476788564209705\n", "Iteration: 142 Loss: 0.8476788564209705\n", "Iteration: 143 Loss: 0.8476788564209705\n", "Iteration: 144 Loss: 0.8476788564209705\n", "Iteration: 145 Loss: 0.8476788564209705\n", "Iteration: 146 Loss: 0.8476788564209705\n", "Iteration: 147 Loss: 0.8476788564209705\n", "Iteration: 148 Loss: 0.8476788564209705\n", "Iteration: 149 Loss: 0.8476788564209705\n", "Iteration: 150 Loss: 0.8476788564209705\n", "Iteration: 151 Loss: 0.8476788564209705\n", "Iteration: 152 Loss: 0.8476788564209705\n", "Iteration: 153 Loss: 0.8476788564209705\n", "Iteration: 154 Loss: 0.8476788564209705\n", "Iteration: 155 Loss: 0.8476788564209705\n", "Iteration: 156 Loss: 0.8476788564209705\n", "Iteration: 157 Loss: 0.8476788564209705\n", "Iteration: 158 Loss: 0.8476788564209705\n", "Iteration: 159 Loss: 0.8476788564209705\n", "Iteration: 160 Loss: 0.8476788564209705\n", "Iteration: 161 Loss: 0.8476788564209705\n", "Iteration: 162 Loss: 0.8476788564209705\n", "Iteration: 163 Loss: 0.8476788564209705\n", "Iteration: 164 Loss: 0.8476788564209705\n", "Iteration: 165 Loss: 0.8476788564209705\n", "Iteration: 166 Loss: 0.8476788564209705\n", "Iteration: 167 Loss: 0.8476788564209705\n", "Iteration: 168 Loss: 0.8476788564209705\n", "Iteration: 169 Loss: 0.8476788564209705\n", "Iteration: 170 Loss: 0.8476788564209705\n", "Iteration: 171 Loss: 0.8476788564209705\n", "Iteration: 172 Loss: 0.8476788564209705\n", "Iteration: 173 Loss: 0.8476788564209705\n", "Iteration: 174 Loss: 0.8476788564209705\n", "Iteration: 175 Loss: 0.8476788564209705\n", "Iteration: 176 Loss: 0.8476788564209705\n", "Iteration: 177 Loss: 0.8476788564209705\n", "Iteration: 178 Loss: 0.8476788564209705\n", "Iteration: 179 Loss: 0.8476788564209705\n", "Iteration: 180 Loss: 0.8476788564209705\n", "Iteration: 181 Loss: 0.8476788564209705\n", "Iteration: 182 Loss: 0.8476788564209705\n", "Iteration: 183 Loss: 0.8476788564209705\n", "Iteration: 184 Loss: 0.8476788564209705\n", "Iteration: 185 Loss: 0.8476788564209705\n", "Iteration: 186 Loss: 0.8476788564209705\n", "Iteration: 187 Loss: 0.8476788564209705\n", "Iteration: 188 Loss: 0.8476788564209705\n", "Iteration: 189 Loss: 0.8476788564209705\n", "Iteration: 190 Loss: 0.8476788564209705\n", "Iteration: 191 Loss: 0.8476788564209705\n", "Iteration: 192 Loss: 0.8476788564209705\n", "Iteration: 193 Loss: 0.8476788564209705\n", "Iteration: 194 Loss: 0.8476788564209705\n", "Iteration: 195 Loss: 0.8476788564209705\n", "Iteration: 196 Loss: 0.8476788564209705\n", "Iteration: 197 Loss: 0.8476788564209705\n", "Iteration: 198 Loss: 0.8476788564209705\n", "Iteration: 199 Loss: 0.8476788564209705\n", "Iteration: 200 Loss: 0.8476788564209705\n", "Iteration: 201 Loss: 0.8476788564209705\n", "Iteration: 202 Loss: 0.8476788564209705\n", "Iteration: 203 Loss: 0.8476788564209705\n", "Iteration: 204 Loss: 0.8476788564209705\n", "Iteration: 205 Loss: 0.8476788564209705\n", "Iteration: 206 Loss: 0.8476788564209705\n", "Iteration: 207 Loss: 0.8476788564209705\n", "Iteration: 208 Loss: 0.8476788564209705\n", "Iteration: 209 Loss: 0.8476788564209705\n", "Iteration: 210 Loss: 0.8476788564209705\n", "Iteration: 211 Loss: 0.8476788564209705\n", "Iteration: 212 Loss: 0.8476788564209705\n", "Iteration: 213 Loss: 0.8476788564209705\n", "Iteration: 214 Loss: 0.8476788564209705\n", "Iteration: 215 Loss: 0.8476788564209705\n", "Iteration: 216 Loss: 0.8476788564209705\n", "Iteration: 217 Loss: 0.8476788564209705\n", "Iteration: 218 Loss: 0.8476788564209705\n", "Iteration: 219 Loss: 0.8476788564209705\n", "Iteration: 220 Loss: 0.8476788564209705\n", "Iteration: 221 Loss: 0.8476788564209705\n", "Iteration: 222 Loss: 0.8476788564209705\n", "Iteration: 223 Loss: 0.8476788564209705\n", "Iteration: 224 Loss: 0.8476788564209705\n", "Iteration: 225 Loss: 0.8476788564209705\n", "Iteration: 226 Loss: 0.8476788564209705\n", "Iteration: 227 Loss: 0.8476788564209705\n", "Iteration: 228 Loss: 0.8476788564209705\n", "Iteration: 229 Loss: 0.8476788564209705\n", "Iteration: 230 Loss: 0.8476788564209705\n", "Iteration: 231 Loss: 0.8476788564209705\n", "Iteration: 232 Loss: 0.8476788564209705\n", "Iteration: 233 Loss: 0.8476788564209705\n", "Iteration: 234 Loss: 0.8476788564209705\n", "Iteration: 235 Loss: 0.8476788564209705\n", "Iteration: 236 Loss: 0.8476788564209705\n", "Iteration: 237 Loss: 0.8476788564209705\n", "Iteration: 238 Loss: 0.8476788564209705\n", "Iteration: 239 Loss: 0.8476788564209705\n", "Iteration: 240 Loss: 0.8476788564209705\n", "Iteration: 241 Loss: 0.8476788564209705\n", "Iteration: 242 Loss: 0.8476788564209705\n", "Iteration: 243 Loss: 0.8476788564209705\n", "Iteration: 244 Loss: 0.8476788564209705\n", "Iteration: 245 Loss: 0.8476788564209705\n", "Iteration: 246 Loss: 0.8476788564209705\n", "Iteration: 247 Loss: 0.8476788564209705\n", "Iteration: 248 Loss: 0.8476788564209705\n", "Iteration: 249 Loss: 0.8476788564209705\n", "Iteration: 250 Loss: 0.8476788564209705\n", "Iteration: 251 Loss: 0.8476788564209705\n", "Iteration: 252 Loss: 0.8476788564209705\n", "Iteration: 253 Loss: 0.8476788564209705\n", "Iteration: 254 Loss: 0.8476788564209705\n", "Iteration: 255 Loss: 0.8476788564209705\n", "Iteration: 256 Loss: 0.8476788564209705\n", "Iteration: 257 Loss: 0.8476788564209705\n", "Iteration: 258 Loss: 0.8476788564209705\n", "Iteration: 259 Loss: 0.8476788564209705\n", "Iteration: 260 Loss: 0.8476788564209705\n", "Iteration: 261 Loss: 0.8476788564209705\n", "Iteration: 262 Loss: 0.8476788564209705\n", "Iteration: 263 Loss: 0.8476788564209705\n", "Iteration: 264 Loss: 0.8476788564209705\n", "Iteration: 265 Loss: 0.8476788564209705\n", "Iteration: 266 Loss: 0.8476788564209705\n", "Iteration: 267 Loss: 0.8476788564209705\n", "Iteration: 268 Loss: 0.8476788564209705\n", "Iteration: 269 Loss: 0.8476788564209705\n", "Iteration: 270 Loss: 0.8476788564209705\n", "Iteration: 271 Loss: 0.8476788564209705\n", "Iteration: 272 Loss: 0.8476788564209705\n", "Iteration: 273 Loss: 0.8476788564209705\n", "Iteration: 274 Loss: 0.8476788564209705\n", "Iteration: 275 Loss: 0.8476788564209705\n", "Iteration: 276 Loss: 0.8476788564209705\n", "Iteration: 277 Loss: 0.8476788564209705\n", "Iteration: 278 Loss: 0.8476788564209705\n", "Iteration: 279 Loss: 0.8476788564209705\n", "Iteration: 280 Loss: 0.8476788564209705\n", "Iteration: 281 Loss: 0.8476788564209705\n", "Iteration: 282 Loss: 0.8476788564209705\n", "Iteration: 283 Loss: 0.8476788564209705\n", "Iteration: 284 Loss: 0.8476788564209705\n", "Iteration: 285 Loss: 0.8476788564209705\n", "Iteration: 286 Loss: 0.8476788564209705\n", "Iteration: 287 Loss: 0.8476788564209705\n", "Iteration: 288 Loss: 0.8476788564209705\n", "Iteration: 289 Loss: 0.8476788564209705\n", "Iteration: 290 Loss: 0.8476788564209705\n", "Iteration: 291 Loss: 0.8476788564209705\n", "Iteration: 292 Loss: 0.8476788564209705\n", "Iteration: 293 Loss: 0.8476788564209705\n", "Iteration: 294 Loss: 0.8476788564209705\n", "Iteration: 295 Loss: 0.8476788564209705\n", "Iteration: 296 Loss: 0.8476788564209705\n", "Iteration: 297 Loss: 0.8476788564209705\n", "Iteration: 298 Loss: 0.8476788564209705\n", "Iteration: 299 Loss: 0.8476788564209705\n", "Iteration: 300 Loss: 0.8476788564209705\n", "Iteration: 301 Loss: 0.8476788564209705\n", "Iteration: 302 Loss: 0.8476788564209705\n", "Iteration: 303 Loss: 0.8476788564209705\n", "Iteration: 304 Loss: 0.8476788564209705\n", "Iteration: 305 Loss: 0.8476788564209705\n", "Iteration: 306 Loss: 0.8476788564209705\n", "Iteration: 307 Loss: 0.8476788564209705\n", "Iteration: 308 Loss: 0.8476788564209705\n", "Iteration: 309 Loss: 0.8476788564209705\n", "Iteration: 310 Loss: 0.8476788564209705\n", "Iteration: 311 Loss: 0.8476788564209705\n", "Iteration: 312 Loss: 0.8476788564209705\n", "Iteration: 313 Loss: 0.8476788564209705\n", "Iteration: 314 Loss: 0.8476788564209705\n", "Iteration: 315 Loss: 0.8476788564209705\n", "Iteration: 316 Loss: 0.8476788564209705\n", "Iteration: 317 Loss: 0.8476788564209705\n", "Iteration: 318 Loss: 0.8476788564209705\n", "Iteration: 319 Loss: 0.8476788564209705\n", "Iteration: 320 Loss: 0.8476788564209705\n", "Iteration: 321 Loss: 0.8476788564209705\n", "Iteration: 322 Loss: 0.8476788564209705\n", "Iteration: 323 Loss: 0.8476788564209705\n", "Iteration: 324 Loss: 0.8476788564209705\n", "Iteration: 325 Loss: 0.8476788564209705\n", "Iteration: 326 Loss: 0.8476788564209705\n", "Iteration: 327 Loss: 0.8476788564209705\n", "Iteration: 328 Loss: 0.8476788564209705\n", "Iteration: 329 Loss: 0.8476788564209705\n", "Iteration: 330 Loss: 0.8476788564209705\n", "Iteration: 331 Loss: 0.8476788564209705\n", "Iteration: 332 Loss: 0.8476788564209705\n", "Iteration: 333 Loss: 0.8476788564209705\n", "Iteration: 334 Loss: 0.8476788564209705\n", "Iteration: 335 Loss: 0.8476788564209705\n", "Iteration: 336 Loss: 0.8476788564209705\n", "Iteration: 337 Loss: 0.8476788564209705\n", "Iteration: 338 Loss: 0.8476788564209705\n", "Iteration: 339 Loss: 0.8476788564209705\n", "Iteration: 340 Loss: 0.8476788564209705\n", "Iteration: 341 Loss: 0.8476788564209705\n", "Iteration: 342 Loss: 0.8476788564209705\n", "Iteration: 343 Loss: 0.8476788564209705\n", "Iteration: 344 Loss: 0.8476788564209705\n", "Iteration: 345 Loss: 0.8476788564209705\n", "Iteration: 346 Loss: 0.8476788564209705\n", "Iteration: 347 Loss: 0.8476788564209705\n", "Iteration: 348 Loss: 0.8476788564209705\n", "Iteration: 349 Loss: 0.8476788564209705\n", "Iteration: 350 Loss: 0.8476788564209705\n", "Iteration: 351 Loss: 0.8476788564209705\n", "Iteration: 352 Loss: 0.8476788564209705\n", "Iteration: 353 Loss: 0.8476788564209705\n", "Iteration: 354 Loss: 0.8476788564209705\n", "Iteration: 355 Loss: 0.8476788564209705\n", "Iteration: 356 Loss: 0.8476788564209705\n", "Iteration: 357 Loss: 0.8476788564209705\n", "Iteration: 358 Loss: 0.8476788564209705\n", "Iteration: 359 Loss: 0.8476788564209705\n", "Iteration: 360 Loss: 0.8476788564209705\n", "Iteration: 361 Loss: 0.8476788564209705\n", "Iteration: 362 Loss: 0.8476788564209705\n", "Iteration: 363 Loss: 0.8476788564209705\n", "Iteration: 364 Loss: 0.8476788564209705\n", "Iteration: 365 Loss: 0.8476788564209705\n", "Iteration: 366 Loss: 0.8476788564209705\n", "Iteration: 367 Loss: 0.8476788564209705\n", "Iteration: 368 Loss: 0.8476788564209705\n", "Iteration: 369 Loss: 0.8476788564209705\n", "Iteration: 370 Loss: 0.8476788564209705\n", "Iteration: 371 Loss: 0.8476788564209705\n", "Iteration: 372 Loss: 0.8476788564209705\n", "Iteration: 373 Loss: 0.8476788564209705\n", "Iteration: 374 Loss: 0.8476788564209705\n", "Iteration: 375 Loss: 0.8476788564209705\n", "Iteration: 376 Loss: 0.8476788564209705\n", "Iteration: 377 Loss: 0.8476788564209705\n", "Iteration: 378 Loss: 0.8476788564209705\n", "Iteration: 379 Loss: 0.8476788564209705\n", "Iteration: 380 Loss: 0.8476788564209705\n", "Iteration: 381 Loss: 0.8476788564209705\n", "Iteration: 382 Loss: 0.8476788564209705\n", "Iteration: 383 Loss: 0.8476788564209705\n", "Iteration: 384 Loss: 0.8476788564209705\n", "Iteration: 385 Loss: 0.8476788564209705\n", "Iteration: 386 Loss: 0.8476788564209705\n", "Iteration: 387 Loss: 0.8476788564209705\n", "Iteration: 388 Loss: 0.8476788564209705\n", "Iteration: 389 Loss: 0.8476788564209705\n", "Iteration: 390 Loss: 0.8476788564209705\n", "Iteration: 391 Loss: 0.8476788564209705\n", "Iteration: 392 Loss: 0.8476788564209705\n", "Iteration: 393 Loss: 0.8476788564209705\n", "Iteration: 394 Loss: 0.8476788564209705\n", "Iteration: 395 Loss: 0.8476788564209705\n", "Iteration: 396 Loss: 0.8476788564209705\n", "Iteration: 397 Loss: 0.8476788564209705\n", "Iteration: 398 Loss: 0.8476788564209705\n", "Iteration: 399 Loss: 0.8476788564209705\n", "Iteration: 400 Loss: 0.8476788564209705\n", "Iteration: 401 Loss: 0.8476788564209705\n", "Iteration: 402 Loss: 0.8476788564209705\n", "Iteration: 403 Loss: 0.8476788564209705\n", "Iteration: 404 Loss: 0.8476788564209705\n", "Iteration: 405 Loss: 0.8476788564209705\n", "Iteration: 406 Loss: 0.8476788564209705\n", "Iteration: 407 Loss: 0.8476788564209705\n", "Iteration: 408 Loss: 0.8476788564209705\n", "Iteration: 409 Loss: 0.8476788564209705\n", "Iteration: 410 Loss: 0.8476788564209705\n", "Iteration: 411 Loss: 0.8476788564209705\n", "Iteration: 412 Loss: 0.8476788564209705\n", "Iteration: 413 Loss: 0.8476788564209705\n", "Iteration: 414 Loss: 0.8476788564209705\n", "Iteration: 415 Loss: 0.8476788564209705\n", "Iteration: 416 Loss: 0.8476788564209705\n", "Iteration: 417 Loss: 0.8476788564209705\n", "Iteration: 418 Loss: 0.8476788564209705\n", "Iteration: 419 Loss: 0.8476788564209705\n", "Iteration: 420 Loss: 0.8476788564209705\n", "Iteration: 421 Loss: 0.8476788564209705\n", "Iteration: 422 Loss: 0.8476788564209705\n", "Iteration: 423 Loss: 0.8476788564209705\n", "Iteration: 424 Loss: 0.8476788564209705\n", "Iteration: 425 Loss: 0.8476788564209705\n", "Iteration: 426 Loss: 0.8476788564209705\n", "Iteration: 427 Loss: 0.8476788564209705\n", "Iteration: 428 Loss: 0.8476788564209705\n", "Iteration: 429 Loss: 0.8476788564209705\n", "Iteration: 430 Loss: 0.8476788564209705\n", "Iteration: 431 Loss: 0.8476788564209705\n", "Iteration: 432 Loss: 0.8476788564209705\n", "Iteration: 433 Loss: 0.8476788564209705\n", "Iteration: 434 Loss: 0.8476788564209705\n", "Iteration: 435 Loss: 0.8476788564209705\n", "Iteration: 436 Loss: 0.8476788564209705\n", "Iteration: 437 Loss: 0.8476788564209705\n", "Iteration: 438 Loss: 0.8476788564209705\n", "Iteration: 439 Loss: 0.8476788564209705\n", "Iteration: 440 Loss: 0.8476788564209705\n", "Iteration: 441 Loss: 0.8476788564209705\n", "Iteration: 442 Loss: 0.8476788564209705\n", "Iteration: 443 Loss: 0.8476788564209705\n", "Iteration: 444 Loss: 0.8476788564209705\n", "Iteration: 445 Loss: 0.8476788564209705\n", "Iteration: 446 Loss: 0.8476788564209705\n", "Iteration: 447 Loss: 0.8476788564209705\n", "Iteration: 448 Loss: 0.8476788564209705\n", "Iteration: 449 Loss: 0.8476788564209705\n", "Iteration: 450 Loss: 0.8476788564209705\n", "Iteration: 451 Loss: 0.8476788564209705\n", "Iteration: 452 Loss: 0.8476788564209705\n", "Iteration: 453 Loss: 0.8476788564209705\n", "Iteration: 454 Loss: 0.8476788564209705\n", "Iteration: 455 Loss: 0.8476788564209705\n", "Iteration: 456 Loss: 0.8476788564209705\n", "Iteration: 457 Loss: 0.8476788564209705\n", "Iteration: 458 Loss: 0.8476788564209705\n", "Iteration: 459 Loss: 0.8476788564209705\n", "Iteration: 460 Loss: 0.8476788564209705\n", "Iteration: 461 Loss: 0.8476788564209705\n", "Iteration: 462 Loss: 0.8476788564209705\n", "Iteration: 463 Loss: 0.8476788564209705\n", "Iteration: 464 Loss: 0.8476788564209705\n", "Iteration: 465 Loss: 0.8476788564209705\n", "Iteration: 466 Loss: 0.8476788564209705\n", "Iteration: 467 Loss: 0.8476788564209705\n", "Iteration: 468 Loss: 0.8476788564209705\n", "Iteration: 469 Loss: 0.8476788564209705\n", "Iteration: 470 Loss: 0.8476788564209705\n", "Iteration: 471 Loss: 0.8476788564209705\n", "Iteration: 472 Loss: 0.8476788564209705\n", "Iteration: 473 Loss: 0.8476788564209705\n", "Iteration: 474 Loss: 0.8476788564209705\n", "Iteration: 475 Loss: 0.8476788564209705\n", "Iteration: 476 Loss: 0.8476788564209705\n", "Iteration: 477 Loss: 0.8476788564209705\n", "Iteration: 478 Loss: 0.8476788564209705\n", "Iteration: 479 Loss: 0.8476788564209705\n", "Iteration: 480 Loss: 0.8476788564209705\n", "Iteration: 481 Loss: 0.8476788564209705\n", "Iteration: 482 Loss: 0.8476788564209705\n", "Iteration: 483 Loss: 0.8476788564209705\n", "Iteration: 484 Loss: 0.8476788564209705\n", "Iteration: 485 Loss: 0.8476788564209705\n", "Iteration: 486 Loss: 0.8476788564209705\n", "Iteration: 487 Loss: 0.8476788564209705\n", "Iteration: 488 Loss: 0.8476788564209705\n", "Iteration: 489 Loss: 0.8476788564209705\n", "Iteration: 490 Loss: 0.8476788564209705\n", "Iteration: 491 Loss: 0.8476788564209705\n", "Iteration: 492 Loss: 0.8476788564209705\n", "Iteration: 493 Loss: 0.8476788564209705\n", "Iteration: 494 Loss: 0.8476788564209705\n", "Iteration: 495 Loss: 0.8476788564209705\n", "Iteration: 496 Loss: 0.8476788564209705\n", "Iteration: 497 Loss: 0.8476788564209705\n", "Iteration: 498 Loss: 0.8476788564209705\n", "Iteration: 499 Loss: 0.8476788564209705\n", "Iteration: 500 Loss: 0.8476788564209705\n", "Iteration: 501 Loss: 0.8476788564209705\n", "Iteration: 502 Loss: 0.8476788564209705\n", "Iteration: 503 Loss: 0.8476788564209705\n", "Iteration: 504 Loss: 0.8476788564209705\n", "Iteration: 505 Loss: 0.8476788564209705\n", "Iteration: 506 Loss: 0.8476788564209705\n", "Iteration: 507 Loss: 0.8476788564209705\n", "Iteration: 508 Loss: 0.8476788564209705\n", "Iteration: 509 Loss: 0.8476788564209705\n", "Iteration: 510 Loss: 0.8476788564209705\n", "Iteration: 511 Loss: 0.8476788564209705\n", "Iteration: 512 Loss: 0.8476788564209705\n", "Iteration: 513 Loss: 0.8476788564209705\n", "Iteration: 514 Loss: 0.8476788564209705\n", "Iteration: 515 Loss: 0.8476788564209705\n", "Iteration: 516 Loss: 0.8476788564209705\n", "Iteration: 517 Loss: 0.8476788564209705\n", "Iteration: 518 Loss: 0.8476788564209705\n", "Iteration: 519 Loss: 0.8476788564209705\n", "Iteration: 520 Loss: 0.8476788564209705\n", "Iteration: 521 Loss: 0.8476788564209705\n", "Iteration: 522 Loss: 0.8476788564209705\n", "Iteration: 523 Loss: 0.8476788564209705\n", "Iteration: 524 Loss: 0.8476788564209705\n", "Iteration: 525 Loss: 0.8476788564209705\n", "Iteration: 526 Loss: 0.8476788564209705\n", "Iteration: 527 Loss: 0.8476788564209705\n", "Iteration: 528 Loss: 0.8476788564209705\n", "Iteration: 529 Loss: 0.8476788564209705\n", "Iteration: 530 Loss: 0.8476788564209705\n", "Iteration: 531 Loss: 0.8476788564209705\n", "Iteration: 532 Loss: 0.8476788564209705\n", "Iteration: 533 Loss: 0.8476788564209705\n", "Iteration: 534 Loss: 0.8476788564209705\n", "Iteration: 535 Loss: 0.8476788564209705\n", "Iteration: 536 Loss: 0.8476788564209705\n", "Iteration: 537 Loss: 0.8476788564209705\n", "Iteration: 538 Loss: 0.8476788564209705\n", "Iteration: 539 Loss: 0.8476788564209705\n", "Iteration: 540 Loss: 0.8476788564209705\n", "Iteration: 541 Loss: 0.8476788564209705\n", "Iteration: 542 Loss: 0.8476788564209705\n", "Iteration: 543 Loss: 0.8476788564209705\n", "Iteration: 544 Loss: 0.8476788564209705\n", "Iteration: 545 Loss: 0.8476788564209705\n", "Iteration: 546 Loss: 0.8476788564209705\n", "Iteration: 547 Loss: 0.8476788564209705\n", "Iteration: 548 Loss: 0.8476788564209705\n", "Iteration: 549 Loss: 0.8476788564209705\n", "Iteration: 550 Loss: 0.8476788564209705\n", "Iteration: 551 Loss: 0.8476788564209705\n", "Iteration: 552 Loss: 0.8476788564209705\n", "Iteration: 553 Loss: 0.8476788564209705\n", "Iteration: 554 Loss: 0.8476788564209705\n", "Iteration: 555 Loss: 0.8476788564209705\n", "Iteration: 556 Loss: 0.8476788564209705\n", "Iteration: 557 Loss: 0.8476788564209705\n", "Iteration: 558 Loss: 0.8476788564209705\n", "Iteration: 559 Loss: 0.8476788564209705\n", "Iteration: 560 Loss: 0.8476788564209705\n", "Iteration: 561 Loss: 0.8476788564209705\n", "Iteration: 562 Loss: 0.8476788564209705\n", "Iteration: 563 Loss: 0.8476788564209705\n", "Iteration: 564 Loss: 0.8476788564209705\n", "Iteration: 565 Loss: 0.8476788564209705\n", "Iteration: 566 Loss: 0.8476788564209705\n", "Iteration: 567 Loss: 0.8476788564209705\n", "Iteration: 568 Loss: 0.8476788564209705\n", "Iteration: 569 Loss: 0.8476788564209705\n", "Iteration: 570 Loss: 0.8476788564209705\n", "Iteration: 571 Loss: 0.8476788564209705\n", "Iteration: 572 Loss: 0.8476788564209705\n", "Iteration: 573 Loss: 0.8476788564209705\n", "Iteration: 574 Loss: 0.8476788564209705\n", "Iteration: 575 Loss: 0.8476788564209705\n", "Iteration: 576 Loss: 0.8476788564209705\n", "Iteration: 577 Loss: 0.8476788564209705\n", "Iteration: 578 Loss: 0.8476788564209705\n", "Iteration: 579 Loss: 0.8476788564209705\n", "Iteration: 580 Loss: 0.8476788564209705\n", "Iteration: 581 Loss: 0.8476788564209705\n", "Iteration: 582 Loss: 0.8476788564209705\n", "Iteration: 583 Loss: 0.8476788564209705\n", "Iteration: 584 Loss: 0.8476788564209705\n", "Iteration: 585 Loss: 0.8476788564209705\n", "Iteration: 586 Loss: 0.8476788564209705\n", "Iteration: 587 Loss: 0.8476788564209705\n", "Iteration: 588 Loss: 0.8476788564209705\n", "Iteration: 589 Loss: 0.8476788564209705\n", "Iteration: 590 Loss: 0.8476788564209705\n", "Iteration: 591 Loss: 0.8476788564209705\n", "Iteration: 592 Loss: 0.8476788564209705\n", "Iteration: 593 Loss: 0.8476788564209705\n", "Iteration: 594 Loss: 0.8476788564209705\n", "Iteration: 595 Loss: 0.8476788564209705\n", "Iteration: 596 Loss: 0.8476788564209705\n", "Iteration: 597 Loss: 0.8476788564209705\n", "Iteration: 598 Loss: 0.8476788564209705\n", "Iteration: 599 Loss: 0.8476788564209705\n", "Iteration: 600 Loss: 0.8476788564209705\n", "Iteration: 601 Loss: 0.8476788564209705\n", "Iteration: 602 Loss: 0.8476788564209705\n", "Iteration: 603 Loss: 0.8476788564209705\n", "Iteration: 604 Loss: 0.8476788564209705\n", "Iteration: 605 Loss: 0.8476788564209705\n", "Iteration: 606 Loss: 0.8476788564209705\n", "Iteration: 607 Loss: 0.8476788564209705\n", "Iteration: 608 Loss: 0.8476788564209705\n", "Iteration: 609 Loss: 0.8476788564209705\n", "Iteration: 610 Loss: 0.8476788564209705\n", "Iteration: 611 Loss: 0.8476788564209705\n", "Iteration: 612 Loss: 0.8476788564209705\n", "Iteration: 613 Loss: 0.8476788564209705\n", "Iteration: 614 Loss: 0.8476788564209705\n", "Iteration: 615 Loss: 0.8476788564209705\n", "Iteration: 616 Loss: 0.8476788564209705\n", "Iteration: 617 Loss: 0.8476788564209705\n", "Iteration: 618 Loss: 0.8476788564209705\n", "Iteration: 619 Loss: 0.8476788564209705\n", "Iteration: 620 Loss: 0.8476788564209705\n", "Iteration: 621 Loss: 0.8476788564209705\n", "Iteration: 622 Loss: 0.8476788564209705\n", "Iteration: 623 Loss: 0.8476788564209705\n", "Iteration: 624 Loss: 0.8476788564209705\n", "Iteration: 625 Loss: 0.8476788564209705\n", "Iteration: 626 Loss: 0.8476788564209705\n", "Iteration: 627 Loss: 0.8476788564209705\n", "Iteration: 628 Loss: 0.8476788564209705\n", "Iteration: 629 Loss: 0.8476788564209705\n", "Iteration: 630 Loss: 0.8476788564209705\n", "Iteration: 631 Loss: 0.8476788564209705\n", "Iteration: 632 Loss: 0.8476788564209705\n", "Iteration: 633 Loss: 0.8476788564209705\n", "Iteration: 634 Loss: 0.8476788564209705\n", "Iteration: 635 Loss: 0.8476788564209705\n", "Iteration: 636 Loss: 0.8476788564209705\n", "Iteration: 637 Loss: 0.8476788564209705\n", "Iteration: 638 Loss: 0.8476788564209705\n", "Iteration: 639 Loss: 0.8476788564209705\n", "Iteration: 640 Loss: 0.8476788564209705\n", "Iteration: 641 Loss: 0.8476788564209705\n", "Iteration: 642 Loss: 0.8476788564209705\n", "Iteration: 643 Loss: 0.8476788564209705\n", "Iteration: 644 Loss: 0.8476788564209705\n", "Iteration: 645 Loss: 0.8476788564209705\n", "Iteration: 646 Loss: 0.8476788564209705\n", "Iteration: 647 Loss: 0.8476788564209705\n", "Iteration: 648 Loss: 0.8476788564209705\n", "Iteration: 649 Loss: 0.8476788564209705\n", "Iteration: 650 Loss: 0.8476788564209705\n", "Iteration: 651 Loss: 0.8476788564209705\n", "Iteration: 652 Loss: 0.8476788564209705\n", "Iteration: 653 Loss: 0.8476788564209705\n", "Iteration: 654 Loss: 0.8476788564209705\n", "Iteration: 655 Loss: 0.8476788564209705\n", "Iteration: 656 Loss: 0.8476788564209705\n", "Iteration: 657 Loss: 0.8476788564209705\n", "Iteration: 658 Loss: 0.8476788564209705\n", "Iteration: 659 Loss: 0.8476788564209705\n", "Iteration: 660 Loss: 0.8476788564209705\n", "Iteration: 661 Loss: 0.8476788564209705\n", "Iteration: 662 Loss: 0.8476788564209705\n", "Iteration: 663 Loss: 0.8476788564209705\n", "Iteration: 664 Loss: 0.8476788564209705\n", "Iteration: 665 Loss: 0.8476788564209705\n", "Iteration: 666 Loss: 0.8476788564209705\n", "Iteration: 667 Loss: 0.8476788564209705\n", "Iteration: 668 Loss: 0.8476788564209705\n", "Iteration: 669 Loss: 0.8476788564209705\n", "Iteration: 670 Loss: 0.8476788564209705\n", "Iteration: 671 Loss: 0.8476788564209705\n", "Iteration: 672 Loss: 0.8476788564209705\n", "Iteration: 673 Loss: 0.8476788564209705\n", "Iteration: 674 Loss: 0.8476788564209705\n", "Iteration: 675 Loss: 0.8476788564209705\n", "Iteration: 676 Loss: 0.8476788564209705\n", "Iteration: 677 Loss: 0.8476788564209705\n", "Iteration: 678 Loss: 0.8476788564209705\n", "Iteration: 679 Loss: 0.8476788564209705\n", "Iteration: 680 Loss: 0.8476788564209705\n", "Iteration: 681 Loss: 0.8476788564209705\n", "Iteration: 682 Loss: 0.8476788564209705\n", "Iteration: 683 Loss: 0.8476788564209705\n", "Iteration: 684 Loss: 0.8476788564209705\n", "Iteration: 685 Loss: 0.8476788564209705\n", "Iteration: 686 Loss: 0.8476788564209705\n", "Iteration: 687 Loss: 0.8476788564209705\n", "Iteration: 688 Loss: 0.8476788564209705\n", "Iteration: 689 Loss: 0.8476788564209705\n", "Iteration: 690 Loss: 0.8476788564209705\n", "Iteration: 691 Loss: 0.8476788564209705\n", "Iteration: 692 Loss: 0.8476788564209705\n", "Iteration: 693 Loss: 0.8476788564209705\n", "Iteration: 694 Loss: 0.8476788564209705\n", "Iteration: 695 Loss: 0.8476788564209705\n", "Iteration: 696 Loss: 0.8476788564209705\n", "Iteration: 697 Loss: 0.8476788564209705\n", "Iteration: 698 Loss: 0.8476788564209705\n", "Iteration: 699 Loss: 0.8476788564209705\n", "Iteration: 700 Loss: 0.8476788564209705\n", "Iteration: 701 Loss: 0.8476788564209705\n", "Iteration: 702 Loss: 0.8476788564209705\n", "Iteration: 703 Loss: 0.8476788564209705\n", "Iteration: 704 Loss: 0.8476788564209705\n", "Iteration: 705 Loss: 0.8476788564209705\n", "Iteration: 706 Loss: 0.8476788564209705\n", "Iteration: 707 Loss: 0.8476788564209705\n", "Iteration: 708 Loss: 0.8476788564209705\n", "Iteration: 709 Loss: 0.8476788564209705\n", "Iteration: 710 Loss: 0.8476788564209705\n", "Iteration: 711 Loss: 0.8476788564209705\n", "Iteration: 712 Loss: 0.8476788564209705\n", "Iteration: 713 Loss: 0.8476788564209705\n", "Iteration: 714 Loss: 0.8476788564209705\n", "Iteration: 715 Loss: 0.8476788564209705\n", "Iteration: 716 Loss: 0.8476788564209705\n", "Iteration: 717 Loss: 0.8476788564209705\n", "Iteration: 718 Loss: 0.8476788564209705\n", "Iteration: 719 Loss: 0.8476788564209705\n", "Iteration: 720 Loss: 0.8476788564209705\n", "Iteration: 721 Loss: 0.8476788564209705\n", "Iteration: 722 Loss: 0.8476788564209705\n", "Iteration: 723 Loss: 0.8476788564209705\n", "Iteration: 724 Loss: 0.8476788564209705\n", "Iteration: 725 Loss: 0.8476788564209705\n", "Iteration: 726 Loss: 0.8476788564209705\n", "Iteration: 727 Loss: 0.8476788564209705\n", "Iteration: 728 Loss: 0.8476788564209705\n", "Iteration: 729 Loss: 0.8476788564209705\n", "Iteration: 730 Loss: 0.8476788564209705\n", "Iteration: 731 Loss: 0.8476788564209705\n", "Iteration: 732 Loss: 0.8476788564209705\n", "Iteration: 733 Loss: 0.8476788564209705\n", "Iteration: 734 Loss: 0.8476788564209705\n", "Iteration: 735 Loss: 0.8476788564209705\n", "Iteration: 736 Loss: 0.8476788564209705\n", "Iteration: 737 Loss: 0.8476788564209705\n", "Iteration: 738 Loss: 0.8476788564209705\n", "Iteration: 739 Loss: 0.8476788564209705\n", "Iteration: 740 Loss: 0.8476788564209705\n", "Iteration: 741 Loss: 0.8476788564209705\n", "Iteration: 742 Loss: 0.8476788564209705\n", "Iteration: 743 Loss: 0.8476788564209705\n", "Iteration: 744 Loss: 0.8476788564209705\n", "Iteration: 745 Loss: 0.8476788564209705\n", "Iteration: 746 Loss: 0.8476788564209705\n", "Iteration: 747 Loss: 0.8476788564209705\n", "Iteration: 748 Loss: 0.8476788564209705\n", "Iteration: 749 Loss: 0.8476788564209705\n", "Iteration: 750 Loss: 0.8476788564209705\n", "Iteration: 751 Loss: 0.8476788564209705\n", "Iteration: 752 Loss: 0.8476788564209705\n", "Iteration: 753 Loss: 0.8476788564209705\n", "Iteration: 754 Loss: 0.8476788564209705\n", "Iteration: 755 Loss: 0.8476788564209705\n", "Iteration: 756 Loss: 0.8476788564209705\n", "Iteration: 757 Loss: 0.8476788564209705\n", "Iteration: 758 Loss: 0.8476788564209705\n", "Iteration: 759 Loss: 0.8476788564209705\n", "Iteration: 760 Loss: 0.8476788564209705\n", "Iteration: 761 Loss: 0.8476788564209705\n", "Iteration: 762 Loss: 0.8476788564209705\n", "Iteration: 763 Loss: 0.8476788564209705\n", "Iteration: 764 Loss: 0.8476788564209705\n", "Iteration: 765 Loss: 0.8476788564209705\n", "Iteration: 766 Loss: 0.8476788564209705\n", "Iteration: 767 Loss: 0.8476788564209705\n", "Iteration: 768 Loss: 0.8476788564209705\n", "Iteration: 769 Loss: 0.8476788564209705\n", "Iteration: 770 Loss: 0.8476788564209705\n", "Iteration: 771 Loss: 0.8476788564209705\n", "Iteration: 772 Loss: 0.8476788564209705\n", "Iteration: 773 Loss: 0.8476788564209705\n", "Iteration: 774 Loss: 0.8476788564209705\n", "Iteration: 775 Loss: 0.8476788564209705\n", "Iteration: 776 Loss: 0.8476788564209705\n", "Iteration: 777 Loss: 0.8476788564209705\n", "Iteration: 778 Loss: 0.8476788564209705\n", "Iteration: 779 Loss: 0.8476788564209705\n", "Iteration: 780 Loss: 0.8476788564209705\n", "Iteration: 781 Loss: 0.8476788564209705\n", "Iteration: 782 Loss: 0.8476788564209705\n", "Iteration: 783 Loss: 0.8476788564209705\n", "Iteration: 784 Loss: 0.8476788564209705\n", "Iteration: 785 Loss: 0.8476788564209705\n", "Iteration: 786 Loss: 0.8476788564209705\n", "Iteration: 787 Loss: 0.8476788564209705\n", "Iteration: 788 Loss: 0.8476788564209705\n", "Iteration: 789 Loss: 0.8476788564209705\n", "Iteration: 790 Loss: 0.8476788564209705\n", "Iteration: 791 Loss: 0.8476788564209705\n", "Iteration: 792 Loss: 0.8476788564209705\n", "Iteration: 793 Loss: 0.8476788564209705\n", "Iteration: 794 Loss: 0.8476788564209705\n", "Iteration: 795 Loss: 0.8476788564209705\n", "Iteration: 796 Loss: 0.8476788564209705\n", "Iteration: 797 Loss: 0.8476788564209705\n", "Iteration: 798 Loss: 0.8476788564209705\n", "Iteration: 799 Loss: 0.8476788564209705\n", "Iteration: 800 Loss: 0.8476788564209705\n", "Iteration: 801 Loss: 0.8476788564209705\n", "Iteration: 802 Loss: 0.8476788564209705\n", "Iteration: 803 Loss: 0.8476788564209705\n", "Iteration: 804 Loss: 0.8476788564209705\n", "Iteration: 805 Loss: 0.8476788564209705\n", "Iteration: 806 Loss: 0.8476788564209705\n", "Iteration: 807 Loss: 0.8476788564209705\n", "Iteration: 808 Loss: 0.8476788564209705\n", "Iteration: 809 Loss: 0.8476788564209705\n", "Iteration: 810 Loss: 0.8476788564209705\n", "Iteration: 811 Loss: 0.8476788564209705\n", "Iteration: 812 Loss: 0.8476788564209705\n", "Iteration: 813 Loss: 0.8476788564209705\n", "Iteration: 814 Loss: 0.8476788564209705\n", "Iteration: 815 Loss: 0.8476788564209705\n", "Iteration: 816 Loss: 0.8476788564209705\n", "Iteration: 817 Loss: 0.8476788564209705\n", "Iteration: 818 Loss: 0.8476788564209705\n", "Iteration: 819 Loss: 0.8476788564209705\n", "Iteration: 820 Loss: 0.8476788564209705\n", "Iteration: 821 Loss: 0.8476788564209705\n", "Iteration: 822 Loss: 0.8476788564209705\n", "Iteration: 823 Loss: 0.8476788564209705\n", "Iteration: 824 Loss: 0.8476788564209705\n", "Iteration: 825 Loss: 0.8476788564209705\n", "Iteration: 826 Loss: 0.8476788564209705\n", "Iteration: 827 Loss: 0.8476788564209705\n", "Iteration: 828 Loss: 0.8476788564209705\n", "Iteration: 829 Loss: 0.8476788564209705\n", "Iteration: 830 Loss: 0.8476788564209705\n", "Iteration: 831 Loss: 0.8476788564209705\n", "Iteration: 832 Loss: 0.8476788564209705\n", "Iteration: 833 Loss: 0.8476788564209705\n", "Iteration: 834 Loss: 0.8476788564209705\n", "Iteration: 835 Loss: 0.8476788564209705\n", "Iteration: 836 Loss: 0.8476788564209705\n", "Iteration: 837 Loss: 0.8476788564209705\n", "Iteration: 838 Loss: 0.8476788564209705\n", "Iteration: 839 Loss: 0.8476788564209705\n", "Iteration: 840 Loss: 0.8476788564209705\n", "Iteration: 841 Loss: 0.8476788564209705\n", "Iteration: 842 Loss: 0.8476788564209705\n", "Iteration: 843 Loss: 0.8476788564209705\n", "Iteration: 844 Loss: 0.8476788564209705\n", "Iteration: 845 Loss: 0.8476788564209705\n", "Iteration: 846 Loss: 0.8476788564209705\n", "Iteration: 847 Loss: 0.8476788564209705\n", "Iteration: 848 Loss: 0.8476788564209705\n", "Iteration: 849 Loss: 0.8476788564209705\n", "Iteration: 850 Loss: 0.8476788564209705\n", "Iteration: 851 Loss: 0.8476788564209705\n", "Iteration: 852 Loss: 0.8476788564209705\n", "Iteration: 853 Loss: 0.8476788564209705\n", "Iteration: 854 Loss: 0.8476788564209705\n", "Iteration: 855 Loss: 0.8476788564209705\n", "Iteration: 856 Loss: 0.8476788564209705\n", "Iteration: 857 Loss: 0.8476788564209705\n", "Iteration: 858 Loss: 0.8476788564209705\n", "Iteration: 859 Loss: 0.8476788564209705\n", "Iteration: 860 Loss: 0.8476788564209705\n", "Iteration: 861 Loss: 0.8476788564209705\n", "Iteration: 862 Loss: 0.8476788564209705\n", "Iteration: 863 Loss: 0.8476788564209705\n", "Iteration: 864 Loss: 0.8476788564209705\n", "Iteration: 865 Loss: 0.8476788564209705\n", "Iteration: 866 Loss: 0.8476788564209705\n", "Iteration: 867 Loss: 0.8476788564209705\n", "Iteration: 868 Loss: 0.8476788564209705\n", "Iteration: 869 Loss: 0.8476788564209705\n", "Iteration: 870 Loss: 0.8476788564209705\n", "Iteration: 871 Loss: 0.8476788564209705\n", "Iteration: 872 Loss: 0.8476788564209705\n", "Iteration: 873 Loss: 0.8476788564209705\n", "Iteration: 874 Loss: 0.8476788564209705\n", "Iteration: 875 Loss: 0.8476788564209705\n", "Iteration: 876 Loss: 0.8476788564209705\n", "Iteration: 877 Loss: 0.8476788564209705\n", "Iteration: 878 Loss: 0.8476788564209705\n", "Iteration: 879 Loss: 0.8476788564209705\n", "Iteration: 880 Loss: 0.8476788564209705\n", "Iteration: 881 Loss: 0.8476788564209705\n", "Iteration: 882 Loss: 0.8476788564209705\n", "Iteration: 883 Loss: 0.8476788564209705\n", "Iteration: 884 Loss: 0.8476788564209705\n", "Iteration: 885 Loss: 0.8476788564209705\n", "Iteration: 886 Loss: 0.8476788564209705\n", "Iteration: 887 Loss: 0.8476788564209705\n", "Iteration: 888 Loss: 0.8476788564209705\n", "Iteration: 889 Loss: 0.8476788564209705\n", "Iteration: 890 Loss: 0.8476788564209705\n", "Iteration: 891 Loss: 0.8476788564209705\n", "Iteration: 892 Loss: 0.8476788564209705\n", "Iteration: 893 Loss: 0.8476788564209705\n", "Iteration: 894 Loss: 0.8476788564209705\n", "Iteration: 895 Loss: 0.8476788564209705\n", "Iteration: 896 Loss: 0.8476788564209705\n", "Iteration: 897 Loss: 0.8476788564209705\n", "Iteration: 898 Loss: 0.8476788564209705\n", "Iteration: 899 Loss: 0.8476788564209705\n", "Iteration: 900 Loss: 0.8476788564209705\n", "Iteration: 901 Loss: 0.8476788564209705\n", "Iteration: 902 Loss: 0.8476788564209705\n", "Iteration: 903 Loss: 0.8476788564209705\n", "Iteration: 904 Loss: 0.8476788564209705\n", "Iteration: 905 Loss: 0.8476788564209705\n", "Iteration: 906 Loss: 0.8476788564209705\n", "Iteration: 907 Loss: 0.8476788564209705\n", "Iteration: 908 Loss: 0.8476788564209705\n", "Iteration: 909 Loss: 0.8476788564209705\n", "Iteration: 910 Loss: 0.8476788564209705\n", "Iteration: 911 Loss: 0.8476788564209705\n", "Iteration: 912 Loss: 0.8476788564209705\n", "Iteration: 913 Loss: 0.8476788564209705\n", "Iteration: 914 Loss: 0.8476788564209705\n", "Iteration: 915 Loss: 0.8476788564209705\n", "Iteration: 916 Loss: 0.8476788564209705\n", "Iteration: 917 Loss: 0.8476788564209705\n", "Iteration: 918 Loss: 0.8476788564209705\n", "Iteration: 919 Loss: 0.8476788564209705\n", "Iteration: 920 Loss: 0.8476788564209705\n", "Iteration: 921 Loss: 0.8476788564209705\n", "Iteration: 922 Loss: 0.8476788564209705\n", "Iteration: 923 Loss: 0.8476788564209705\n", "Iteration: 924 Loss: 0.8476788564209705\n", "Iteration: 925 Loss: 0.8476788564209705\n", "Iteration: 926 Loss: 0.8476788564209705\n", "Iteration: 927 Loss: 0.8476788564209705\n", "Iteration: 928 Loss: 0.8476788564209705\n", "Iteration: 929 Loss: 0.8476788564209705\n", "Iteration: 930 Loss: 0.8476788564209705\n", "Iteration: 931 Loss: 0.8476788564209705\n", "Iteration: 932 Loss: 0.8476788564209705\n", "Iteration: 933 Loss: 0.8476788564209705\n", "Iteration: 934 Loss: 0.8476788564209705\n", "Iteration: 935 Loss: 0.8476788564209705\n", "Iteration: 936 Loss: 0.8476788564209705\n", "Iteration: 937 Loss: 0.8476788564209705\n", "Iteration: 938 Loss: 0.8476788564209705\n", "Iteration: 939 Loss: 0.8476788564209705\n", "Iteration: 940 Loss: 0.8476788564209705\n", "Iteration: 941 Loss: 0.8476788564209705\n", "Iteration: 942 Loss: 0.8476788564209705\n", "Iteration: 943 Loss: 0.8476788564209705\n", "Iteration: 944 Loss: 0.8476788564209705\n", "Iteration: 945 Loss: 0.8476788564209705\n", "Iteration: 946 Loss: 0.8476788564209705\n", "Iteration: 947 Loss: 0.8476788564209705\n", "Iteration: 948 Loss: 0.8476788564209705\n", "Iteration: 949 Loss: 0.8476788564209705\n", "Iteration: 950 Loss: 0.8476788564209705\n", "Iteration: 951 Loss: 0.8476788564209705\n", "Iteration: 952 Loss: 0.8476788564209705\n", "Iteration: 953 Loss: 0.8476788564209705\n", "Iteration: 954 Loss: 0.8476788564209705\n", "Iteration: 955 Loss: 0.8476788564209705\n", "Iteration: 956 Loss: 0.8476788564209705\n", "Iteration: 957 Loss: 0.8476788564209705\n", "Iteration: 958 Loss: 0.8476788564209705\n", "Iteration: 959 Loss: 0.8476788564209705\n", "Iteration: 960 Loss: 0.8476788564209705\n", "Iteration: 961 Loss: 0.8476788564209705\n", "Iteration: 962 Loss: 0.8476788564209705\n", "Iteration: 963 Loss: 0.8476788564209705\n", "Iteration: 964 Loss: 0.8476788564209705\n", "Iteration: 965 Loss: 0.8476788564209705\n", "Iteration: 966 Loss: 0.8476788564209705\n", "Iteration: 967 Loss: 0.8476788564209705\n", "Iteration: 968 Loss: 0.8476788564209705\n", "Iteration: 969 Loss: 0.8476788564209705\n", "Iteration: 970 Loss: 0.8476788564209705\n", "Iteration: 971 Loss: 0.8476788564209705\n", "Iteration: 972 Loss: 0.8476788564209705\n", "Iteration: 973 Loss: 0.8476788564209705\n", "Iteration: 974 Loss: 0.8476788564209705\n", "Iteration: 975 Loss: 0.8476788564209705\n", "Iteration: 976 Loss: 0.8476788564209705\n", "Iteration: 977 Loss: 0.8476788564209705\n", "Iteration: 978 Loss: 0.8476788564209705\n", "Iteration: 979 Loss: 0.8476788564209705\n", "Iteration: 980 Loss: 0.8476788564209705\n", "Iteration: 981 Loss: 0.8476788564209705\n", "Iteration: 982 Loss: 0.8476788564209705\n", "Iteration: 983 Loss: 0.8476788564209705\n", "Iteration: 984 Loss: 0.8476788564209705\n", "Iteration: 985 Loss: 0.8476788564209705\n", "Iteration: 986 Loss: 0.8476788564209705\n", "Iteration: 987 Loss: 0.8476788564209705\n", "Iteration: 988 Loss: 0.8476788564209705\n", "Iteration: 989 Loss: 0.8476788564209705\n", "Iteration: 990 Loss: 0.8476788564209705\n", "Iteration: 991 Loss: 0.8476788564209705\n", "Iteration: 992 Loss: 0.8476788564209705\n", "Iteration: 993 Loss: 0.8476788564209705\n", "Iteration: 994 Loss: 0.8476788564209705\n", "Iteration: 995 Loss: 0.8476788564209705\n", "Iteration: 996 Loss: 0.8476788564209705\n", "Iteration: 997 Loss: 0.8476788564209705\n", "Iteration: 998 Loss: 0.8476788564209705\n", "Iteration: 999 Loss: 0.8476788564209705\n", "Iteration: 1000 Loss: 0.8476788564209705\n" ] } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "# Perform gradient descent to train the model\n", "learning_rate = 0.01\n", "num_iterations = 1000\n", "coefficients, y_pred_test = gradient_descent(X_train, y_train, X_test, y_test, learning_rate, num_iterations)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Model Evaluation\n", "After training the linear regression model, it is important to evaluate its performance to assess how well it is able to make predictions. In this section, we will discuss some commonly used evaluation metrics for regression models.\n", "\n", "When evaluating a machine learning model, we often use certain metrics to measure its performance. Here are some commonly used metrics and plotting methods:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mean Squared Error: 0.6536995137169997\n", "Mean Absolute Error: 0.5913425779189757\n", "R-squared: 0.8072059636181399\n" ] } ], "source": [ "from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score\n", "\n", "# Make predictions on the test set\n", "y_pred = model.predict(X_test)\n", "\n", "# Compute the evaluation metrics\n", "mse = mean_squared_error(y_test, y_pred)\n", "mae = mean_absolute_error(y_test, y_pred)\n", "r2 = r2_score(y_test, y_pred)\n", "\n", "print(\"Mean Squared Error:\", mse)\n", "print(\"Mean Absolute Error:\", mae)\n", "print(\"R-squared:\", r2)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The scatter plot shows the relationship between the features (X) and the actual values (blue dots), along with the predicted values (red line). This visualization helps us understand how well the model captures the underlying patterns in the data." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAHHCAYAAABKudlQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABvEklEQVR4nO3deVxUVf8H8M+ArAKDmrIoIaGpuC9poGYWBubjUplmmlhmpvaYqaX2ewpJS00rH1usrLDSLCu3ehIV19zCXEqlTBGXFDVRGVFBnTm/P64zOswMzMDM3HtnPu/Xi5fOvXfunDsD3C/nfM/3aIQQAkREREQq5SN3A4iIiIiqgsEMERERqRqDGSIiIlI1BjNERESkagxmiIiISNUYzBAREZGqMZghIiIiVWMwQ0RERKrGYIaIiIhUjcEMkcodOXIEGo0G8+fPl7spVAVDhgxB/fr15W4GkSoxmCFSsPnz50Oj0eDXX3+VuykuM3nyZGg0GtOXn58f6tevj9GjR+PChQtyN4+IVKCa3A0goqqJjY3FlStX4OfnJ3dTqmTu3LkICQnBpUuXsHbtWrz77rvYtWsXNm/eLHfT3GLevHkwGAxyN4NIlRjMEKmcRqNBYGCg3M0o1+XLlxEcHFzuMX379sVtt90GABg+fDgee+wxfPPNN8jJyUH79u3d0UwAgMFgwNWrV93+nqo9GCWSE4eZiFTOWs7MkCFDEBISghMnTqBPnz4ICQlB7dq1MX78eOj1erPnGwwGzJ49G02bNkVgYCAiIiIwfPhwnD9/3uy45cuXo0ePHoiOjkZAQADi4+MxZcoUi/Pde++9aNasGXbu3Il77rkHwcHBePnllx2+rs6dOwMA8vLyzLb/8ssvSE1NhVarRXBwMLp06YItW7ZYPH/Dhg1o164dAgMDER8fj48++sg0pHUrjUaD5557DgsXLkTTpk0REBCArKwsAMCJEyfw1FNPISIiAgEBAWjatCk+++wzi9d699130bRpUwQHB6NGjRpo164dvvrqK9P+ixcvYsyYMahfvz4CAgJQp04ddOvWDbt27TIdYy1n5tKlSxg3bhxiYmIQEBCARo0aYdasWRBCWL2GZcuWoVmzZqa2Gq+DyNOxZ4bIQ+n1eqSkpKBDhw6YNWsWsrOz8dZbbyE+Ph4jRowwHTd8+HDMnz8fTz75JEaPHo38/Hy899572L17N7Zs2WLqMZg/fz5CQkIwduxYhISEYN26dXj11Veh0+kwc+ZMs9cuLCxE9+7d8dhjj2HQoEGIiIhwuP1HjhwBANSoUcO0bd26dejevTvatm2L9PR0+Pj4IDMzE/fddx9+/vlnUw/O7t27kZqaiqioKGRkZECv1+O1115D7dq1rb7WunXrsHjxYjz33HO47bbbUL9+fZw+fRp33323KVCoXbs2Vq5ciaFDh0Kn02HMmDEApOGh0aNHo2/fvnj++edRUlKC33//Hb/88gsef/xxAMCzzz6L7777Ds899xwSEhJQWFiIzZs3448//kCbNm2stkkIgV69emH9+vUYOnQoWrVqhVWrVuHFF1/EiRMn8M4775gdv3nzZixZsgQjR45EaGgo5syZg0ceeQTHjh1DrVq1HH7/iVRFEJFiZWZmCgBix44dNo/Jz88XAERmZqZpW1pamgAgXnvtNbNjW7duLdq2bWt6/PPPPwsAYuHChWbHZWVlWWy/fPmyxWsPHz5cBAcHi5KSEtO2Ll26CADiww8/tOsa09PTBQBx4MAB8c8//4gjR46Izz77TAQFBYnatWuLS5cuCSGEMBgMomHDhiIlJUUYDAazdsXFxYlu3bqZtvXs2VMEBweLEydOmLYdPHhQVKtWTZT9tQdA+Pj4iP3795ttHzp0qIiKihJnz5412/7YY48JrVZrej969+4tmjZtWu41arVaMWrUqHKPSUtLE7GxsabHy5YtEwDE1KlTzY7r27ev0Gg04tChQ2bX4O/vb7btt99+EwDEu+++W+7rEnkCDjMRebBnn33W7HHnzp1x+PBh0+Nvv/0WWq0W3bp1w9mzZ01fbdu2RUhICNavX286NigoyPT/ixcv4uzZs+jcuTMuX76MP//80+x1AgIC8OSTTzrU1kaNGqF27dqoX78+nnrqKTRo0AArV6405drs2bMHBw8exOOPP47CwkJTWy9duoT7778fmzZtgsFggF6vR3Z2Nvr06YPo6GjT+Rs0aIDu3btbfe0uXbogISHB9FgIge+//x49e/aEEMLsvUlJSUFRUZFpiCg8PBx///03duzYYfPawsPD8csvv+DkyZN2vx8//fQTfH19MXr0aLPt48aNgxACK1euNNuenJyM+Ph40+MWLVogLCzM7PMm8lQcZiLyUIGBgRbDKjVq1DDLhTl48CCKiopQp04d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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "# Plot the scatter plot of the training set\n", "plt.scatter(X_train, y_train, label='Training Set')\n", "\n", "# Plot the scatter plot of the testing set\n", "plt.scatter(X_test, y_test, label='Testing Set')\n", "\n", "# Plot the line representing the predicted results\n", "plt.plot(X_test, y_pred_test, color='red', label='Predictions')\n", "\n", "# Set the title and labels for the chart\n", "plt.title('Linear Regression')\n", "plt.xlabel('X')\n", "plt.ylabel('y')\n", "\n", "# Add a legend\n", "plt.legend()\n", "\n", "# Display the chart\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "\n", "In this assignment, we implemented a simple linear regression model and trained and predicted using the from-scratch method. Through this implementation process, we gained a deeper understanding of the linear regression model and learned how to use gradient descent algorithm to minimize the loss function.\n", "\n", "We evaluated the performance of the model and used several common evaluation metrics to measure the accuracy of the model's predictions. Based on our results, the linear regression model performed well. The values of mean absolute error and root mean squared error were relatively small, indicating that the errors between the model's predictions and actual results were small. And the value of R-squared was close to 1, indicating that the model was able to explain the variability in the data well.\n", "\n", "Although our model performed well on this task, we also need to be aware of its limitations. Linear regression models assume a linear relationship between input features and target variables. If the data has a nonlinear relationship, the model may not fit the data well. In addition, it may also be affected by problems such as outliers and multicollinearity.\n", "\n", "To further improve the performance of the model, we can try the following directions for future work:\n", "- Consider using other types of regression models, such as polynomial regression or ridge regression, to explore more complex feature relationships.\n", "- Do more feature engineering, such as adding interaction features or introducing nonlinear transformations, to capture more complex patterns in the data.\n", "- Use regularization techniques to address problems such as overfitting and multicollinearity.\n", "- Collect more data or use data augmentation techniques to increase the size of the dataset and improve the generalization ability of the model.\n", "\n", "In conclusion, implementing a linear regression model from scratch is a great way to gain a deeper understanding of how machine learning algorithms work. We hope that this assignment has helped you to better understand the concepts and techniques involved in building and training machine learning models." ] } ], "metadata": { "kernelspec": { "display_name": "open-machine-learning-jupyter-book", "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.9.18" } }, "nbformat": 4, "nbformat_minor": 2 }