{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# KNN算法实现" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 读取数据 image label" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from numpy import *\n", "import operator\n", "import os\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib import cm\n", "from os import listdir\n", "from mpl_toolkits.mplot3d import Axes3D\n", "import struct\n", "\n", "#读取图片\n", "def read_image(file_name):\n", " #先用二进制方式把文件都读进来\n", " file_handle=open(file_name,\"rb\") #以二进制打开文档\n", " file_content=file_handle.read() #读取到缓冲区中\n", "\n", " offset=0\n", " head = struct.unpack_from('>IIII', file_content, offset) # 取前4个整数,返回一个元组\n", " offset += struct.calcsize('>IIII')\n", " imgNum = head[1] #图片数\n", " rows = head[2] #宽度\n", " cols = head[3] #高度\n", " # print(imgNum)\n", " # print(rows)\n", " # print(cols)\n", "\n", " #测试读取一个图片是否读取成功\n", " #im = struct.unpack_from('>784B', file_content, offset)\n", " #offset += struct.calcsize('>784B')\n", "\n", " images=np.empty((imgNum , 784))#empty,是它所常见的数组内的所有元素均为空,没有实际意义,它是创建数组最快的方法\n", " image_size=rows*cols#单个图片的大小\n", " fmt='>' + str(image_size) + 'B'#单个图片的format\n", "\n", " for i in range(imgNum):\n", " images[i] = np.array(struct.unpack_from(fmt, file_content, offset))\n", " # images[i] = np.array(struct.unpack_from(fmt, file_content, offset)).reshape((rows, cols))\n", " offset += struct.calcsize(fmt)\n", "\n", " return images\n", "\n", " '''bits = imgNum * rows * cols # data一共有60000*28*28个像素值\n", " bitsString = '>' + str(bits) + 'B' # fmt格式:'>47040000B'\n", " imgs = struct.unpack_from(bitsString, file_content, offset) # 取data数据,返回一个元组\n", " imgs_array=np.array(imgs).reshape((imgNum,rows*cols)) #最后将读取的数据reshape成 【图片数,图片像素】二维数组\n", " return imgs_array'''\n", "\n", "def read_label(file_name):\n", " file_handle = open(file_name, \"rb\") # 以二进制打开文档\n", " file_content = file_handle.read() # 读取到缓冲区中\n", "\n", " head = struct.unpack_from('>II', file_content, 0) # 取前2个整数,返回一个元组\n", " offset = struct.calcsize('>II')\n", "\n", " labelNum = head[1] # label数\n", " # print(labelNum)\n", " bitsString = '>' + str(labelNum) + 'B' # fmt格式:'>47040000B'\n", " label = struct.unpack_from(bitsString, file_content, offset) # 取data数据,返回一个元组\n", " return np.array(label)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# KNN Train" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# KNN算法\n", "def KNN(test_data, images, labels, k):\n", " # images.shape[0]表示的是读取矩阵第一维度的长度,代表行数60k\n", " dataSetSize = images.shape[0] # 60k\n", " # tile函数在行上重复dataSetSize次,在列上重复1次\n", " # 将test_data乘60k。再reshape成784行*60000列\n", " distance1 = tile(test_data, (dataSetSize)).reshape((dataSetSize,784))-images\n", " # 每个元素平方\n", " distance2 = distance1**2\n", " # 矩阵每行相加\n", " distance3 = distance2.sum(axis=1) # 合并成一行\n", " # 开方\n", " distances4 = distance3**0.5\n", " # 欧氏距离计算结束\n", " # 返回从小到大排序的索引\n", " sortedDistIndicies = distances4.argsort()\n", " classCount=np.zeros((10), np.int32) #10是代表10个类别\n", " for i in range(k): # 统计排在前k名的预测结果\n", " ## 找到图片对应的数据\n", " voteIlabel = labels[sortedDistIndicies[i]] \n", " ## 把这个Count + 1\n", " classCount[voteIlabel] += 1\n", "\n", " return np.argmax(classCount),sortedDistIndicies[0:k]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# KNN TEST(用于绘制misclassification rate)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def KNN_TEST(train_x,test_x,train_y,test_y,k): \n", " testNum = test_x.shape[0]\n", " print('测试图片数量:',testNum)\n", " errorCount = 0 # 判断错误的个数\n", " #error = []\n", " #error_image = []\n", " errorCount = 0 # 判断错误的个数\n", " for i in range(testNum):\n", " result,sortlist = KNN(test_x[i], train_x, train_y, k)\n", " # print('返回的结果是: %s, 真实结果是: %s' % (result, test_y[i]))\n", " if result != test_y[i]:\n", " errorCount += 1.0 # 如果mnist验证集的标签和本身标签不一样,则出错\n", " ##print('返回的结果是: %s, 真实结果是: %s' % (result, test_y[i]))\n", " ## 为了更加直观,只打印出错误的预测结果\n", " #error.append(test_y[i])\n", " #error_image.append(sortlist)\n", " error_rate = errorCount / float(testNum) # 计算出错率\n", " acc = 1.0 - error_rate\n", " #print(\"\\n正确预测率: %f\" % (acc))\n", " #print(\"\\n错误预测率: %f\" % (error_rate))\n", " #print(\"\\n错误预测的图片数量: %d\" % errorCount)\n", " #return error,error_image\n", " return error_rate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# KNN TEST(传入单张图片,输出K个最相似的图片)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def KNN_TEST_PRINT(train_x,test_x,train_y,test_y,test_id,k):\n", " result,sortlist = KNN(test_x[test_id], train_x, train_y, k)\n", " print('预测结果为:',result,'实际结果为:',test_y[test_id])\n", " #sortlist.append(test_id)\n", " ## 打印图片\n", " fig=plt.figure(figsize=(8,8))\n", " fig.subplots_adjust(left=0,right=1,bottom=0,top=1,hspace=0.05,wspace=0.05)\n", " for i in range(len(sortlist)):\n", " images = np.reshape(train_x[sortlist[i]], [28,28])\n", " ax=fig.add_subplot(6,5,i+1,xticks=[],yticks=[])\n", " ax.imshow(images,cmap=plt.cm.binary,interpolation='nearest')\n", " ax.text(0,7,str(train_y[sortlist[i]]))\n", " plt.show()\n", " plt.pause(5)##停留5秒\n", " plt.close(fig)##关闭图片" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 传入数据" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "train_image = \"MNIST/train-images-idx3-ubyte\"\n", "test_image = \"MNIST/t10k-images-idx3-ubyte\"\n", "train_label = \"MNIST/train-labels-idx1-ubyte\"\n", "test_label = \"MNIST/t10k-labels-idx1-ubyte\"\n", "# 读取数据\n", "train_x = read_image(train_image) # train_image\n", "test_x = read_image(test_image) # test_image\n", "train_y = read_label(train_label) # train_label\n", "test_y = read_label(test_label) # test_label" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 设置运行参数" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# 训练图片数\n", "trainNum = 6000\n", "# 测试图片数\n", "testNum = 100\n", "# 距离最小的k个图片\n", "k = 30\n", "\n", "train_Start = random.randint(0,60001-trainNum)\n", "train_End = train_Start+trainNum\n", "train_i = train_x[train_Start:train_End,:]\n", "train_l = train_y[train_Start:train_End]\n", "\n", "test_Start = random.randint(0,10001-testNum)\n", "## test_Start = 0\n", "test_End = test_Start+testNum\n", "test_i = test_x[test_Start:test_End,:]\n", "test_l = test_y[test_Start:test_End]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 运行" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": "预测结果为: 9 实际结果为: 9\n" }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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s2ZpvuyyyzSXNEYgVH2+9tprIa9ZtGiR5jFjxjiflS1bdrflRHh27Nih+eabb9Y8bNgw57yNGzdqDlWf8+fPd47PPfdczcOHD9ccfD4RX1u3btV8++23az7ooIOc86ZOnarZjrH84osvNJ944onONSeccILm6dOnaw6OL5k3b57m1atXa65ateru/wfAYcdivvLKK5pvvPFG57xt27Zpts+oXdfopptucq4pVaqUZjvI+9JLL42hxKnDFhsAAMBbNIQAAIC30qZrbOjQoc6xfTVru7+C7Gv0mjVrar744os1169f37mmQoUKmpctW6b5/fffd86z3XP5+fkhy4DdGzt2rGbbHWZfsYq4r1YbNGhQ7L3mzp3rHNupum+88Ybm4M/N/vvvH0GJUZINGzZofvjhh8O65qijjtJsp+YGuzDtK/1nnnlGM11jiWV/B9vhCLZbRcTtDrNatWql+eOPP3Y+s3X/73//W/PixYud8zp06KC5YsWKYZQaocyYMUPzVVddFfH1BQUFmhcuXOh8tm7dOs133nlnyPPat2+vuV69eprbtGkTcXkSiTdCAADAWzSEAACAt9Kma8yuJividmvYLhI7y0vEfcUe7hLltsvLrqQZnF1mVyxGbEaNGlXsn9uuTRGRp556arf3+vHHH51juzr1n3/+qfm8885zzmO6avRefPFF57hXr17FnmdXGhZxX5vbbo+3335bc3CmmV219ogjjtBsu8xE3OfddncjPP/973+dY7vCcOPGjTWffPLJEd/bdoOIuKtE21lnQT169NDMlhOxsSt9l+Rf//qXZjsD1D6vs2fPdq45//zzNf/www+aBw8e7Jxnj+2OAMGVx1ONN0IAAMBbNIQAAIC3aAgBAABvpbQT1q4CbFc1FXGnyj777LOa47Efy6effqr5999/17zHHm67sFy5cjF/F0p23XXXRXzNvvvu6xyHWrE4OIV32rRpmjt27Bjx9/rszTffdI7tarR2TI99VkVCLzuxa9cuzS1atHA+u++++zTbZRcOOeQQ57wqVapofvzxxzUffvjhxX4nXPbvVsQd63HDDTdojsc09ry8PM1FRUUhz/voo480d+/ePebv9UlwJ4TgMiN/CY7LHDFihObgv4F/sUseiIgce+yxmkePHh1ROdMRb4QAAIC3aAgBAABvpbRrzE6D/uOPP5zP7PR5O939yCOPjPh7CgsLneMnnngi4nsgNnbTxZdeeklz8PW8XZ02lFWrVjnHoV6179y50zkO/oyhZLYL+Z133gl5nl36oqQV2O1qxbbb8pprrnHOs5sir1mzJqyyrly5UnNJXWOffPKJZttdIyJSq1atsL4rW9i/s6Dc3NyY7j1u3Djn2E6XDtWVLSIyZ84czXbYAsMUdm/Tpk3O8dq1a4s9b+nSpc7x1Vdfrbl///6a7U4Nti5E3GVKSmI3uk7nleF5IwQAALxFQwgAAHgrpV1jduaOXUFWxF191K5sevfddzvn2RHw1apVK/Z77OrRIiJffPFF5IVFTIIrzf5l5MiRznHfvn2LPe/DDz/U/J///Mf5zG7cWtIr2+DrXZTMzuaqW7eu85ndLHPIkCGa7WwykdDda9u3bw/5vbars6RulHDZMh133HGaJ0yY4JznQ9eY/bsoaYXnyy+/POJ72xXee/fu7XxWpkwZzXYT7O+//945zw6X2LFjh2a6xnavbdu2zrGdSXnFFVdoDs4ms8f2WbYzw957772oymRXCu/WrVtU90gG3ggBAABv0RACAADeSptd7YKbctrXaHYhvOAMk8cee0xz+fLli7338uXL41BCxOLMM8/UPH/+fM3BhfpCdW9awc1xX3nlFc12ZkLwdfobb7yh+dRTT93t9/jOzviws/5E3K4xm2+55ZbEFyxCdkPW4cOHa65UqVIqipNStk7r1KnjfBZckC8Uuxim7Q676qqrNAcXYXz66ac12y7XYBnsopl2oU5E7vTTT9f85JNPav7666/Duj7a7rBMxBshAADgLRpCAADAWzSEAACAt9JmjFBwbIjdyG3SpEma7ZggkfCmwgenFdqxI7NmzYqonIhO8+bNNb/88suag6tE235pO7W2oKBAc7t27Zxr7M/OoYceqvnLL790zgu1yW88NpXMdjfeeKNzfMwxx2h+7rnnNC9btizkPQ488EDNLVu21BysJ7scQnCKe6xOO+20uN4v05Qu/fevfDu1WUTkgw8+0PzCCy9o7tSpk3PewIEDNY8ZM0az3Qz53Xffda5p2LChZrtTABLHrg4+ffp0zXZcl4jI+++/v9t7BcdynXXWWZqD/75mIt4IAQAAb9EQAgAA3kqbrrGg6tWra7abMNpVpkVEvv32293eq2nTps6x7Y6xr+hDbd6J+LLTloN1EzyO1LXXXqv5vPPOcz6zK0vHY8Vin9huj+Bx586dNQc3frSqVq0a1nddd911EZYO0Qiu5m8Fu0ItO7TATpnv06eP5gMOOCDk9bYrht+5ybHXXntpDnaJBo/D8X//938xlymd8EYIAAB4i4YQAADwVtp2jYUSnF12+OGHR3yP4Eylv9Bdkt3sxq92tWHET7jdXyWx3WsldZ3YTVLPPvvsmL/XN8Huq8LCQs3jxo3TbDc/FRE5/vjjNTdo0CDi77W/Z/mdm5l++OGHVBchrngjBAAAvEVDCAAAeIuGEAAA8FbGjRECSmJ3r95zzz2dzzZv3qz5jz/+0FymTJnEFwxhe/HFFzWXNIbklFNOSUJp/GHHX1522WUpKUOVKlVS8r3wG2+EAACAt2gIAQAAb9E1ZrDKaeZr1KiRZrsCroi7qeT69es177PPPokvGOKupFWskb7sCu9BdpVyIFl4IwQAALxFQwgAAHiLrjGDVU79sWXLFs10jWUmu2Ey0pudsfnss8+GPC8vLy8JpQFcvBECAADeoiEEAAC8RUMIAAB4izFC8NLLL7+s+Y477khhSRCt2rVrp7oICNMXX3yhecmSJZrr1KnjnNe+ffuklQn4C2+EAACAt2gIAQAAb9E1ZrCyNJA5unXrluoiIEx2VXe7TMkxxxyTiuIADt4IAQAAb9EQAgAA3vKya8zOVGjVqpXmX375xTnPHlerVi3xBUPSdOrUKdVFQAhlypTR/Oeff2quUKFCzPfetWuX5mBXeKlSpWK+P4r39ddfp7oIiKPevXtrHj16dApLEh+8EQIAAN6iIQQAALxFQwgAAHjLyzFC1atX19ygQQPNY8eOdc6zOyFPmTJFM6ufZr769eunuggI4a677tI8c+ZMzS+99JJzXjRjhr755hvN69atcz5jKnfiLFiwINVFQBwdcMABmu2/p4WFhc55GzZs0Lxjxw7NZcuWTWDpIscbIQAA4C0aQgAAwFtedo1Zxx13nObx48c7n/3666+a7atdusaAxOnXr1+xGZnr6KOP1rzHHn///+9zzz03FcVBjOyGx5deeqnm++67zzlvzJgxmo844gjNvXr1SmDpIscbIQAA4C0aQgAAwFved4317NlTs31lKyIyadIkzW3btk1amZAYdhZgPFYpRuZ54YUXNHfu3DmFJfHLM888k+oiIEFuv/12zcGusXbt2mnu3r170soUKd4IAQAAb9EQAgAA3qIhBAAAvOX9GCHr4osvLvEYmcWuagqIiDzyyCOpLgKQVcqVK6d5165dKSxJ9HgjBAAAvEVDCAAAeCunqKgo/JNzctaJyIrEFQcB9YqKimok6ubUZ9JRn9klofUpQp2mAM9odgmrPiNqCAEAAGQTusYAAIC3aAgBAABv0RACAADeimgdodzc3CK7XxMSa/ny5bJ+/fqcRN2f+kwu6jO7JLo+RajTZOMZzS7h1mdEDaG8vDyZN29e9KVCRNq0aZPQ+1OfyUV9ZpdE16cIdZpsPKPZJdz6pGsMAAB4i4YQAADwFg0hAADgLRpCAADAWzSEAACAt2gIAQAAb9EQAgAA3qIhBAAAvEVDCAAAeIuGEAAA8BYNIQAA4C0aQgAAwFs0hAAAgLdoCAEAAG/REAIAAN6KqiG0ePFiadmypf5XpUoVGTRoULzLhiQaPHiw5OfnS7NmzajLLMAzmn14RrML9Zk+SkdzUePGjeXLL78UEZGdO3dKnTp1pEuXLnEtGJJnwYIFMnToUJk7d66ULVtWjj/+eDnppJOkYcOGqS4aosQzml14RrML9ZleomoIWdOmTZP69etLvXr14lEepMCiRYukXbt2UqFCBRERKSgokAkTJkjfvn2TXpa3335b88CBA4s9p2nTps7xcccdp/n0009PTMEyGM9o5kunZxSxoz7TS8xjhEaPHi3nnHNOPMqCFMnPz5cZM2ZIYWGhbNu2TaZMmSKrVq1KdbEQJzyjmY9nNLtQn+klpjdCO3bskIkTJ4b8f+7IDE2bNpV+/fpJp06dpFKlStKiRQspXTrml4VIAzyj2YFnNLtQn+klpr/5t956S1q3bi21atWKV3nU+vXrNR9zzDGav/76a+e8M888U3Pjxo3DuvfFF1+suW7duprLlCkTcTmzRc+ePaVnz54iItK/f3/Zb7/9EvZd69at0xz8B9oOGszJydFcVFSkedasWc4177zzjmb7c3PZZZfFXtgMF69ndNeuXc7xH3/8ofmHH37Q/OKLLzrnLVu2TPPLL78c8fc+//zzmi+66CLnM/vz4YNkPqPWgw8+6Bzfe++9mjdu3FjsNaeeeqpzbLus7dtJfudGXp/2zdGAAQM0X3/99c55O3bs0LzPPvtoHjx4cMh7r169WrN9Xtu1a+ec9/HHHxd7vR2mICJy//33a27ZsmXI7021mBpCo0aN4pV7lli7dq3UrFlTVq5cKePHj5c5c+akukiIA57R7MEzml2oz/QRdUNo27ZtMnXqVBkyZEg8y4MU6dq1qxQWFkqZMmXkySeflL333jvVRUKMeEazC89odqE+00fUDaEKFSpIYWFhPMuCFJo5c2aqi4A44xnNLjyj2YX6TB9pMzpr8+bNznHHjh01B8cFWWPHjo34u+6++27NjRo10vzee+8559nxQ4jNjBkzNF9++eWaFy9e7Jz313RSEXdcwaJFizQHp89/+umnmq+44grNjBHave3btzvHdozVE088odmO6xLJVpLpAAAgAElEQVQReeGFF8K6vx0AWqVKlbCu2bZtm+a/xlCI/HM8Sffu3cO6H8Kzc+dOzXfccYfme+65xzlvjz3+nmy8//77a7ZjUt544w3nGns8adKkkPdmHZ3d23PPPTXfddddmvfdd1/nvPHjx2s+7LDDNNvxfSXd29bFaaed5pxnf2+sXLlS89SpU53z7HjcdB4jxBYbAADAWzSEAACAt9Kma2zr1q3O8VdffRXWdfZ1u30Nb1/zbtq0KeT13333neZOnTo5n9k+3Bo1aoRVHvxPsCulT58+mm13WHAK9EsvvaQ53C0hbrnlFs12Ov4JJ5wQ8t65ublh3Ttb2OUH7HT3zp07O+eFeu4qV67sHFevXl2znfYbnOJuu07CrU/7s/LYY49pnj59unPeueeeq9l21yA6dtaS7XIJss+b7ULbsmWL5tmzZzvXPPDAA5rtcIbgNOwRI0Zo7tChQxil9k+of4uC4wGvvvpqzbY7rGzZss55dnmafv36aS4oKAhZBnveggULNNt/T0VE2rZtG/Ie6YTfHgAAwFs0hAAAgLfSpmssXHaFTBH3FewBBxyg+ccff9QcnMFgV6u1XQHBGUz2vBtvvFFzqVKlIi22F2x32FFHHeV8Zv9uzzvvPM3BmV1HHnlkRN8jIvLaa69ptl1AdgNXEXd2g29dY7Y74uyzz9Yc/Fm2M0+qVaum2c5AERFp0KBBvIuoHn744WK/d9iwYc55t956q2bbBYfohJrObX+viohcd911xZ5nu0+PP/545zO74rCdNfrcc88559nhCZ9//rnm5s2bhyq21+wsz7POOsv5bM2aNZrtEITgxtSvvPJKTGUoV66cZjvrV0Tkm2++0Vy+fHnN6fb7lzdCAADAWzSEAACAt2gIAQAAb2XcGCE7bVfkn/3Xf7FjHa688krnM3tspw5+8MEHznk33XSTZjsV++CDD46gxP6YMGGC5uB4K9tH/eijj2qOpq84uGN9SdPx8T92vIXd06hHjx7OecGdxtPZoEGDND/yyCMpLEl2C07XjmZPLLu8gV2xfO7cuc55dszm5MmTNTNGqHjz5s3T/OGHH4Y8z/6bFeuYIBF3KZK+fftqtuOSguzYxHiUIZ54IwQAALxFQwgAAHgr47rG4q13796ag11j1uOPP6556NChCS1TprJ/L3Yau4g7ZTaa7rAVK1ZoDk6LD37X7v7cR3Zq7YUXXqg5uIFtJrE/B/fee69mu3EkYhdcLdh2wUSz+rPdsNNusIvEuf3222O6vn///s7xM888o3njxo1h3aOkbrNU440QAADwFg0hAADgrYzrGov35qdr166N6/3wP9HO3nr22Wc121lodtaTXU01+F3MGite69atU12EuKtatapmNl2Nnd2k8+WXX9ZsVwcWEbn++us129l6Rx99dFjf8/TTT2teunSp89lee+2luX379mHdz2d25mRJghuKh7Jr1y7NdnPd+++/3zkvmmEH9ucm3fDbAwAAeIuGEAAA8FbadI2VKVPGOc7Pz9f866+/araLHMaDHf1ekuCGdvinJk2aaLYLfYmIDBkyRLP9Ow92ZdlXrvazUH8e/MwKbsTJxpzZ5ZNPPtG8Y8cOzWXLlk1FcTJelSpVNNvFDLt37+6cN2vWLM1dunTR3KJFC83BTVftAnrBxVYt271G19juhfuzvnXrVs0VK1Z0Ptu0aZNmu6DqfffdF2PpXOn8XPJGCAAAeIuGEAAA8BYNIQAA4K20GSMUXG3Ybsb3yy+/aK5Tp07SymQ1btw4Jd+bSexGfMEVY19//fVirylpuvtBBx2k2U7rDE6VXrhwYbH3Yyo9EJ169eppfvPNN53PZs6cqXnkyJGaX331Vc0zZsyI6nvtxpzYPbvh6dSpU53Pfv/9d83//ve/NduxXCIis2fP1vz9998X+z0NGjRwju14H/v7N8j+HNlxv+mGN0IAAMBbNIQAAIC30qZrLKh8+fKa490dVlhYqNlOKwyqXbu25nLlysW1DNnutddec44XLVpU7GdvvPGGc57tIrVdbSVt1HrFFVdotitTL1++3Dlv5cqVYd0PwN/sas8iIieffLJmO00+3M2oDzjgAM122AMiZ5cYCG5GPX36dM3vvfee5mXLljnn7bPPPprbtm2r+dxzz9VcUFDgXFO5cmXN9t/GP/74wznP/uzsu+++If5XpB5vhAAAgLdoCAEAAG+lbddYItmN/tasWRPyvOOOO05zrVq1ElqmbNe0aVPNdjM/m+OBmWL+sKu92650JI/dESC4O4Blu2PsKuCIn2D3lT2+7bbb4vpdY8aM0fznn3/G9d6pwBshAADgLRpCAADAWzSEAACAt7wcI2Sn+O3cuTPkeT169EhGcRCjSy+9VLOdPh/clb5Nmzaa7UrVyEx2Om6pUqVSWBLszjfffKP5119/1Vy6tPtPUDpPscbfOnXqpNnWYXD6fKbgjRAAAPAWDSEAAOAtL7vGNm7cqLmklaV5TZt5Spo+37Vr1ySWBInGRsiZY9SoUcX+eXDFfrtSMtLX2LFjNWdqd5jFGyEAAOAtGkIAAMBbXnaNDRkyJNVFQILYmWLBWWNstJpd7ObJSG95eXmpLgLiaNu2bakuQlzxRggAAHiLhhAAAPAWDSEAAOAtL8cIrVu3rtg/D/ZjV6lSJQmlQTyVNH1+woQJmp9++ulkFAcJZHefR3o77LDDiv3z4E70c+bM2e01yBzHHXdcqosQFt4IAQAAb9EQAgAA3vKia2zmzJnO8Zdfflnsee3atXOOa9WqlbAyITFKmj6/du1azTNmzNB81FFHJb5gCNuSJUs02w06L7jgAue8Aw44IGllQmwqVqyouaRNOletWqWZrrHM16pVq1QXISy8EQIAAN6iIQQAALzlRdfY9u3bnePff/9ds329fueddyatTIifpk2bau7SpYtmO0tMxJ1R9u2332qmayy9PPHEE5rt6tGVKlVyzitVqlTSyoTYHHPMMZqrVaum2XZXi4js2rUraWVC4n3yySeazz777BSWpGS8EQIAAN6iIQQAALxFQwgAAHjLizFCDz30UMjPfvjhB807d+5MRnEQZxUqVNBsVzIdP358yGuCU+uRPt5+++1i//zQQw9NckmQCHYZhODv5hEjRmhO5zElCM+//vWvVBchLLwRAgAA3qIhBAAAvOVF11hw+rx1/PHHa27UqFEyioME6tq1q+bBgwc7ny1evLjYjMwQXBE+uNI0gOT46quvUl2EuOKNEAAA8BYNIQAA4C0vusaGDh3qHHfs2FGzXZ12jz1oF2a63NxczQsXLkxhSRCt9u3ba7YbsDJrLDu0adNGc+3atZ3POnXqlOziIAqhhpHYWbsi7qr/6Yx/+QEAgLdoCAEAAG/REAIAAN7yYoxQsD9z1apVKSoJgN0ZNmxYsRnZoVu3bsVmZI7//Oc/xeZMxRshAADgLRpCAADAWzmRbD6Zk5OzTkRWJK44CKhXVFRUI1E3pz6TjvrMLgmtTxHqNAV4RrNLWPUZUUMIAAAgm9A1BgAAvEVDCAAAeIuGEAAA8FZE6wjl5uYW5eXlJagoCFq+fLmsX78+J1H3pz6Ti/rMLomuTxHqNNl4RrNLuPUZUUMoLy9P5s2bF32pEBG7OWEiUJ/JRX1ml0TXpwh1mmw8o9kl3PqkawwAAHiLhhAAAPAWDSEAAOAtGkIAAMBbNIQAAIC3aAgBAABv0RACAADeoiEEAAC8RUMIAAB4i4YQAADwFg0hAADgLRpCAADAWzSEAACAt2gIAQAAb9EQAgAA3oqpIbRz505p1aqVdO7cOV7lQYoMHjxY8vPzpVmzZjJo0KBUFwdxwPOZXXhGs8fixYulZcuW+l+VKlWo0xSKqSE0ePBgadq0abzKghRZsGCBDB06VObOnSvz58+XSZMmyZIlS1JdLMSI5zN78Ixml8aNG8uXX34pX375pXz22WdSoUIF6dKlS6qL5a3S0V64evVqmTx5stx8883yyCOPxLNM/zBu3DjN33//vfNZv379Yrr3li1bNLdt2zbkefPmzdNcqVKlmL4z3SxatEjatWsnFSpUEBGRgoICmTBhgvTt2zfFJUO04vF8rlq1SvP+++8f8rzRo0dr7tatW1TfhZIl4xk9+eSTNU+aNElzTk6Oc169evU033bbbZrPOOMMzZUrV45bubLdtGnTpH79+s7fK5Ir6jdC1113nTzwwAOyxx4MM8p0+fn5MmPGDCksLJRt27bJlClTnH8EkXl4PrMLz2j2Gj16tJxzzjmpLobXovotOWnSJKlZs6Yccsgh8S4PUqBp06bSr18/6dSpkxx//PHSokULKV066peFSDGez+zDM5qdduzYIRMnTpQzzzwz1UXxWlRP0uzZs2XixIkyZcoU2b59u2zevFm6d+8uI0eOjFvBfv75Z82XXnqp5ooVKzrnnXvuuZrr1q0b8fds27ZN83fffRfWednWNSYi0rNnT+nZs6eIiPTv31/222+/lJTjxx9/1Pzss89qvvPOOzUXFRU517z88sua7c+Dr+L1fA4cOFBzsHvE+uOPP6Iuq4jIn3/+6Rw/9thjmteuXav5xhtvdM7Lzc2N6XszTbyf0VmzZjnHH3zwgeayZctqPuigg0Leo3fv3pptF2ywrs466yzNr7zyiubg81q+fPndFTurvPXWW9K6dWupVatW3O/9xRdfaL733ns126EmIiKnnnqq5tdffz3u5cgEUb0RGjhwoKxevVqWL18uo0ePlmOOOSaujSAk31//4KxcuVLGjx/Pq9oMxvOZnXhGs8+oUaOoxzTAu1WIiEjXrl2lsLBQypQpI08++aTsvffeqS4SAINnNLts27ZNpk6dKkOGDEl1UbwXc0OoQ4cO0qFDhzgUBak0c+bMVBcBCcDzmT14RrNLhQoVpLCwMNXFgKTxG6EnnnhC86ZNmzQHp/FGMy4IqWXHYtkptyIi69at02zHh5Q0RuXyyy/XPHbsWM2XXXaZc94VV1yh+aijjtJsxyKJ+DdOIVYPPPCA5u7du0d8fXD2k11YbvXq1ZqDY2J69eoV8Xfhbx9++KFz/Ntvv2m++uqrNdsxW0Eff/yxZvtzYJ81EXHeenzyySeaV65c6Zx3xx137KbUCNfjjz+u+bXXXtMc/F365ptvat5zzz2LvVfw391LLrlE8+mnn665QYMG0RU2xZhbCwAAvEVDCAAAeCttusaC+6zcf//9mjt16qTZ1+l92eSpp57S/M0334Q8r1GjRpovvvhizbZbS0Tk+uuv12xf98+ePds5z/bH2yn39913n3NenTp1QpbJJyeccILmZ555JuR5wSUtInXAAQc4x3ZavO0as6u7I3a2uySopJXErXbt2mkeP368Zvu8ioiMGDGi2OtXrFgR1vdg93r06OEcDx8+PKzr7HIkO3bsKPacpUuXOsc33XST5gEDBmiuXbu2c94111yj+dhjj9Wcn58fVtmShTdCAADAWzSEAACAt1LaNWZXpH3rrbecz3bu3Kn51ltv1cyMnswQXC3Ydq3YWSjBVbrta1a7Gm1Jq+jecMMNms8+++ywyte5c2fN1apVC+sa33Ts2FHzkUce6Xxmp3Ln5eVptiuwi4huEhoJW+8LFy7UPGfOHOc8++r/wgsvjPh7EF+ffvqp5uDqxUg8O/tL5J8r8Idy++23ay5VqpRmu8q/3elBxB2isn37ds3Lly93zrO/m4cNG6aZrjEAAIA0QUMIAAB4i4YQAADwVtpMny+JnUYdb2PGjEnYvX32008/OcfXXnttsecF99kJZwNC2+8s8s+pneFo2LChZsadFc+O7wk+g3aMkF2mILhlQDRjhOzUXLvMQXCpBbujtt1Be6+99or4O30UXEXYjinZunVryOt+//13zRs2bNBsx5oEVy+2y6E899xzmu1q1iLu2FA7XgW7d8ghhzjH7777brHnnXzyyc5x//79NZcpU6bYa4LT6u1zblewDi5FYtmVx4PLK6Qab4QAAIC3aAgBAABvpbRrzL6Gq169esjz7OaZr7zyivNZNK/erR9++CGm61G86dOnO8f2tbvNwVWirS1btmg+5ZRTNAc3iyxpQ9ZQHn744YivQfFsPQWn2UazKfLmzZs1226YoCVLlmi2U3gRnptvvtk5thsg266sZcuWOefZbu9p06Zprlmzpma7aauIyI033qj5vffe0xycZm+7Wez9sHu2e1gkdNdYcChAqO4wq2zZss7xPvvso9kuefLVV185502ZMkXzr7/+utvvSRXeCAEAAG/REAIAAN5Km1ljwZHsEydOLDYHX7Wffvrpxd7Pdrm0bNnS+czORHn00UcjLyx2a+XKlc5xqO6rSZMmOce2W2Tw4MGa7ev44L3q1aun2a5svH79+ghKjJLYbhMRd5XYTZs2abazyURCz/yxm3AGf1ZsXZc0I9BuxsxMscjZ1dVFRN555x3NF110keaRI0eGvMfhhx+u2XZrBX/nIvGCM27vuOMOzWvXrk3Y99pus5I2YLa/m7///nvns/r168e/YBHgjRAAAPAWDSEAAOCttOkaC77Wswtr2UUPJ0+e7JxnX9FbdtGuaGYViYgcffTRmnn1Hpnzzz/fObYb51pXXXVVWPezG3t269bN+cwuzmU33wx2jYVa1BG7F5zdZ5+NDz74QLOdHRStgw8+WLOdFRrc0HXx4sWa7cJ8wYUCEZ6CggLNH330keaSupgbNGigmYVJUyv4b9RDDz2k+corr9QcnNGXLHbxzalTpzqf0TUGAACQIjSEAACAt2gIAQAAb6XNGKGg7t27az733HM1r1ixwjlv/PjxmlevXh3WvZs1a6b5mmuu0RxcnbZWrVqagytromTBlcJtfdqVoYMrEVerVk2z/fsfO3as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dmXoN998U3NwFXi7c3lJ037tasUlLcmA4r333nvOsR1HUqVKFc3RjMMMjre0U7lLWs0/OAYU4XvkkUec41D/VrZo0cI5btKkyW7vvd9++znH9ufDLkcTdNRRR+323umAN0IAAMBbNIQAAIC30mZl6WOOOcY5DvU69vPPP4/5u+zmgnYF5OAr23A3ZMU/vfrqq3G9n12N1m74KSKydu3auH4X/um0005zjp9++uliz6tYsaJzbLup7NTcnj17hvyuK664QvMpp5yiObgkg53S+/LLL2u+5pprQt4b4alWrZrmevXqhXXN1q1bNd99993OZ/b3tv29apdUEHG7XBCZzp07O8c33nijZvt3/vHHHzvnRdOtbO8XKouItG7dOqz7pRpvhAAAgLdoCAEAAG+lTddYuOxmqtFavny5Zvs6F+nFbuZnVzZ+5513UlEcrzVv3jys82y3s4g7MynYvRaKnaFy6623aj799NNDXjN9+nTNV155pfNZmTJlwvpe31x++eXO8bPPPqt5r732CuseduPWXr16af7kk0/Cuj43N9c5tiv9IzLBFaPtse1GXrVqlXNe//79Nffp06fY64PX/Pbbb7EVNs3wRggAAHiLhhAAAPBW2nSNHXLIIc6x3awxuDgX0l/btm2dY9udZRfTO+GEE5zzTjzxRM133nmnZjuzgdl8yWefRxGRY489VnNwYb5UmDFjhubgAm/B7hf8zzPPPOMc2+4sO0MvuPn0EUccoXncuHGaw+0uYWPV5LCLEtsNdoPd13YBUzvb187gC9at/X1cEjtbsF27dmFdkwq8EQIAAN6iIQQAALxFQwgAAHgrbcYIBVe07NGjh+aHHnoort81cuRIzSX1V9OXHb3bbrvNOX7//fc1f/TRR5rfffdd57zg8V86dOiguVOnTs5n3377rWZbt4ifPffc0zm2GzzaZQ5+/vln57xkjQuwU/MZExQdO87Krt4+bNgw57yXXnpJsx2v17JlS83B53/06NGax44dG3NZsXunnnqqZjtmc8yYMc55Q4cO1Wx3WrDsuDARkcmTJ2u2q/4H2Z+pq666ajclTh3eCAEAAG/REAIAAN5Km66xILtxol1N+tJLL4353iVtEhfqPEQmuJniiy++qNlOi3/99ded82y9d+zYUbPtGguy3ah0ZyaHXWk63FWno2G7YUoS7sagCK1y5cqa7UruV199tXNeqO6Thg0bai5fvrzzWfA5R3Ltu+++mq+//nrns+BxOGw3l12GIVP/zeSNEAAA8BYNIQAA4K207RqrW7eu5ilTpqSkDCeddFJKvjcb2dVphw8fnrDvydRXs/jbnDlzNE+dOjXkefvss4/myy67LKFl8tmBBx6Y6iIgzdjNkIMrlGci3ggBAABv0RACAADeoiEEAAC8lbZjhNLBXnvtleoioBgbN250ju1K1ch8dmfrUFO1RdwVxmvWrJnQMiE2I0aMSHUREEd2fN4hhxyi2e42L+KuQP3TTz8Ve3064I0QAADwFg0hAADgLS+7xuzqw6xEnHl+++0353jJkiUpKgmASNklLvbee+8UlgTxcOSRR2r+7LPPnM+2bt2qeefOnUkrU6R4IwQAALxFQwgAAHjLy66xcDdd3bBhQzKKgwitWrUqrPPy8/Od42bNmiWiOEiRK664ItVFQAiTJk0K6zyeyeySqSv780YIAAB4i4YQAADwFg0hAADgLS/HCIXL7np/1llnpbAksF5++eWwzuvdu7dzzFTdzPD111+HdV5ubm6CS4JohTu+kp3tkQ54IwQAALxFQwgAAHjLy66xY445RvNLL72UwpIgkfbbb79UFwFReOONN4r982A3StWqVZNRHMSZXc2/du3aKSwJ8D+8EQIAAN6iIQQAALzlZdfYPvvso7mkTVfZkDV9/PHHH5oXLVqUwpIg3oIrha9Zs6bY80aNGuUc16xZM2FlQuLY1Yc7duyYwpIgHgoKCjQPGjQo5Hkffvih5u7duyeySBHjjRAAAPAWDSEAAOAtGkIAAMBbXo4RatSokeYqVapo3rJli3Nepu6km422b9+uedq0aSHPs+NG6tWrl9AyIT6GDx/uHC9fvrzY8ypUqJCE0iAeJk+eHPIz+4zWqFHj/9u7Y1wDoigMwKMjsYenVavoFRagZg32YBvWIaFR2YPuVYrX2IDMa15uxiQSE29mcL6vOnIVJ7nBn3tcmmiHGk2n01RPJpObtePxmOr1ep1q3xECAHgRghAAEFbI0dhgMEh18bi9PBrjdfT7/VSXRymLxSLV8/k81cPhsP7GeNput7u7tlwuU22M8j4ul8vdtV6vl+put9tEO9So+Bm6Wq1u1orvx6fTqbGeqnIiBACEJQgBAGGFHI09ar/ft90Cf4o3+Mo3Dl7tBgLPmc1mqd5sNql2i/N9bLfbtlugBcV/bSgbjUYNdlKNEyEAICxBCAAISxACAMIK/x2h8/ncdgsQ2uFwaLsF4B+Mx+Obx9frtaVOqnEiBACEJQgBAGF18jx//Mmdzk+WZd/1tUPJV57ntf2crv1snP38LLXuZ5bZ0xZ4jX6Wh/azUhACAPgkRmMAQFiCEAAQliAEAIQlCAEAYQlCAEBYghAAEJYgBACEJQgBAGEJQgBAWL8U8/xo+RtmHgAAAABJRU5ErkJggg==\n" }, "metadata": {} } ], "source": [ "## 打印输入图片的k近邻图片\n", "import matplotlib\n", "matplotlib.use('TkAgg') ##macOS需要换一下后端才能显示图片。\n", "from matplotlib import pyplot as plt\n", "%matplotlib inline\n", "## 输入图片的编号(随机产生)\n", "test_id = random.randint(0,10000)\n", "KNN_TEST_PRINT(train_i,test_x,train_l,test_y,test_id,k)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "No. 1\n", "训练集图片数量: 6000 区间: 49303 ~ 55303\n", "测试集图片数量: 500 区间: 9438 ~ 9938\n", "测试图片数量: 500\n", "K= 1 accuracy: 0.918\n", "\n", "No. 2\n", "训练集图片数量: 6000 区间: 38563 ~ 44563\n", "测试集图片数量: 500 区间: 4042 ~ 4542\n", "测试图片数量: 500\n", "K= 2 accuracy: 0.868\n", "\n", "No. 3\n", "训练集图片数量: 6000 区间: 21625 ~ 27625\n", "测试集图片数量: 500 区间: 8959 ~ 9459\n", "测试图片数量: 500\n", "K= 3 accuracy: 0.982\n", "\n", "No. 4\n", "训练集图片数量: 6000 区间: 39939 ~ 45939\n", "测试集图片数量: 500 区间: 3489 ~ 3989\n", "测试图片数量: 500\n", "K= 4 accuracy: 0.92\n", "\n", "No. 5\n", "训练集图片数量: 6000 区间: 21587 ~ 27587\n", "测试集图片数量: 500 区间: 257 ~ 757\n", "测试图片数量: 500\n", "K= 5 accuracy: 0.906\n", "\n", "No. 6\n", "训练集图片数量: 6000 区间: 28045 ~ 34045\n", "测试集图片数量: 500 区间: 2604 ~ 3104\n", "测试图片数量: 500\n", "K= 6 accuracy: 0.9359999999999999\n", "\n", "No. 7\n", "训练集图片数量: 6000 区间: 43593 ~ 49593\n", "测试集图片数量: 500 区间: 6955 ~ 7455\n", "测试图片数量: 500\n", "K= 7 accuracy: 0.974\n", "\n", "No. 8\n", "训练集图片数量: 6000 区间: 9651 ~ 15651\n", "测试集图片数量: 500 区间: 9481 ~ 9981\n", "测试图片数量: 500\n", "K= 8 accuracy: 0.908\n", "\n", "No. 9\n", "训练集图片数量: 6000 区间: 34086 ~ 40086\n", "测试集图片数量: 500 区间: 8445 ~ 8945\n", "测试图片数量: 500\n", "K= 9 accuracy: 0.99\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "## 打印misclassification rate曲线\n", "#import datetime\n", "#start = datetime.datetime.now()\n", "import matplotlib\n", "matplotlib.use('TkAgg') ##macOS需要换一下后端才能显示图片\n", "import numpy as np\n", "import math\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "# 训练图片数\n", "trainNum = 6000\n", "# 测试图片数\n", "testNum = 500\n", "\n", "x = np.arange(1, 10, 1)\n", "y = []\n", "for t in x:\n", " ##数据选择\n", " train_Start = random.randint(0,60001-trainNum)\n", " train_End = train_Start+trainNum\n", " train_i = train_x[train_Start:train_End,:]\n", " train_l = train_y[train_Start:train_End]\n", "\n", " test_Start = random.randint(0,10001-testNum)\n", " ## test_Start = 0\n", " test_End = test_Start+testNum\n", " test_i = test_x[test_Start:test_End,:]\n", " test_l = test_y[test_Start:test_End]\n", " \n", " print('\\nNo.',t)\n", " \n", " print('训练集图片数量:',train_i.shape[0],'区间:',train_Start,'~',train_End)\n", " print('测试集图片数量:',test_i.shape[0],'区间:',test_Start,'~',test_End)\n", " \n", " misclassification_rate = KNN_TEST(train_i,test_i,train_l,test_l,t)\n", " print('K=',t,'accuracy:',1-misclassification_rate)\n", " y.append(misclassification_rate)\n", "plt.plot(x, y, label='KNN')\n", "plt.xlabel(\"K\")\n", "plt.ylabel(\"misclassification rate\")\n", "plt.ylim(0,2*max(y))\n", "plt.legend()\n", "plt.show()\n", "#error,error_image=KNN_TEST(train_i,test_i,train_l,test_l,k)\n", "#b=[i+testNum for i in error]\n", "\n", "#for i in range(len(b)):\n", "# print(error[i],error_image[i])\n", "\n", "#end = datetime.datetime.now()\n", "#print ('程序运行时间:',end-start)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.7.3 64-bit ('base': conda)", "language": "python", "name": "python37364bitbaseconda12cedf669173426cb0cfb548cfc60e96" }, "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.7.3-final" } }, "nbformat": 4, "nbformat_minor": 2 }