机器学习(慕课版)实验及参考结果 实验3 基于概率密度估计的手写数字集识别_第1页
机器学习(慕课版)实验及参考结果 实验3 基于概率密度估计的手写数字集识别_第2页
机器学习(慕课版)实验及参考结果 实验3 基于概率密度估计的手写数字集识别_第3页
机器学习(慕课版)实验及参考结果 实验3 基于概率密度估计的手写数字集识别_第4页
机器学习(慕课版)实验及参考结果 实验3 基于概率密度估计的手写数字集识别_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于概率密度估计的手写数字集识别姓名:学号:专业:指导老师:(打印时,下面的得分情况表留在封面)报告分:(100points)Attendance(5points)Results(10points)实验课时签到成功(5)实验课时没有签到成功(0)给出算法正确和可运行程序(10)程序算法原理有部分理解错误(5)程序算法原理和程序都有完全错误(0)ContentofReport(55points)formatinReport(30points)要求点全部高质量完成(55)要求点完成但有错误(给分点减半)要求点没有完成(扣相应给分点的分)图表、引用等符合学术规范(15)、语言清晰,逻辑明确和表述清晰完整(15)图表、引用不符合学术规范语言清晰,逻辑明确和表述清晰完整(0)最终本次实验得分成绩=报告分x(时间或算法)性能排序因子(时间或算法)性能排序因子为:top1-3,100%Top4-10,95%Top11-15,90%Top16-最后,80%性能可以并列第一。实验报告问题描述:数据集介绍:MNIST数据集是一个经典的机器学习和深度学习领域常用的数据集,它用于手写数字识别任务。以下是对MNIST数据集的详细介绍:MNIST(ModifiedNationalInstituteofStandardsandTechnologydatabase)数据集最初由美国国家标准与技术研究院(NIST)创建,后来被修改和扩展,成为机器学习领域的标准测试数据集。数据集组成:MNIST数据集包含了一组28x28像素的手写数字图像,涵盖了0到9的10个数字。每个数字有6000个训练样本和1000个测试样本,共计70000张图像。数据集被分为训练集(60000张图像)和测试集(10000张图像)。每张图像都是单通道的灰度图像,每个像素的值介于0到255之间,表示像素的亮度。数据集用途:MNIST数据集通常用于图像分类任务,即将手写数字图像分为0到9这10个数字中的一个。这个数据集常常被用来测试和比较不同的机器学习和深度学习算法的性能,尤其是图像处理领域的算法。数据集特点:数据集中的图像是相对简单的,分辨率低(28x28像素),并且数字的手写风格多种多样。图像中的数字位于图像中央,具有一定的居中性。MNIST数据集是一个平衡的数据集,即每个数字类别的样本数量相等,因此适合于多类别分类任务的训练和评估。问题的本质与分析:这个问题的本质在于从手写数字图像中自动提取和识别对应的数值。这是一个分类问题,目标是将每个输入图像分类到10个可能的类别(即数字0到9)中的一个。MNIST数据集自身具有一些特定的特点。它包括60,000个手写数字的训练示例和10,000个测试示例。值得注意的是,这些图像已经过归一化和中心化处理,使得模型的训练更为简便。然而,由于每个人的书写风格都有所不同,这个数据集带来了一些固有的挑战。在处理这个问题时,有多种方法和技术可供选择。传统的机器学习技术,如支持向量机(SVM)、决策树和随机森林,在MNIST数据集上都能取得相对不错的结果。为了进一步增强模型的性能,数据增强技术,如图像的旋转、平移和缩放,也经常被采用。数据预处理:数据选取的是网上公开的mnist数据集,该数据集有多个版本,我选择的是‘mnist.plk.gz’是经过gzip压缩之后的文件。所以第一步是进行数据的解压,我选择的是python中gzip库,通过gzip.open函数进行解压并使文件存储格式从‘rb’改为‘bytes’。完成解压之后我有对数据的训练集测试机进行了划分,根据本身数据格式,将60000张图像组成训练集,10000张图像组成测试集。之后先对矩阵进行二值化(整个矩阵除以最大值255,将分布转移到0-1之间)再通过plt函数将其绘制出来,同时我也尝试将图像从时域转化到频域中,得到下图的结果。通过观察数据可以看出,图像整体28*28的像素,并且是灰度图像,图像的高频和低频部分各有一个高峰,且整体较为连贯。之后考虑到矩阵的维度较多且数据量很大,图像中大部分黑色的区域都没有意义,所以我采用PCA降维的方式将图像的值只保留方差为100的。解决问题的思路,方法,思路的可性行和预期结果表现K-最近邻(KNN)算法是一种简单且广泛应用的监督学习算法,用于分类和回归。它的核心原理是根据相似性(通常是距离度量)来预测未知数据点的标签或值。KNN算法的工作原理:1.确定K值:K代表最近邻的数量。这是一个用户定义的常数,KNN算法将根据这个K值来决定一个未知数据点的分类。K的选择对算法的结果有重大影响。较小的K值意味着模型对噪声更敏感,可能导致过拟合;较大的K值可能导致欠拟合。2.计算距离:当一个新的数据点需要被分类时,算法首先计算该点与训练集中所有点之间的距离。常用的距离度量包括欧氏距离、曼哈顿距离和切比雪夫距离。3.寻找最近邻:算法将选择距离新数据点最近的K个训练数据点,这些点被称为“最近邻”。4.进行投票或平均:对于分类问题,算法通常采用“投票”机制,即最近邻中出现次数最多的类别将被赋予新数据点。如果`weights='uniform'`,每个邻居的投票权重相同;如果`weights='distance'`,更近的邻居对结果的影响更大。对于回归问题,KNN通过计算K个最近邻的目标值的平均值来预测新数据点的值。KNN算法的优点和局限性:优点:简单直观:易于理解和实现。无需训练:KNN是一种基于实例的学习,不需要专门的训练过程。适应性强:对于不同类型的数据,只需调整距离度量和K值。局限性:计算密集型:对于大型数据集,计算所有训练数据点和新数据点之间的距离可能非常耗时。内存需求高:需要存储整个训练数据集。对不平衡数据敏感:如果某一类别的样本远多于其他类别,KNN可能会倾向于这个多数类别。随着特征数量的增加,找到有意义的近邻变得更加困难。预期结果:由于数据量充足并且数据属于已经初步处理的数据,但是由于朴素贝叶斯模型比较初级,对特征提取的不充分,预测准确率为95%左右。解决问题中遇到的难点:实际通过代码实现该方法的准确度为96%,这个结果和我实际理想的结果基本一致。与算法对应的关键代码的实现进行文字解释和注释:importnumpyasnpimportgzipimportpicklefromsklearn.preprocessingimportStandardScalerfromsklearn.decompositionimportPCAfromskimage.featureimporthogdefget_data(datapath):mnist=gzip.open(datapath,'rb')train_set,valid_set,test_set=pickle.load(mnist,encoding='bytes')train_data=(train_set[0])train_label=train_set[1]test_data=(test_set[0])test_label=test_set[1]returntrain_data,train_label,test_data,test_labelprint('loadingMNISTData')train_data,train_label,test_data,test_label=get_data("mnist.pkl.gz")print('loadingdone')y_train=train_labely_test=test_label#数据标准化scaler=StandardScaler()X_train=scaler.fit_transform(train_data)X_test=scaler.transform(test_data)#提取HOG特征defextract_hog_features(images):hog_features=[]forimageinimages:fd,hog_image=hog(image,orientations=8,pixels_per_cell=(16,16),cells_per_block=(1,1),visualize=True)hog_features.append(fd)returnnp.array(hog_features)#将HOG特征加入到原有特征中train_images_hog_features=extract_hog_features(X_train)test_images_hog_features=extract_hog_features(X_test)X_train=np.hstack((X_train,train_images_hog_features))X_test=np.hstack((X_test,test_images_hog_features))#使用主成分分析进行特征降维pca=PCA(n_components=100)#保留100的方差X_train=pca.fit_transform(X_train)X_test=pca.transform(X_test)classKNN:def__init__(self,k):self.k=k#训练函数deftrain(self,X,y):self.X_train=Xself.y_train=y#预测函数defpredict(self,X_test):distances=pute_distances(X_test)returnself.predict_labels(distances)#计算距离defcompute_distances(self,X_test):num_test=X_test.shape[0]num_train=self.X_train.shape[0]distances=np.zeros((num_test,num_train))foriinrange(num_test):distances[i,:]=np.linalg.norm(self.X_train-X_test[i],axis=1)#添加进度条print(f'进度:{i+1}/{num_test}',end='\r')returndistances#预测标签defpredict_labels(self,distances):num_test=distances.shape[0]y_pred=np.zeros(num_test,dtype=int)foriinrange(num_test):closest_y=self.y_train[np.argsort(distances[i])[:self.k]]y_pred[i]=np.bincount(closest_y).argmax()returny_pred#使用knn分类器knn=KNN(3)knn.train(X_train,y_train)#预测并计算准确率predictions=knn.predict(X_test)accuracy=np.mean(predictions==y_test)print('Accuracy:%f'%accuracy)对结果进行分析,提出改进想法的动机,依据、算法设计和预期结果Bagging(BootstrapAggregating的缩写)是一种集成学习方法,旨在提高单一模型(如决策树、K-最近邻等)的稳定性和准确性。Bagging通过以下步骤来实现这一目标:1.自助抽样(BootstrapSampling):Bagging的核心是自助抽样,即从原始训练数据集中重复随机抽取样本(允许重复)来形成多个新的训练数据集。每个新的训练集大小通常与原始数据集相同,但由于是有放回抽样,其中包含了重复的样本,并可能缺少某些原始样本。这种抽样方式创建了多个不同的、但又互相关联的训练数据子集。2.构建多个基学习器:对每个自助抽样生成的数据集训练一个基学习器(基模型)。基学习器通常是同一种类型,如都是决策树或都是KNN。每个模型独立地学习并且不互相影响。由于训练数据的差异,每个模型会有所不同。3.聚合预测结果:对于分类问题,Bagging通常采用投票机制,即最终预测是由多数模型选出的类别。Bagging的优点:-减少方差:通过结合多个模型,可以显著减少预测的方差,从而避免过拟合。-提高稳定性:即使基学习器是不稳定的(如决策树),通过聚合多个这样的学习器,可以提高整体的稳定性。-适用于多种模型:Bagging方法不依赖于特定类型的基学习器,可以与多种模型配合使用。Bagging的局限性:-偏差不变:如果基学习器是有偏的(biased),Bagging可能不会减少这种偏差。-计算成本较高:训练多个模型需要更多的计算资源和时间。改进的代码和结果分析importnumpyasnpimportgzipimportpicklefromsklearn.baseimportclone,ClassifierMixinfromsklearn.datasetsimportload_digitsfromsklearn.ensembleimportBaggingClassifierfromsklearn.treeimportDecisionTreeClassifierfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.metricsimportaccuracy_scorefromsklearn.preprocessingimportStandardScalerfromsklearn.decompositionimportPCAclassMixedClassifier(ClassifierMixin):def__init__(self,estimators):self.estimators=estimatorsdeffit(self,X,y):self.fitted_estimators_=[clone(est).fit(X,y)for_,estinself.estimators]returnselfdefpredict(self,X):predictions=np.array([est.predict(X)forestinself.fitted_estimators_])final_prediction=np.apply_along_axis(lambdax:np.bincount(x,minlength=len(set(y_train))).argmax(),axis=0,arr=predictions)returnfinal_predictiondefget_params(self,deep=True):return{'estimators':self.estimators}defset_params(self,**params):if'estimators'inparams:self.estimators=params['estimators']returnselfdefget_data(datapath):mnist=gzip.open(datapath,'rb')train_set,valid_set,test_set=pickle.load(mnist,encoding='bytes')train_data=(train_set[0])train_label=train_set[1]test_data=(test_set[0])test_label=test_set[1]returntrain_data,train_label,test_data,test_labelprint('

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论