added complementary option to pw3

This commit is contained in:
Joachim Bach
2025-10-09 14:29:32 +02:00
parent 770d6678ce
commit c360807ab5

View File

@@ -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,