From c360807ab5e2851321033399fb6fd37a2fc33fd2 Mon Sep 17 00:00:00 2001 From: Joachim Bach Date: Thu, 9 Oct 2025 14:29:32 +0200 Subject: [PATCH] added complementary option to pw3 --- PW-3/ex3/ex3-review-questions-stud.ipynb | 108 +++++++++++++++++++++-- 1 file changed, 102 insertions(+), 6 deletions(-) diff --git a/PW-3/ex3/ex3-review-questions-stud.ipynb b/PW-3/ex3/ex3-review-questions-stud.ipynb index 123ca60..6f0f8fa 100644 --- a/PW-3/ex3/ex3-review-questions-stud.ipynb +++ b/PW-3/ex3/ex3-review-questions-stud.ipynb @@ -61,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "14aba0f7", "metadata": {}, "outputs": [], @@ -148,12 +148,108 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "id": "4de72736", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training data shape: (10000, 28, 28)\n", + "Training labels shape: (10000,)\n", + "Test data shape: (10000, 28, 28)\n", + "Test labels shape: (10000,)\n", + "(10000, 784) (10000, 784)\n", + "Accuracy score : 0.5711\n" + ] + } + ], "source": [ - "pass" + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import os\n", + "\n", + "\n", + "# This is a method to read the MNIST dataset from a ROOT directory\n", + "def load_MNIST(ROOT):\n", + " '''load all of mnist\n", + " training set first'''\n", + " Xtr = []\n", + " train = pd.read_csv(os.path.join(ROOT, 'mnist_train.csv'))\n", + " X = np.array(train.drop('label', axis=1))\n", + " Ytr = np.array(train['label'])\n", + " # With this for-loop we give the data a shape of the acctual image (28x28)\n", + " # instead of the shape in file (1x784)\n", + " for row in X:\n", + " Xtr.append(row.reshape(28,28))\n", + " # load test set second\n", + " Xte = []\n", + " test = pd.read_csv(os.path.join(ROOT, 'mnist_test.csv'))\n", + " X = np.array(test.drop('label', axis=1))\n", + " Yte = np.array(test['label'])\n", + " # same reshaping\n", + " for row in X:\n", + " Xte.append(row.reshape(28,28))\n", + " \n", + " return np.array(Xtr), np.array(Ytr), np.array(Xte), np.array(Yte)\n", + "\n", + "# Load the raw MNIST data.\n", + "mnist_dir = '' \n", + "X_train, y_train, X_test, y_test = load_MNIST(mnist_dir)\n", + "\n", + "# As a sanity check, we print out the size of the training and test data.\n", + "print('Training data shape: ', X_train.shape)\n", + "print('Training labels shape: ', y_train.shape)\n", + "print('Test data shape: ', X_test.shape)\n", + "print('Test labels shape: ', y_test.shape)\n", + "X_train = np.reshape(X_train, (X_train.shape[0], -1)) \n", + "X_test = np.reshape(X_test, (X_test.shape[0], -1)) \n", + "\n", + "print(X_train.shape, X_test.shape)\n", + "def predict_gaussian(X_test, mu, sigma2, priors):\n", + " n_samples = X_test.shape[0]\n", + " y_pred = np.zeros(n_samples)\n", + "\n", + " K, n_pixels = mu.shape\n", + " \n", + " for idx in range(n_samples):\n", + " x = X_test[idx]\n", + " proba_classes = np.zeros(K)\n", + "\n", + " for c in range(K):\n", + " log_likelihood = -0.5 * np.log(2 * np.pi * sigma2[c]) - ((x - mu[c])**2) / (2 * sigma2[c])\n", + " proba_classes[c] = np.log(priors[c]) + np.sum(log_likelihood)\n", + " \n", + " y_pred[idx] = np.argmax(proba_classes)\n", + "\n", + " return y_pred\n", + "classes = np.unique(y_train)\n", + "priors = np.array([np.mean(y_train == c) for c in classes])\n", + "\n", + "n_pixels = X_train.shape[1]\n", + "\n", + "mu = np.zeros((len(classes), n_pixels))\n", + "sigma2 = np.zeros((len(classes), n_pixels))\n", + "\n", + "for c in classes:\n", + " X_c = X_train[y_train == c]\n", + " mu[c, :] = X_c.mean(axis=0)\n", + " sigma2[c, :] = X_c.var(axis=0) + 1e-5\n", + " \n", + "y_pred = predict_gaussian(X_test, mu, sigma2, priors)\n", + "accuracy = np.mean(y_pred == y_test)\n", + "\n", + "print(\"Accuracy score :\", accuracy)" + ] + }, + { + "cell_type": "markdown", + "id": "07cb7aee", + "metadata": {}, + "source": [ + "The .57 accuracy observed here might prove that the method is not the right one for this type of problems, because if each pixel is a feature, the number of dimensions become way to big. This might also be caused by the fact that pixels are not uncorrelated." ] }, { @@ -199,7 +295,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -213,7 +309,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.12.3" } }, "nbformat": 4,