{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c5fa1d98",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-01-09T03:44:34.078853Z",
     "start_time": "2023-01-09T03:44:34.027269Z"
    }
   },
   "outputs": [],
   "source": [
    "#Load the packages\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.utils import shuffle\n",
    "from sklearn.model_selection import cross_val_score as CVS\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
    "\n",
    "from warnings import simplefilter\n",
    "simplefilter(action='ignore', category=FutureWarning)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c020c2c6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-01-09T03:44:36.231631Z",
     "start_time": "2023-01-09T03:44:36.210300Z"
    }
   },
   "outputs": [],
   "source": [
    "#Data Pre-process \n",
    "#limit the data range and normalize the data\n",
    "def Dataprocess(Data):\n",
    "    #limit the data range\n",
    "    P_Data = np.clip(Data,0,255)  \n",
    "    #normalize the data\n",
    "    M_Data = P_Data/255\n",
    "    return M_Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "d8369652",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "when K= 3 The mean accuracy= 0.8586714285714285\n",
      "when K= 5 The mean accuracy= 0.859842857142857\n",
      "when K= 7 The mean accuracy= 0.8578428571428572\n",
      "when K= 9 The mean accuracy= 0.8567857142857143\n",
      "when K= 11 The mean accuracy= 0.8554428571428572\n",
      "when K= 13 The mean accuracy= 0.8545\n",
      "when K= 15 The mean accuracy= 0.8520857142857142\n",
      "when K= 17 The mean accuracy= 0.8501857142857144\n",
      "when K= 19 The mean accuracy= 0.8493714285714287\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'mean Accuracy')"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2AAAAIhCAYAAAAo4dnZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB4CUlEQVR4nO3deZyO9f7H8dc9iy2MJRkipJISlahIIQ2yZknbQWhVSssp1WlxKu0ny6EFSamslVMynDYtp82hjRQSaXDsJMxy//64fkaTJcPMXLO8no/H/Zj7vu7vdd+f+z4d5u37vT7fSDQajSJJkiRJynUxYRcgSZIkSUWFAUySJEmS8ogBTJIkSZLyiAFMkiRJkvKIAUySJEmS8ogBTJIkSZLyiAFMkiRJkvKIAUySJEmS8ogBTJIkSZLyiAFMkpSrhg0bRiQSoV69emGXogMQiUS47rrr9jh+zz33EIlEuOaaa8jIyAihMkkqHAxgkqRcNXbsWAC+/fZbPv3005CrUXZFo1EGDBjA4MGDuf322xk1ahQxMf76IEkHyz9BJUm55osvvuDLL7+kXbt2AIwZMybkivZt27ZtYZeQ76SlpdGrVy+GDx/Oo48+ypAhQ8IuSZIKPAOYJCnX7ApcDz30EE2aNOGVV17Za9BZuXIlV155JdWrV6dYsWJUrVqVbt26sXr16swxGzdu5Oabb+boo4+mePHiHHHEEZx//vl89913ALz33ntEIhHee++9LK+9bNkyIpEI48aNyzzWu3dvSpcuzddff01SUhJlypTh3HPPBWD27Nl06tSJatWqUaJECY455hiuuuoq1q5du0fd3333HRdffDGVK1emePHiHHXUUfTs2ZMdO3awbNky4uLi9hpa5syZQyQSYfLkyXv93v73v/9RrFgx/va3v+31PSORCMOGDQOC4HjLLbdQq1YtSpQoQYUKFTjttNN4+eWX9/raB2r79u107dqVl156idGjR3PLLbcc0utJkgJxYRcgSSqcfvvtN15++WUaNWpEvXr16NOnD/369WPy5Mn06tUrc9zKlStp1KgRqamp3HHHHdSvX59169aRnJzMhg0bqFy5Mlu2bOGss85i2bJl3HbbbZx++uls3bqVOXPmkJKSwvHHH5/t+nbu3EnHjh256qqruP3220lLSwNgyZIlnHnmmfTr14+EhASWLVvGE088wVlnncXXX39NfHw8AF9++SVnnXUWhx9+OIMHD+bYY48lJSWF6dOns3PnTmrWrEnHjh156qmn+Otf/0psbGzme48YMYKqVatywQUX7LW2SpUq0b59e55//nnuu+++LEv+nnvuOYoVK8all14KwE033cQLL7zA/fffzymnnMKvv/7KN998w7p167L9neyyZcsW2rZty8cff8zEiRPp2rXrQb+WJOkPopIk5YLx48dHgehTTz0VjUaj0S1btkRLly4dbdasWZZxffr0icbHx0cXLFiwz9caPHhwFIjOnj17n2PefffdKBB99913sxz/8ccfo0D0ueeeyzzWq1evKBAdO3bsfj9DRkZGNDU1NfrTTz9Fgejrr7+e+VzLli2j5cqVi65Zs+ZPa3r11Vczj61cuTIaFxcXve+++/b73tOnT48C0VmzZmUeS0tLi1atWjXatWvXzGP16tWLdu7ceb+vlR1A5u2ZZ57JsdeVJAVcgihJyhVjxoyhZMmSXHTRRQCULl2a7t2788EHH/DDDz9kjnvrrbdo0aIFdevW3edrvfXWWxx33HG0atUqR2vc28zOmjVruPrqq6levTpxcXHEx8dTo0YNABYuXAgEy/7ef/99LrzwQipVqrTP12/evDkNGjTgn//8Z+axp556ikgkwpVXXrnf2tq2bUtiYiLPPfdc5rHk5GR++eUX+vTpk3mscePGvPXWW9x+++289957/Pbbbwf24fejWbNmlCtXjvvuu4/Fixcf8utJknYzgEmSctzixYuZM2cO7dq1IxqNsnHjRjZu3Ei3bt2A3Z0RIbjeqVq1avt9vQMZk12lSpWibNmyWY5lZGSQlJTEtGnT+Otf/8rbb7/NZ599xieffAKQGW42bNhAenr6AdU0YMAA3n77bRYtWkRqairPPvss3bp1IzExcb/nxcXF8Ze//IVXX32VjRs3AjBu3DiqVKlC69atM8cNGzaM2267jddee40WLVpQoUIFOnfunCXkZlf9+vX597//zbZt2zjnnHP4/vvvD/q1JElZGcAkSTlu7NixRKNRpkyZQvny5TNvu7ohPv/886SnpwPB9U4///zzfl/vQMaUKFECgB07dmQ5vrfmGRDsd/VH33zzDV9++SWPPvoo119/Pc2bN6dRo0ZUrFgxy7gKFSoQGxv7pzUBXHLJJVSsWJF//vOfTJ48mVWrVtG/f/8/PQ/g8ssvZ/v27bzyyits2LCB6dOn07NnzyzXkx122GHcd999fPfdd6xatYpRo0bxySef0KFDhwN6j31p2LAh//73v9m+fTstWrRg0aJFh/R6kqSAAUySlKPS09N5/vnnqV27Nu++++4et5tvvpmUlBTeeustIFhq9+677+73F/y2bdvy/fff88477+xzTM2aNQH46quvshyfPn36Ade+K5QVL148y/Gnn346y+OSJUtyzjnnMHny5H0GvF1KlCjBlVdeyfPPP88TTzzBySefTNOmTQ+onrp163L66afz3HPP8dJLL7Fjxw4uv/zyfY6vXLkyvXv35uKLL2bRokWH3Fr/1FNP5e2332bHjh20aNEis+OkJOng2QVRkpSj3nrrLX755Rcefvhhmjdvvsfz9erVY8SIEYwZM4b27dszePBg3nrrLc4++2zuuOMOTjrpJDZu3MjMmTO56aabOP7447nxxhuZOHEinTp14vbbb6dx48b89ttvvP/++7Rv354WLVqQmJhIq1atGDJkCOXLl6dGjRq8/fbbTJs27YBrP/7446lduza333470WiUChUq8K9//YvZs2fvMXZXZ8TTTz+d22+/nWOOOYbVq1czffp0nn76acqUKZM59tprr+WRRx5h7ty5jB49OlvfZ58+fbjqqqv45ZdfaNKkCXXq1Mny/Omnn0779u2pX78+5cuXZ+HChbzwwguceeaZlCpVCoDx48fTp08fxo4dS8+ePbP1/ieffDJvv/025557Li1atOCdd97Z7/V6kqT9cwZMkpSjxowZQ7FixfY5U3P44YdzwQUX8MYbb7B69WqOPPJIPvvsM9q3b89DDz1EmzZtuP7669m0aRMVKlQAoEyZMnz44Yf07duXZ555hnbt2nHFFVewaNEiqlatmvnaL7zwAueeey633XYb3bt3Z+XKldnaDys+Pp5//etfHHfccVx11VVcfPHFrFmzhn//+997jG3QoAGfffYZDRs2ZNCgQbRp04bbbruN4sWLU6xYsSxjjzzySM466ywqVKjAJZdccsD1AFx00UWULFmSn3/+ea/facuWLZk+fTqXX345SUlJPPLII/Ts2ZN//etfmWMyMjJIT08nIyMjW+/9+8/6zjvvkJaWRosWLViwYMFBvY4kCSLRaDQadhGSJBVma9asoUaNGlx//fU88sgjYZcjSQqRSxAl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0v7FhV2AJEnSoZg/H155JQhilSrB0KG4N5ikfOugAlhGRgaLFy9mzZo1ZPzhn5rOPvvsHClMkiTpQDRqBM8/D5dcAsOHQ+XKcOedYVclSXuX7QD2ySefcMkll/DTTz/xx8vHIpEI6enpOVacJEnSgbj4Yvjf/+CGG+Cuu4IQ1q9f2FVJ0p6yHcCuvvpqTjvtNN58802qVKlCxDl+SZKUDwwYAKtXw4MPwlVXweGHQ+fOYVclSVlluwviYYcdxpdffskxxxyTWzUVCHZBlCQp/4lG4corYfRoKFsWfvwxaF8vSbkpV7sgnn766SxevPigi/ujkSNHUqtWLUqUKEHDhg354IMP9jt+woQJNGjQgFKlSlGlShUuv/xy1q1bl/n8uHHjiEQie9y2b9++19cbMmQIkUiEG2+8Mcc+kyRJCkckAqNGwWWXwdSphi9J+U+2lyBef/313HzzzaxatYqTTjqJ+D9suFG/fv0Dfq2JEydy4403MnLkSJo2bcrTTz9N27ZtWbBgAUcdddQe4z/88EN69uzJP/7xDzp06MDKlSu5+uqr6devH6+++mrmuLJly7Jo0aIs55YoUWKP1/v888955plnslWzJEnK3+Li4IUXwq5CkvYu2wGsa9euAPTp0yfzWCQSIRqNZrsJxxNPPEHfvn3p9/9XyT755JMkJyczatQohgwZssf4Tz75hJo1azJgwAAAatWqxVVXXcUjjzySZVwkEiExMXG/771161YuvfRSnn32We6///4DrlmSJBUs330H110HL70ERxwRdjWSirpsL0H88ccf97gtXbo08+eB2rlzJ3PnziUpKSnL8aSkJD7++OO9ntOkSRN+/vlnZsyYQTQaZfXq1UyZMoV27dplGbd161Zq1KhBtWrVaN++PfPmzdvjtfr370+7du1o1arVAdW7Y8cONm/enOUmSZLyt2g0WI749ttw/vmwZUvYFUkq6rI9A1ajRo0ceeO1a9eSnp5O5cqVsxyvXLkyq1at2us5TZo0YcKECfTo0YPt27eTlpZGx44dGT58eOaY448/nnHjxnHSSSexefNmhg4dStOmTfnyyy859thjAXjllVeYO3cuX3zxxQHXO2TIEO67776D+KSSJCkskUgw89W0KcydC126wBtvQPHiYVcmqag6qI2YARYsWMDy5cvZuXNnluMdO3bM1uv8sY39rqWM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Z98vQJs2bbL8mTxjxow8rLDg+7Pv+PffbUpKCmPHjiUSidC1a9c8rrRg2t/3G41G6dy5M0uXLuX1119n3rx51KhRg1atWvHrr7+GUO0BiKpQKV++fHT06NFhl1Eo3HPPPdEGDRqEXUaRccMNN0Rr164dzcjICLuUQmHbtm3R2NjY6BtvvJHleIMGDaJ33nlnSFUVDkD01Vdf3etzP/74YxSIzps3L09rKkz29/3usmnTpigQ/fe//503RRUie/t+e/XqFe3UqVMo9RRGB/LfcKdOnaItW7bMm4IKmT9+v4sWLYoC0W+++SbzWFpaWrRChQrRZ599NoQK/5wzYIVEeno6r7zyCr/++itnnnlm2OUUGj/88ANVq1alVq1aXHTRRSxdujTskgqlnTt38uKLL9KnTx8ikUjY5RQKaWlppKenU6JEiSzHS5YsyYcffhhSVdKh27lzJ8888wwJCQk0aNAg7HIKjffee48jjjiC4447jiuuuII1a9aEXVKhtXr1at5880369u0bdimFwo4dOwCy/H0XGxtLsWLF8u3fdwawAu7rr7+mdOnSFC9enKuvvppXX32VE044IeyyCoXTTz+d8ePHk5yczLPPPsuqVato0qQJ69atC7u0Que1115j48aN9O7dO+xSCo0yZcpw5pln8ve//51ffvmF9PR0XnzxRT799FNSUlLCLk/KtjfeeIPSpUtTokQJ/vGPfzB79mwOP/zwsMsqFNq2bcuECRN45513ePzxx/n8889p2bJl5i+2ylnPP/88ZcqUoUuXLmGXUigcf/zx1KhRg0GDBrFhwwZ27tzJQw89xKpVq/Lt33cGsAKuTp06zJ8/n08++YRrrrmGXr16sWDBgrDLKhTatm1L165dOemkk2jVqhVvvvkmEPzBqZw1ZswY2rZtS9WqVcMupVB54YUXiEajHHnkkRQvXpxhw4ZxySWXEBsbG3ZpUra1aNGC+fPn8/HHH9OmTRsuvPBCZ2lySI8ePWjXrh316tWjQ4cOvPXWW3z//feZf+8pZ40dO5ZLL710jxUKOjjx8fFMnTqV77//ngoVKlCqVCnee+892rZtm2//vjOAFXDFihXjmGOO4bTTTmPIkCE0aNCAoUOHhl1WoXTYYYdx0kkn5euuOgXRTz/9xL///W/69esXdimFTu3atXn//ffZunUrK1as4LPPPiM1NZVa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\n",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#This cell is to train and tune the models to find the best K\n",
    "\n",
    "#Import the original data\n",
    "M_Train = pd.read_csv('fashion-mnist_train.csv')\n",
    "M_Test = pd.read_csv('fashion-mnist_test.csv')\n",
    "#Merge the data\n",
    "Total = pd.concat([M_Train,M_Test])\n",
    "Total_array = np.array(Total)\n",
    "#shuffle the merged data by row \n",
    "TotalMat = shuffle(Total_array)\n",
    "#Separate pixel values from labels\n",
    "x = TotalMat[:,1:785]\n",
    "y= TotalMat[:,0]\n",
    "\n",
    "accuracy = []\n",
    "#Go through all K values from 3 to 21\n",
    "for i in range(3,21,2):\n",
    "    #create a KNN model\n",
    "    KNN = KNeighborsClassifier(n_neighbors = i)\n",
    "    #K-fold cross validation\n",
    "    cvresult = CVS(KNN, x, y, cv = 10)\n",
    "    #print the mean accuracy each time\n",
    "    print('when K=',i,'The mean accuracy=',cvresult.mean())\n",
    "    #record the mean accuracy each time\n",
    "    accuracy.append(cvresult.mean())\n",
    "\n",
    "#Draw the image according to the accuracy of the classifier under different K values\n",
    "K = np.arange(3,21,2).astype(dtype=str)    \n",
    "plt.figure(figsize=(10,6))\n",
    "plt.plot(K,accuracy,color='blue', linestyle='dashed', marker='o',\n",
    "         markerfacecolor='red', markersize=10)\n",
    "plt.title('Accuracy vs. K')\n",
    "plt.xlabel('Different K')\n",
    "plt.ylabel('mean Accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c3304d0a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-01-10T06:47:05.110318Z",
     "start_time": "2023-01-10T06:46:37.047952Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion Matrix: \n",
      "[[874   1  16  11   5   0  86   2   5   0]\n",
      " [  4 965   7  14   1   0   9   0   0   0]\n",
      " [ 18   0 808  14  98   0  61   0   1   0]\n",
      " [ 36  11  14 882  32   0  25   0   0   0]\n",
      " [  4   0  99  26 799   0  70   0   2   0]\n",
      " [  1   0   1   1   0 816   8  98   4  71]\n",
      " [202   1 114  16  74   0 583   0  10   0]\n",
      " [  0   0   0   0   0   1   0 945   0  54]\n",
      " [  2   1  14   2   6   1  13   5 953   3]\n",
      " [  0   0   0   0   0   2   0  34   0 964]]\n",
      "\n",
      "\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.77      0.87      0.82      1000\n",
      "           1       0.99      0.96      0.98      1000\n",
      "           2       0.75      0.81      0.78      1000\n",
      "           3       0.91      0.88      0.90      1000\n",
      "           4       0.79      0.80      0.79      1000\n",
      "           5       1.00      0.82      0.90      1000\n",
      "           6       0.68      0.58      0.63      1000\n",
      "           7       0.87      0.94      0.91      1000\n",
      "           8       0.98      0.95      0.97      1000\n",
      "           9       0.88      0.96      0.92      1000\n",
      "\n",
      "    accuracy                           0.86     10000\n",
      "   macro avg       0.86      0.86      0.86     10000\n",
      "weighted avg       0.86      0.86      0.86     10000\n",
      "\n",
      "mean accuracy= 0.8589\n"
     ]
    }
   ],
   "source": [
    "#This cell is to evaluate the best KNN classifier\n",
    "\n",
    "#Get the original train set\n",
    "M_Train_array = np.array(M_Train)\n",
    "TrainMat = M_Train_array[:,1:785]\n",
    "TrainMat = Dataprocess(TrainMat)\n",
    "TrainLabel = M_Train_array[:,0]\n",
    "##Get the original test set\n",
    "M_Test_array = np.array(M_Test)\n",
    "TestMat = M_Test_array[:,1:785]\n",
    "TestMat = Dataprocess(TestMat)\n",
    "TestLabel = M_Test_array[:,0]\n",
    "\n",
    "#select K as 5 to create the KNN model\n",
    "BKNN = KNeighborsClassifier(n_neighbors=5)\n",
    "#train the model\n",
    "BKNN.fit(TrainMat,TrainLabel)\n",
    "#Calculate the confusion matrix\n",
    "PredLabel=BKNN.predict(TestMat)\n",
    "cm = confusion_matrix(y_true=TestLabel, y_pred=PredLabel)\n",
    "\n",
    "# Print confusion matrix\n",
    "print(\"Confusion Matrix: \")\n",
    "print(cm)\n",
    "print('\\n')\n",
    "# Print precision ,recall and accuracy\n",
    "print(classification_report(TestLabel,PredLabel))\n",
    "print('mean accuracy=', BKNN.score(TestMat,TestLabel))"
   ]
  }
 ],
 "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.10.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
