第5章:MNIST数据集简介
- 格式:pptx
- 大小:2.31 MB
- 文档页数:42
图像识别中的常用数据集介绍一、MNIST数据集MNIST是一个常用的手写数字识别数据集,由60,000个训练样本和10,000个测试样本组成。
每个样本是一个28x28像素的灰度图像,表示0-9中的一个数字。
MNIST数据集广泛用于图像识别领域的算法训练和性能评估。
通过对MNIST数据集的训练,我们可以生成一个可以识别手写数字的模型。
二、CIFAR数据集CIFAR数据集包含了60,000个32x32像素的RGB图像,分为10个不同类别,每个类别包含6,000个样本。
CIFAR数据集可以用于图像分类问题的训练和评估。
这个数据集的特点是图像比较小,但是类别丰富,样本覆盖面广。
三、ImageNet数据集ImageNet是一个庞大的图像数据库,包含了超过100万张手动标注的图像,涵盖了来自各个领域的22,000多个类别。
ImageNet数据集非常具有挑战性,可以用于复杂图像识别任务的训练和测试。
最近的深度学习算法在ImageNet图像识别竞赛(ILSVRC)中取得了显著的成就。
四、COCO数据集COCO数据集是一个大型的图像识别、目标检测和分割数据集,包含了超过330,000张标注的图像。
COCO数据集的特点在于标注了多种目标类型,如人、车、动物等,以及实例级别的分割标注。
因此,COCO数据集可以用于多个图像识别任务的训练和评估,提供了丰富的样本和标注。
五、PASCAL VOC数据集PASCAL VOC数据集是一个常用的目标检测和分割数据集,包含了来自VOC竞赛的图像样本和标注。
PASCAL VOC数据集主要用于目标检测问题的训练和测试,提供了包括人、车、动物等常见目标的多个类别标注。
该数据集对目标检测算法的性能评估产生了重要影响。
六、CelebA数据集CelebA数据集是一个面向人脸识别和属性分析的数据集,包含了超过200,000张名人图像。
CelebA数据集标注了大量的人脸属性信息,如发色、眼镜、微笑等。
MNIST是一个简单的计算机视觉数据集从某种程度上来说,没有人真正理解机器学习。
这不是一个复杂的问题,我们所做的一切也都非常简单,但由于一些天生的“障碍”,我们人类确实难以理解发生在计算机“大脑”中的那些简单事物。
人类长久以来的生理进化决定了我们能推理二维、三维的空间,在这基础上,我们也能靠想象思考四维空间里发生的变化。
但这对于机器学习来说却是小巫见大巫,它通常需要处理数千、数万,甚至数百万个维度!即便是很简单的问题,如果我们把它放进维度非常高的空间内来解决,以人类的目前的大脑,不理解也不足为奇。
因此,直观地感受高维空间是没有希望的。
为了在高维空间中做一些事情,我们建立了许多工具,其中一个庞大的、发达的分支是降维,它探索的是把高维数据转换为低维数据的技术,也为此做了大量可视化方面的工作。
所以如果我们希望可视化机器学习、深度学习,这些技术会是我们必备的基础知识。
可视化意味着我们能更直观地感受实际正在发生的事情,我们也可以借此更深入地了解神经网络。
为了这一目的,我们要做的第一件事是理解降维,我们选择的数据集是MNIST。
MNISTMNIST是一个简单的计算机视觉数据集,它由28×28像素的手写数字图像组成,例如:每个MNIST数据点,每个图像,都可以被看作是描述每个像素有多暗的数字数组。
例如我们可以这么看待这个手写数字“1”:因为每个图像的像素都是28×28,所以我们得到的其实是一个28×28的矩阵。
考虑到矢量的每个分量都是介于0和1之间的一个描述明暗程度的值,如果我们把每一个值都看做是维向量,那这就是一个28×28=784的高维空间。
所以空间内的矢量其实并不都是MNIST数字,不同像素点之间的区别称得上是天差地别。
MNIST数据集介绍MNIST(Modified National Institute of Standards and Technology)是一个广泛使用的手写数字数据集,被认为是计算机视觉领域中最常用的数据集之一、它由美国国家标准与技术研究所(National Institute of Standards and Technology,简称NIST)所创建并修改,用于训练和测试机器学习算法,特别是在图像识别和数字分类方面。
MNIST数据集的主要任务是将手写数字图片进行分类,即将0到9的数字正确地识别出来。
这个任务是一个经典的图像分类问题,对于机器学习和深度学习领域的算法评估和模型训练有着很高的重要性。
大量的研究和算法都是在MNIST数据集上进行验证的,因此它已成为一个被广泛接受和使用的基准数据集。
在MNIST数据集上进行算法评估和模型训练通常要遵循以下步骤:2.数据预处理:对于图像数据,常用的预处理方法包括将图像进行标准化处理,即将像素值进行归一化,确保像素值的范围符合算法的要求。
此外,还可以对图像进行平滑(如高斯滤波)、降噪、转化为灰度图像等操作。
3.特征工程:对于图像分类问题,人工提取和选择适当的特征对算法的性能至关重要。
在MNIST数据集中,可以使用边缘检测、梯度方向直方图、像素密度等特征来描述数字图像。
4.模型选择和训练:根据具体的任务需求和算法的性能,选择合适的模型进行训练。
针对MNIST数据集的手写数字分类任务,常用的模型包括K近邻算法、支持向量机、决策树、随机森林、神经网络等。
5.模型评估和调优:通过划分训练集和验证集,使用验证集上的评估指标来评估模型的性能。
常用的评估指标包括准确率、召回率、精确率以及F1值。
根据评估结果,可以对模型进行调优和改进,提高其在测试数据上的性能。
MNIST数据集的特点在于它的简单性和标准化。
手写数字的图像可以很容易地转化为数字矩阵,因此非常适合用于算法的验证和对比。
图像识别是机器学习和人工智能中一个重要的研究领域,而数据集是图像识别算法开发和评估的基础。
在这篇文章中,我将介绍一些常用的图像识别数据集,并简要讨论它们的特点和用途。
一、MNIST数据集MNIST是一个经典的手写数字识别数据集。
它包含了60000个训练样本和10000个测试样本,每个样本都是一个28x28像素的灰度图像。
MNIST数据集广泛用于测试和比较各种图像识别算法的性能,成为图像识别领域中的"Hello, World!"。
二、CIFAR-10数据集CIFAR-10是一个包含了60000个32x32彩色图像的数据集,分为10个类别,每个类别有6000个图像。
这个数据集是用于物体分类任务的经典数据集之一。
它对于训练和评估各种图像识别模型具有很大的帮助。
三、ImageNet数据集ImageNet是一个大规模的图像数据集,包含了数百万个高分辨率的图像,涵盖了多个类别。
这是一个非常具有挑战性的数据集,既有助于模型训练和评估,又促进了图像识别领域的研究和发展。
ImageNet数据集也是ImageNet挑战赛的基准数据集之一。
四、PASCAL VOC数据集PASCAL VOC是一个用于目标检测和图像分割任务的数据集。
它包含了多个图像类别、目标边界框和像素级别的分割标签。
PASCAL VOC数据集在目标检测和图像分割算法的发展中发挥了重要作用,为算法的性能提供了可靠的评估标准。
五、MS COCO数据集MS COCO是一个用于目标检测、分割和关键点检测的大规模数据集。
它包含了数千张复杂场景的图像,标注了80个不同的对象类别。
MS COCO数据集是一个有挑战性的数据集,可以帮助开发者训练和评估高性能的图像识别模型。
六、CelebA数据集CelebA是一个用于人脸识别和属性分析的数据集。
它包含了超过200000个名人图像,涵盖了40个属性标签,如年龄、性别、发型等。
CelebA数据集常用于研究人脸识别算法的性能和准确性,并有助于推动人脸识别技术的发展。
详解PyTorch⼿写数字识别(MNIST数据集)MNIST ⼿写数字识别是⼀个⽐较简单的⼊门项⽬,相当于深度学习中的 Hello World,可以让我们快速了解构建神经⽹络的⼤致过程。
虽然⽹上的案例⽐较多,但还是要⾃⼰实现⼀遍。
代码采⽤ PyTorch 1.0 编写并运⾏。
导⼊相关库import torchimport torch.nn as nnimport torch.nn.functional as Fimport torch.optim as optimfrom torchvision import datasets, transformsimport torchvisionfrom torch.autograd import Variablefrom torch.utils.data import DataLoaderimport cv2torchvision ⽤于下载并导⼊数据集cv2 ⽤于展⽰数据的图像获取训练集和测试集# 下载训练集train_dataset = datasets.MNIST(root='./num/',train=True,transform=transforms.ToTensor(),download=True)# 下载测试集test_dataset = datasets.MNIST(root='./num/',train=False,transform=transforms.ToTensor(),download=True)root ⽤于指定数据集在下载之后的存放路径transform ⽤于指定导⼊数据集需要对数据进⾏那种变化操作train是指定在数据集下载完成后需要载⼊的那部分数据,设置为 True 则说明载⼊的是该数据集的训练集部分,设置为 False 则说明载⼊的是该数据集的测试集部分download 为 True 表⽰数据集需要程序⾃动帮你下载这样设置并运⾏后,就会在指定路径中下载 MNIST 数据集,之后就可以使⽤了。
图像识别中的常用数据集介绍导语:近年来,随着人工智能和深度学习的迅猛发展,图像识别已经成为计算机视觉领域的热门话题。
而在图像识别的研究过程中,数据集的选择对于模型的训练和性能评估至关重要。
本文将介绍几个常见的图像识别数据集,包括MNIST、CIFAR-10、ImageNet和COCO,并探讨其特点和应用。
一、MNIST数据集MNIST是一个经典的手写数字数据集,由来自美国国家标准与技术研究所(NIST)的四位作者构建。
该数据集包含60,000个训练样本和10,000个测试样本,每个样本都是28x28像素的灰度图像。
MNIST主要用于图像分类任务,例如将手写数字图像分为0-9的十个数字。
MNIST数据集相对简单,是深度学习初学者常用的入门数据集。
它已经被广泛研究和应用,并被用作深度学习算法的基准测试。
虽然MNIST数据集在一些具有挑战性的任务中可能过于简单,但它可以帮助我们快速验证和理解算法的基本性能。
二、CIFAR-10数据集CIFAR-10是一个由加拿大计算机科学和人工智能研究所(CIFAR)创建的图像分类数据集。
它包含10个类别的60,000个32x32彩色图像,每个类别有6,000个样本。
这些类别包括了常见的物体,如飞机、汽车、狗、猫等。
CIFAR-10数据集中的图像复杂度相对较高,是进一步挑战算法性能的好选择。
CIFAR-10数据集常用于图像分类和目标检测任务。
许多研究者在此数据集上测试和比较不同的深度学习模型,以提高分类准确性和模型性能。
三、ImageNet数据集ImageNet是一个大型的图像识别数据集,由斯坦福大学的李飞飞教授创建。
该数据集包含超过1,200万个图像样本,分为1,000个不同的类别。
ImageNet数据集的样本数量和类别多样性更高于MNIST和CIFAR-10,使得它成为真实场景图像识别的重要基准数据集。
ImageNet数据集对于深度学习研究的贡献巨大。
其中,ImageNet挑战赛(ILSVRC)是一个世界级的图像识别比赛,吸引了来自全球各地的研究者参与。
详解MNIST数据集MNIST 数据集已经是⼀个被”嚼烂”了的数据集, 很多教程都会对它”下⼿”, ⼏乎成为⼀个 “典范”. 不过有些⼈可能对它还不是很了解, 下⾯来介绍⼀下.Training set images: train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)Training set labels: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)Test set images: t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)Test set labels: t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)MNIST 数据集来⾃美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来⾃ 250 个不同⼈⼿写的数字构成, 其中 50% 是⾼中学⽣, 50% 来⾃⼈⼝普查局 (the Census Bureau) 的⼯作⼈员. 测试集(test set) 也是同样⽐例的⼿写数字数据.不妨新建⼀个⽂件夹 – mnist, 将数据集下载到 mnist 以后, 解压即可:图⽚是以字节的形式进⾏存储, 我们需要把它们读取到 NumPy array 中, 以便训练和测试算法.import osimport structimport numpy as npdef load_mnist(path, kind='train'):"""Load MNIST data from `path`"""labels_path = os.path.join(path,'%s-labels-idx1-ubyte'% kind)images_path = os.path.join(path,'%s-images-idx3-ubyte'% kind)with open(labels_path, 'rb') as lbpath:magic, n = struct.unpack('>II',lbpath.read(8))labels = np.fromfile(lbpath,dtype=np.uint8)with open(images_path, 'rb') as imgpath:magic, num, rows, cols = struct.unpack('>IIII',imgpath.read(16))images = np.fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784)return images, labelsload_mnist函数返回两个数组, 第⼀个是⼀个 n x m 维的 NumPy array(images), 这⾥的 n 是样本数(⾏数), m 是特征数(列数). 训练数据集包含60,000 个样本, 测试数据集包含 10,000 样本. 在 MNIST 数据集中的每张图⽚由 28 x 28 个像素点构成, 每个像素点⽤⼀个灰度值表⽰. 在这⾥, 我们将 28 x 28 的像素展开为⼀个⼀维的⾏向量, 这些⾏向量就是图⽚数组⾥的⾏(每⾏ 784 个值, 或者说每⾏就是代表了⼀张图⽚). load_mnist函数返回的第⼆个数组(labels) 包含了相应的⽬标变量, 也就是⼿写数字的类标签(整数 0-9).第⼀次见的话, 可能会觉得我们读取图⽚的⽅式有点奇怪:magic, n = struct.unpack('>II', lbpath.read(8))labels = np.fromfile(lbpath, dtype=np.uint8)为了理解这两⾏代码, 我们先来看⼀下 MNIST ⽹站上对数据集的介绍:TRAINING SET LABEL FILE (train-labels-idx1-ubyte):[offset] [type] [value] [description]0000 32 bit integer 0x00000801(2049) magic number (MSB first)0004 32 bit integer 60000 number of items0008 unsigned byte ?? label0009 unsigned byte ?? label........xxxx unsigned byte ?? labelThe labels values are 0 to 9.通过使⽤上⾯两⾏代码, 我们⾸先读⼊ magic number, 它是⼀个⽂件协议的描述, 也是在我们调⽤fromfile⽅法将字节读⼊ NumPy array 之前在⽂件缓冲中的 item 数(n). 作为参数值传⼊struct.unpack的>II有两个部分:>: 这是指⼤端(⽤来定义字节是如何存储的); 如果你还不知道什么是⼤端和⼩端, 是⼀个⾮常好的解释. (关于⼤⼩端, 更多内容可见<<深⼊理解计算机系统 – 2.1 节信息存储>>)I: 这是指⼀个⽆符号整数.通过执⾏下⾯的代码, 我们将会从刚刚解压 MNIST 数据集后的 mnist ⽬录下加载 60,000 个训练样本和 10,000 个测试样本.为了了解 MNIST 中的图⽚看起来到底是个啥, 让我们来对它们进⾏可视化处理. 从 feature matrix 中将 784-像素值的向量 reshape 为之前的28*28 的形状, 然后通过 matplotlib 的imshow函数进⾏绘制:import matplotlib.pyplot as pltfig, ax = plt.subplots(nrows=2,ncols=5,sharex=True,sharey=True, )ax = ax.flatten()for i in range(10):img = X_train[y_train == i][0].reshape(28, 28)ax[i].imshow(img, cmap='Greys', interpolation='nearest')ax[0].set_xticks([])ax[0].set_yticks([])plt.tight_layout()plt.show()我们现在应该可以看到⼀个 2*5 的图⽚, ⾥⾯分别是 0-9 单个数字的图⽚.此外, 我们还可以绘制某⼀数字的多个样本图⽚, 来看⼀下这些⼿写样本到底有多不同:fig, ax = plt.subplots(nrows=5,ncols=5,sharex=True,sharey=True, )ax = ax.flatten()for i in range(25):img = X_train[y_train == 7][i].reshape(28, 28)ax[i].imshow(img, cmap='Greys', interpolation='nearest')ax[0].set_xticks([])ax[0].set_yticks([])plt.tight_layout()plt.show()执⾏上⾯的代码后, 我们应该看到数字 7 的 25 个不同形态:另外, 我们也可以选择将 MNIST 图⽚数据和标签保存为 CSV ⽂件, 这样就可以在不⽀持特殊的字节格式的程序中打开数据集. 但是, 有⼀点要说明, CSV 的⽂件格式将会占⽤更多的磁盘空间, 如下所⽰:train_img.csv: 109.5 MBtrain_labels.csv: 120 KBtest_img.csv: 18.3 MBtest_labels: 20 KB如果我们打算保存这些 CSV ⽂件, 在将 MNIST 数据集加载⼊ NumPy array 以后, 我们应该执⾏下列代码:np.savetxt('train_img.csv', X_train,fmt='%i', delimiter=',')np.savetxt('train_labels.csv', y_train,fmt='%i', delimiter=',')np.savetxt('test_img.csv', X_test,fmt='%i', delimiter=',')np.savetxt('test_labels.csv', y_test,fmt='%i', delimiter=',')⼀旦将数据集保存为 CSV ⽂件, 我们也可以⽤ NumPy 的genfromtxt函数重新将它们加载⼊程序中:X_train = np.genfromtxt('train_img.csv',dtype=int, delimiter=',')y_train = np.genfromtxt('train_labels.csv',dtype=int, delimiter=',')X_test = np.genfromtxt('test_img.csv',dtype=int, delimiter=',')y_test = np.genfromtxt('test_labels.csv',dtype=int, delimiter=',')不过, 从 CSV ⽂件中加载 MNIST 数据将会显著发给更长的时间, 因此如果可能的话, 还是建议你维持数据集原有的字节格式.。
朴素贝叶斯分类器(MNIST数据集)P(y|X)=P(y)*P(X|y)/P(X)样本中的属性相互独⽴;原问题的等价问题为:数据处理为防⽌P(y)*P(X|y)的值下溢,对原问题取对数,即:注意:若某属性值在训练集中没有与某个类同时出现过,则直接P(y)或P(X|y)可能为0,这样计算出P(y)*P(X|y)的值为0,没有可⽐性,且不便于求对数,因此需要对概率值进⾏“平滑”处理,常⽤拉普拉斯修正。
先验概率修正:令Dy表⽰训练集D中第y类样本组合的集合,N表⽰训练集D中可能的类别数即每个类别的样本个数都加 1。
类条件概率:另Dy,xi表⽰Dc中在第 i 个属性上取值为xi的样本组成的集合,Ni表⽰第 i 个属性可能的取值数即该类别中第 i 个属性都增加⼀个样本。
--------------------------------------------------------------数据预处理训练模型测试样本函数调⽤参考import structfrom numpy import *import numpy as npimport timedef read_image(file_name):#先⽤⼆进制⽅式把⽂件都读进来file_handle=open(file_name,"rb") #以⼆进制打开⽂档file_content=file_handle.read() #读取到缓冲区中offset=0head = struct.unpack_from('>IIII', file_content, offset) # 取前4个整数,返回⼀个元组offset += struct.calcsize('>IIII')imgNum = head[1] #图⽚数rows = head[2] #宽度cols = head[3] #⾼度images=np.empty((imgNum , 784))#empty,是它所常见的数组内的所有元素均为空,没有实际意义,它是创建数组最快的⽅法 image_size=rows*cols#单个图⽚的⼤⼩fmt='>' + str(image_size) + 'B'#单个图⽚的formatfor i in range(imgNum):images[i] = np.array(struct.unpack_from(fmt, file_content, offset))# images[i] = np.array(struct.unpack_from(fmt, file_content, offset)).reshape((rows, cols))offset += struct.calcsize(fmt)return images#读取标签def read_label(file_name):file_handle = open(file_name, "rb") # 以⼆进制打开⽂档file_content = file_handle.read() # 读取到缓冲区中head = struct.unpack_from('>II', file_content, 0) # 取前2个整数,返回⼀个元组offset = struct.calcsize('>II')labelNum = head[1] # label数# print(labelNum)bitsString = '>' + str(labelNum) + 'B' # fmt格式:'>47040000B'label = struct.unpack_from(bitsString, file_content, offset) # 取data数据,返回⼀个元组return np.array(label)def loadDataSet():#mnisttrain_x_filename="train-images-idx3-ubyte"train_y_filename="train-labels-idx1-ubyte"test_x_filename="t10k-images-idx3-ubyte"test_y_filename="t10k-labels-idx1-ubyte"# #fashion mnist# train_x_filename="fashion-train-images-idx3-ubyte"# train_y_filename="fashion-train-labels-idx1-ubyte"# test_x_filename="fashion-t10k-images-idx3-ubyte"# test_y_filename="fashion-t10k-labels-idx1-ubyte"train_x=read_image(train_x_filename)#60000*784 的矩阵train_y=read_label(train_y_filename)#60000*1的矩阵test_x=read_image(test_x_filename)#10000*784test_y=read_label(test_y_filename)#10000*1train_x=normalize(train_x)test_x=normalize(test_x)# #调试的时候让速度快点,就先减少数据集⼤⼩# train_x=train_x[0:1000,:]# train_y=train_y[0:1000]# test_x=test_x[0:500,:]# test_y=test_y[0:500]return train_x, test_x, train_y, test_ydef normalize(data):#图⽚像素⼆值化,变成0-1分布m=data.shape[0]n=np.array(data).shape[1]for i in range(m):for j in range(n):if data[i,j]!=0:data[i,j]=1else:data[i,j]=0return data#(1)计算先验概率及条件概率def train_model(train_x,train_y,classNum):#classNum是指有10个类别,这⾥的train_x是已经⼆值化,m=train_x.shape[0]n=train_x.shape[1]# prior_probability=np.zeros(n)#先验概率prior_probability=np.zeros(classNum)#先验概率conditional_probability=np.zeros((classNum,n,2))#条件概率#计算先验概率和条件概率for i in range(m):#m是图⽚数量,共60000张img=train_x[i]#img是第i个图⽚,是1*n的⾏向量label=train_y[i]#label是第i个图⽚对应的labelprior_probability[label]+=1#统计label类的label数量(p(Y=ck),下标⽤来存放label,prior_probability[label]除以n就是某个类的先验概率for j in range(n):#n是特征数,共784个temp=img[j].astype(int)#img[j]是0.0,放到下标去会显⽰错误,只能⽤整数conditional_probability[label][j][temp] += 1# conditional_probability[label][j][img[j]]+=1#统计的是类为label的,在每个列中为1或者0的⾏数为多少,img[j]的值要么就是0要么就是1,计算条件概率 #将概率归到[1.10001]for i in range(classNum):for j in range(n):#经过⼆值化的图像只有0,1两种取值pix_0=conditional_probability[i][j][0]pix_1=conditional_probability[i][j][1]#计算0,1像素点对应的条件概率probability_0=(float(pix_0)/float(pix_0+pix_1))*10000+1probability_1 = (float(pix_1)/float(pix_0 + pix_1)) * 10000 + 1conditional_probability[i][j][0]=probability_0conditional_probability[i][j][1]=probability_1return prior_probability,conditional_probability#(2)对给定的x,计算先验概率和条件概率的乘积def cal_probability(img,label,prior_probability,conditional_probability):probability=int(prior_probability[label])#先验概率n=img.shape[0]# print(n)for i in range(n):#应该是特征数probability*=int(conditional_probability[label][i][img[i].astype(int)])return probability#确定实例x的类,相当于argmaxdef predict(test_x,test_y,prior_probability,conditional_probability):#传进来的test_x或者是train_x都是⼆值化后的predict_y=[]m=test_x.shape[0]n=test_x.shape[1]for i in range(m):img=np.array(test_x[i])#img已经是⼆值化以后的列向量label=test_y[i]max_label=0max_probability= cal_probability(img,0,prior_probability,conditional_probability) for j in range(1,10):#从下标为1开始,因为初始值是下标为0probability=cal_probability(img,j,prior_probability,conditional_probability)if max_probability<probability:max_probability=probabilitymax_label=jpredict_y.append(max_label)#⽤来记录每⾏最⼤概率的labelreturn np.array(predict_y)def cal_accuracy(test_y,predict_y):m=test_y.shape[0]errorCount=0.0for i in range(m):if test_y[i]!=predict_y[i]:errorCount+=1accuracy=1.0-float(errorCount)/mreturn accuracyif __name__=='__main__':classNum=10print("Start reading data...")time1=time.time()train_x, test_x, train_y, test_y=loadDataSet()train_x=normalize(train_x)test_x=normalize(test_x)time2=time.time()print("read data cost",time2-time1,"second")print("start training data...")prior_probability, conditional_probability=train_model(train_x,train_y,classNum) for i in range(classNum):print(prior_probability[i])#输出⼀下每个标签的总共数量time3=time.time()print("train data cost",time3-time2,"second")print("start predicting data...")predict_y=predict(test_x,test_y,prior_probability,conditional_probability)time4=time.time()print("predict data cost",time4-time3,"second")print("start calculate accuracy...")acc=cal_accuracy(test_y,predict_y)time5=time.time()print("accuarcy",acc)print("calculate accuarcy cost",time5-time4,"second")。