版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python机器学习第5章KNN分类算法
5.1KNN分类
分类是使用已知类别的数据样本,训练出分类器,使其能够对未知样本进行分类。分类算法是最为常用的机器学习算法之一,属于监督学习算法。KNN分类算法(K-Nearest-NeighborsClassification),又叫K近邻算法。它是概念极其简单,而效果又很优秀的分类算法。1967年由CoverT和HartP提出。KNN分类算法的核心思想:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。——物以类聚,人以群分计算距离最近的k个样本(k=3)如图,假设已经获取一些动物的特征,且已知这些动物的类别。现在需要识别一只新动物,判断它是哪类动物。KNN分类示意图首先找到与这个物体最接近的k个动物。假设k=3,则可以找到2只猫和1只狗。由于找到的结果中大多数是猫,则把这个新动物划分为猫类。KNN方法有三个核心要素:KNN没有专门的学习过程,是基于数据实例的一种学习方法,在实际操作时,需要考虑以下三个核心要素:1.K值k值,就是选择几个和新动物相邻的已知动物,即邻居的数量。如果k取值很小,意味着只考虑非常接近的邻居,近似误差会减小。但同时预测结果对近邻的样本点非常敏感,仅由非常近的训练样本决定预测结果。这样学习到的模型通常非常复杂,容易过拟合。如果k值太大,观察的邻居增多,学习的近似误差会增大,导致分类模糊,容易产生欠拟合。计算距离k=3k=6下面举例看k值对预测结果的影响。对图5.2中的动物进行分类,当k=3时,分类结果为“猫:狗=2:1”,所以属于猫;当k=5时,表决结果为“猫:狗:熊猫=2:3:1”,所以判断目标动物为狗。图5.2不同K值对结果的影响示意图思考与讨论:KNN中的K值该怎么选取?*通常情况下,K值的选择会根据经验来确定,一般有以下方法:1、经验法则:通常采用奇数,常用的K值为1、3、5等,避免选择偶数是因为偶数容易出现平局的情况。“三人成行”2、交叉验证:通过交叉验证的方法来选择最优的K值。可以将数据集分为训练集和验证集,在不同的K值下进行训练和验证,选择在验证集上性能最好的K值作为最终的选择。3、网格搜索:通过网格搜索的方法,在给定的K值范围内进行搜索,选择在验证集上性能最好的K值。此外,在社会学中,群体规模对决策结果有显著影响。KNN中的K值可以类比为群体规模的大小:较小的K值(如3)更接近小群体决策,可能受少数个体或噪声影响较大;较大的K值(如7)则类似于大群体决策,更倾向于反映整体趋势,但可能忽略局部特性。2.距离的度量不同的距离所确定的近邻点不同。平面上比较常用的是欧式距离。此外还有曼哈顿距离、余弦距离、球面距离等。*扩展1.欧式距离也称欧几里得距离。欧式距离是二维平面上常用的距离计算方法,是一种衡量多维空间中两点之间绝对距离的数学方法。最早由古希腊数学家欧几里得提出。欧式距离的计算基于勾股定理,即在直角三角形中,斜边的长度可以通过两条直角边的长度计算得出。
2.球面距离球面上两点之间的最短连线的长度。球面距离在物流配送、导航规划、气象预测、地理信息分析、城市规划、生态保护等领域广泛应用。地球上两地A、B的距离为:S=R·arccos[cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2]其中:R:地球半径,约为6371公里。β1、β2:分别表示点A、点B的纬度。α1、α2:分别表示点A、点B的经度。计算各点(cat1,cat2,dog1,dog2,dog3)到新样本new的欧式距离。3.分类决策规则分类结果的确定往往采用多数表决原则,即由输入实例的k个最邻近的训练实例中的多数类决定输入实例的类别。*扩展:常见的表决方法(1)多数表决法多数表决法是最常用的表决规则,其基本思想是“少数服从多数”。(2)加权表决法加权表决法在多数表决法的基础上引入了距离权重,即距离待分类样本更近的邻居拥有更大的表决权。常见的加权方式是距离的倒数,即邻居的权重与其距离成反比。(3)距离阈值法距离阈值法通过设定一个距离阈值,仅考虑距离小于该阈值的邻居参与表决。这种方法适用于数据分布不均匀或存在异常值的情况,能够提高算法的鲁棒性。(4)概率表决法概率表决法适用于多分类问题,其基本思想是统计K个最近邻样本中各类别的比例,并将待分类样本归为概率最高的类别。这种方法在类别分布不均衡时表现较好。5.2初识KNN——鸢尾花分类
鸢尾花数据集:鸢尾花(iris)是单子叶百合目花卉,鸢尾花数据集最初由科学家Anderson测量收集而来。1936年因用于公开发表的Fisher线性判别分析的示例,在机器学习领域广为人知。数据集中的鸢尾花数据主要收集自加拿大加斯帕半岛,是一份经典数据集。鸢尾花数据集共收集了三类鸢尾花,即Setosa山鸢尾花、Versicolour杂色鸢尾花和Virginica弗吉尼亚鸢尾花。每类鸢尾花有50条记录,共150条数据。数据集包括4个属性特征,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。1.查看数据SKlearn中的iris数据集有5个key,分别如下:target_names:分类名称,包括setosa、versicolor和virginica类。data:特征数据值。target:分类(150个)。DESCR:数据集的简介。feature_names:特征名称。1.查看数据【例5.1】对鸢尾花iris数据集进行调用,查看数据的各方面特征。fromsklearn.datasetsimportload_irisiris_dataset=load_iris()#下面是查看数据的各项属性print("数据集的Keys:\n",iris_dataset.keys())#查看数据集的keysprint("特征名:\n",iris_dataset['feature_names'])#查看数据集的特征名称print("数据类型:\n",type(iris_dataset['data']))#查看数据类型print("数据维度:\n",iris_dataset['data'].shape)#查看数据的结构print("前五条数据:\n{}".format(iris_dataset['data'][:5]))#查看前5条数据#查看分类信息print("标记名:\n",iris_dataset['target_names'])print("标记类型:\n",type(iris_dataset['target']))print("标记维度:\n",iris_dataset['target'].shape)print("标记值:\n",iris_dataset['target'])#查看数据集的简介print(‘数据集简介:\n’,iris_dataset[‘DESCR’][:20]+“\n.......”)
#数据集简介前20个字符2.数据集拆分对鸢尾花数据集进行训练集和测试集的拆分操作,可以使用train_test_split函数。train_test_split函数属于sklearn.model_selection类中的交叉验证功能,能随机地将样本数据集合拆分成训练集和测试集。其格式为:X_train,X_test,y_train,y_test=cross_validation.train_test_split(train_data,train_target,test_size=0.4,random_state=0)【例5.2】对iris数据集进行拆分,并查看拆分结果。fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitiris_dataset=load_iris()X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=2)print("X_train",X_train)print("y_train",y_train)print("X_test",X_test)print("y_test",y_test)print("X_trainshape:{}".format(X_train.shape))print("X_testshape:{}".format(X_test.shape))3.使用散点矩阵查看数据特征关系在数据分析中,同时观察一组变量的散点图是很有意义的,这也被称为散点图矩阵(scatterplotmatrix)。Pandas提供了scatter_matrix函数,能从DataFrame创建散点图矩阵。函数格式:scatter_matrix(frame,alpha=0.5,c,figsize=None,ax=None,diagonal='hist',marker='.',density_kwds=None,hist_kwds=None,range_padding=0.05,**kwds)重要参数解释:frame:Pandasdataframe对象。alpha:图像透明度,一般取(0,1)。figsize:以英寸为单位的图像大小,一般以元组(width,height)形式设置。Diagonal:必须且只能在{‘hist’,‘kde’}中选择1个,’hist’表示直方图(Histogramplot),’kde’表示核密度估计(KernelDensityEstimation);该参数是scatter_matrix函数的关键参数。marker:Matplotlib可用的标记类型,如’.’,’,’,’o’等。【例5.3】对例5.2的数据结果,使用scatter_matrix()显示训练集与测试集。可以在例5.2的基础上添加如下语句。importpandasaspdiris_dataframe=pd.DataFrame(X_train,columns=iris_dataset.feature_names)#创建一个scattermatrix,颜色值来自y_trainpd.plotting.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},s=60,alpha=.8)结果中散点矩阵图呈对称结构。除对角上的密度函数图之外,其他子图分别显示了不同特征列之间的关联关系。例如,petallength与petalwidth之间近似成线性关系,说明这对特征关联性很强。有些特征列之间的散布状态比较杂乱,基本无规律可循,说明特征间的关联性不强。在训练模型时,要优先选择关联明显的特征对。4.建立KNN模型在Python中,实现KNN方法使用的是KNeighborsClassifier类,KNeighborsClassifier类属于Scikit-learn的neighbors包。KNeighborsClassifier使用很简单,核心操作包括三步:1)创建KNeighborsClassifier对象,并进行初始化。基本格式:sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,
weights=’uniform’,
algorithm=’auto’,
leaf_size=30,p=2,
metric=’minkowski’,
metric_params=None,
n_jobs=None,
**kwargs)主要参数:n_neighbors:int型,可选,缺省值是5,代表KNN中的近邻数量k值。weights:计算距离时使用的权重,缺省值是“uniform”,表示平等权重。也可以取值“distance”,则表示按照距离的远近设置不同权重。还可以自主设计加权方式,并以函数形式调用。metric:距离的计算,缺省值是“minkowski”。当p=2,
metric=’minkowski’时,使用的是欧式距离。p=1,metric=’minkowski’时为曼哈顿距离。2)调用fit方法,对数据集进行训练。函数格式:fit(X,y)说明:以X为训练集,以y为测试集对模型进行训练。3)调用predict函数,对测试集进行预测。函数格式:predict(X)说明:根据给定的数据预测其所属的类别标签。
fromsklearnimportdatasetsfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.model_selectionimporttrain_test_split#导入鸢尾花数据并查看数据特征iris=datasets.load_iris()print('数据集结构:',iris.data.shape)#获取属性iris_X=iris.data#获取类别iris_y=iris.target#划分成测试集和训练集iris_train_X,iris_test_X,iris_train_y,iris_test_y=train_test_split(iris_X,iris_y,test_size=0.2,random_state=0)#分类器初始化knn=KNeighborsClassifier()#对训练集进行训练knn.fit(iris_train_X,iris_train_y)#对测试集数据的鸢尾花类型进行预测predict_result=knn.predict(iris_test_X)print('测试集大小:',iris_test_X.shape)print('预测结果:',predict_result)print('预测精确率:',knn.score(iris_test_X,iris_test_y))综合实验:KNN对鸢尾花数据集进行分类程序显示出了30个测试样本的预测结果
测试样本的真值是什么?
请设法显示出来。参考代码:……#对测试集数据的鸢尾花类型进行预测predict_result=knn.predict(iris_test_X)print('测试集大小:',iris_test_X.shape)print(‘真实结果:’,test_y)#增加这一行代码print('预测结果:',predict_result)print('预测精确率:',knn.score(iris_test_X,iris_test_y))5.3KNN手写数字识别
本例的素材文件夹为HWdigits,子目录trainSet下存放训练数据,子目录testSet存放测试数据。数据为文本文件形式,每个文件表示一个手写数字。在对文件系统进行操作时,可以使用模块os提供的listdir()方法。listdir()方法返回指定文件夹下的文件/文件夹列表,格式为os.listdir(path),字符型参数path指明目标路径。operator模块中的itemgetter()函数用于获取对象的某个维度的数据,参数为序号。#coding=utf-8importnumpyasnpfromosimportlistdirdefloadDataSet():#加载数据集
#获取训练数据集
print("1.LoadingtrainSet...")trainFileList=listdir('HWdigits/trainSet')trainNum=len(trainFileList)trainX=np.zeros((trainNum,32*32))trainY=[]foriinrange(trainNum):trainFile=trainFileList[i]#将训练数据集向量化
trainX[i,:]=img2vector('HWdigits/trainSet/%s'%trainFile,32,32)label=int(trainFile.split('_')[0])#读取文件名的第一位作为标记
trainY.append(label)#获取测试数据集
print("2.LoadngtestSet...")testFileList=listdir('HWdigits/testSet')testNum=len(testFileList)testX=np.zeros((testNum,32*32))testY=[]foriinrange(testNum):testFile=testFileList[i]#将测试数据集向量化
testX[i,:]=img2vector('HWdigits/testSet/%s'%testFile,32,32)label=int(testFile.split('_')[0])#读取文件名的第一位作为标记
testY.append(label)returntrainX,trainY,testX,testY5.3KNN手写数字识别
包含os,用于访问文件trainSet文件夹中的文件数量即为训练集大小testSet文件夹中的文件数量即为测试集大小X:文件的真正内容。Y:文件名的第一位。X:文件的真正内容。Y:文件名的第一位。defimg2vector(filename,h,w):#将32*32的文本转化为向量
imgVector=np.zeros((1,h*w))fileIn=open(filename)forrowinrange(h):lineStr=fileIn.readline()forcolinrange(w):imgVector[0,row*32+col]=int(lineStr[col])returnimgVector5.3KNN手写数字识别
把h行w列中每个数据都加入imgVector。读取当前文件得到数据,如下所示:defmyKNN(testDigit,trainX,trainY,k):numSamples=trainX.shape[0]#shape[0]代表行,每行一个图片,得到样本个数
#1.计算欧式距离
diff=[]forninrange(numSamples):diff.append(testDigit-trainX[n])#每个个体差
diff=np.array(diff)#转变为ndarray#对差求平方和,然后取和的平方根
squaredDiff=diff**2squaredDist=np.sum(squaredDiff,axis=1)distance=squaredDist**0.5#2.按距离进行排序
sortedDistIndices=np.argsort(distance)classCount={}#存放各类别的个体数量
foriinrange(k):#3.按顺序读取标签
voteLabel=trainY[sortedDistIndices[i]]#4.计算该标签次数
classCount[vot
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建设单位油料采购合同
- 2026年云计算服务物联网接入合同
- 传感器部署采购协议书
- 2026年人力资源投放智能硬件合同
- 2026年保险集成跨境电商合作协议
- 房建会计笔试题及答案
- 连衣裙护理与品牌维护
- 地铁站人防门关闭状态传感器与误开报警安全防范措施
- 预防腰椎病复发康复护理
- 2026年全国中级银行从业资格之中级个人贷款考试重点试卷(详细参考解析)
- GB/T 26071-2026太阳能电池用硅单晶及硅单晶片
- 2026及未来5年中国城市环卫服务行业市场竞争现状及发展趋向研判报告
- 酒吧员工竞业限制合同协议
- 印刷厂机器操作制度规范
- 三年(2023-2025)辽宁中考英语真题分类汇编:专题07 任务型阅读(解析版)
- (2025年)高级营销员(四级)考试近5年真题集锦(频考类试题)带答案
- 中国农业大学强基计划真题笔试
- 2026年一级建造师一建建筑实务案例分析简答题考点重点知识总结300问
- 2026年中国土豆项目经营分析报告
- 2025年福建省高考化学试卷真题(含答案)
- 2025国企文秘笔试题及答案
评论
0/150
提交评论