1、第4章 分门别类:帮你分而治之课后习题答案一、考考你1.关于正负样本的说法正确是 D 。A.样本数量多的那一类是正样本B.样本数量少的那一类是负样本C.正负样本没有明确的定义D.想要正确识别的那一类为正样本2.分类器实质为一个 A ,把样本的特征集X映射到一个预先定义的类标号y。A.模式B.函数C.映射D.转换3.用计算概率来解决分类问题是哪种分类器 C 。A.决策树B.最近邻C.贝叶斯D.支持向量机4.识别手写数字过程中,对图片进行灰度化处理的主要原因是 C 。A.方便转为文本格式B.尽可能保存全部图片信息C.较少计算量,同时尽可能保存图片信息D.有利于提高分类效果5.SVM的最优分界面是由
2、 A 决定的。A.支持向量B.所有样本C.多数样本D少数样本二、亮一亮1.最近邻分类器与支持向量机各自分类的基本思想是什么?参考答案:最近邻分类器的基本思想:找到与待分类的样本最相似的k个邻居,这k个邻居中多数邻居属于哪一类,那么就指定该样本属于哪一类。即我们把每个具有n个特征的样本看作n维空间的一个点,对于给定的新样本,先计算该点与其它样本点的距离(相似度),然后将新样本指派为周围k个最近邻的多数类。该分类思想源于这样的常识:判别一个人是好人还是坏人,可以从跟他走得最近的k个人来判断,如果k个人中多数是好人,那么可以指派他为好人,否则他是坏人。支持向量机分类器的基本思想:通过非线性映射,把无
3、法在低维样本空间分类的问题映射到一个高维的特征空间,在高维空间通过一个线性超平面而非低维空间的直线将样本完全划分开。2.在案例1的手写数字识别过程中,个别样本出现错分的现象,主要原因是什么?参考答案:个别样本出现错分主要原因有:(1)因训练样本数据规模不够造成分类模型学习不够,导致不能有效应对各种样本的分类;(2)样本质量不高时也会影响模型识别的正确率。三、帮帮我1.尝试改用SVM方法来识别手写数字,建议核函数使用rbf,其它模型参数自己设定,对比SVM模型的识别效果与案例1的差异,并分析原因。参考答案:#数字图片信息转存为txt文件import osfrom PIL import Image
4、import numpy as npimport pandas as pdimport sklearn.model_selection as ms# 定义图片到文本的转换函数def imgtotext(imgfile,txtfile,size=(32,32): #imgfile待识别图像,txtfile将图像转换为txt文件输出,size图像大小,默认32*32 image_file = Image.open(imgfile) image_file = image_file.resize(size,Image.LANCZOS) image_file=image_file.convert(L)
5、width,height = image_file.size f =open(txtfile,w) ascii_char = 10 for i in range(height): pix_char=; for j in range(width): pixel = image_file.getpixel(j,i) pix_char+=ascii_charint(pixel/128) pix_char+=n f.write(pix_char)f.close()#将图片转换成文本信息imgtotext(rdata3.jpg,rdata3_0.txt) #定义函数,将文本数据转换成数字形式的数组def
6、 txt2array(filename): X=np.zeros(1,1024) f = open(filename) for i in range(32): lineStr = f.readline() for j in range(32): X0,32*i+j = int(lineStrj)return X#将文件夹下所的文件转换成数组和对应的标签def convert2dataset(file_path): list_file=os.listdir(file_path) m=len(list_file) datas=np.zeros(m,1024) labels= for i in ra
7、nge(m): num=int(list_filei0) labels.append(num) datasi,:=txt2array(file_path+list_filei) return datas,labels# 生成训练样本集和测试样本集x_train,y_train=convert2dataset(rdatatrainingDigits)x_test,y_test=convert2dataset(rdatatestDigits)#构建并训练SVM模型import sklearn.svm as svmmodle=svm.SVC(C=1, kernel=rbf)modle.fit(x_t
8、rain,y_train)print(modle.score(x_train,y_train)运行结果:#测试模型效果import sklearn.metrics as smy_pred=modle.predict(x_test)print(sm.classification_report(y_test,y_pred)运行结果:从以上结果可知,基于svm的分类器预测,平均精确率为99%,优于案例1的knn分类器,原因是对于数字这种转为文本后特征值较多的分类场景,svm相对有优势。2.尝试使用KNN方法辅助诊断乳腺癌,注意调整合适的K值,比较该方法与案例2方法在诊断效果上谁优谁劣,并分析原因。参
9、考答案:#homwork-02# 准备训练集和测试集import numpy as npimport pandas as pdimport sklearn.model_selection as msdatas=pd.read_csv(rdatawisc_bc_data.csv,sep=,)x=datas.iloc:,2:32y=datas.iloc:,1:2x_train,x_test,y_train,y_test=ms.train_test_split(x,y,test_size=0.2, random_state=42)y_train=y_train.values.ravel()y_tes
10、t=y_test.values.ravel()构建和训练模型import numpy as npimport matplotlib.pyplot as pltfrom sklearn.neighbors import KNeighborsClassifierimport pandas as pd# 构建knn模型knn= KNeighborsClassifier(n_neighbors=43,weights=distance,p=2)#训练KNN模型knn.fit(x_train,y_train)knn.score(x_train,y_train)# 评估模型效果from sklearn.metrics import classification_reporty_pred=knn.predict(x_test)print(classification_report(y_test,y_pred)运行效果:从运行结果可知,基于knn模型的分类器分类效果弱于svm分类模型,主要的原因是knn本质上是少数服从多数的原则,预测结果有时受k取值的影响,而对于样本特征值较多的场合,svm更具有优势。