十四、机器学习进阶知识:KNN分类算法

1、KNN分类介绍

分类是数据分析中非常重要的方法,是对己有数据进行学习,得到一个分类两数或构造出一个分类模型(即通常所说的分类器(Classifier))。分类是使用已知类别的数据样本,训练出分类器,使其能够对未知样本进行分类。分类算法是最为常用的机器学习算法之一,属于监督学习算法。
KNN分类(K-Nearest-Neighbors Classification)算法是分类算法中的一种,又叫做K近邻算法。该算法于于1987年由 Cover T和 Hart P提出,算法概念较为简单,其核心思想是,如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。虽然该算法中心思想简单,但是分类的效果相当优秀。
下面来简单了解一下其分类过程,例如假设已经获取一些动物的特征,且已知这些动物的类别分别是什么。现在需要识别一只新动物,判断它是哪类动物。首先找到与这个物体最接近的k个动物。令k=3,假设可以找到2只猫和1只狗,由于找到的结果中大多数是猫,则把这个新动物划分为猫类。

2、KNN分类核心要素

KNN没有专门的学习过程,是基于数据实例的一种学习方法,从刚刚介绍的分类过程可以看出,在KNN分类过程中,存在三种核心要素。
第一个核心要素是K值,也就是在上述的分类过程中找到与这个物体最接近的k个动物,如果k取值太小,好处是近似误差会减小。但同时预测结果对近邻的样本点非常敏感,仅由非常近的训练样本决定预测结果。使模型变得复杂,容易过拟合。如果k值太大,学习的近似误差会增大,导致分类模糊,即欠拟合。
例如假设在刚刚的例子中设置k值分别为3和6,当k值等于3是还是可以找到2只猫和1只狗,那么对应的就是属于猫,但是若k取值为6时找到2只猫、1只狗和3只熊,那么对应的类别就属于熊了,所以K值的选取会直接影响到最终的分类效果,而如何进行K值的选取就涉及到第二个核心要素,距离的度量。
是否相似主要是由距离的度量决定,距离决定了哪些物体之间是相似的,哪些是不相似的。距离的度量方法有很多种,不同的距离所确定的近邻点不同。二维上常用的度量方法是欧氏距离,此外还有曼哈顿距离、余弦距离、球面距离等。欧氏距离的计算公式如下:
在这里插入图片描述

同样以刚刚的分类过程为例,假设存在三个已知点cat1,cat2以及dog1,它们的位置信息分别为(1,3)、(4,5)、(3,5),存在一个未知类别点(2,2),分别计算该点到三个已知点的欧式距离,按照欧式距离从小到大排序依次是cat1,dog1以及cat2,若设置k为1,则选择最近的一个位置进行分类,即该动物属于猫类。
当k值设置不为1时,分类结果的确定往往由第三个要素,分类决策规则来决定,即多数表决原则,由输入实例的k个最邻近的训练实例中的多数类决定输入实例的类别。

3、KNN分类实例

下面分别通过鸢尾花分类和手写数字识别两个实例介绍KNN分类的具体实现过程。

1.1 鸢尾花分类

鸢尾花数据集最初由科学家Anderson 测量收集而来,1936 年因用于公开发表的Fisher 线性判别分析的示例,在机器学习领域广为人知。
鸢尾花数据集共收集了三类鸢尾花,即Setosa 山鸢尾花、Versicolour 杂色鸢尾花和 Virginica 弗吉尼亚鸢尾花,每类鸢尾花有50条记录,共150 条数据。数据集包括4 个属性特征,分别是花瓣长度、花瓣宽度、花萼长度和花萼宽度。
在对鸢尾花数据集进行操作之前,先对数据进行详细观察。SKlearn 中的iris 数据集有5个key,分别如下:
(1) target_names: 分类名称,包括 setosa、versicolor 和 virginica类。
(2) data:特征数据值。
(3) target:分类(150个)。
(4) DESCR:数据集的简介。
(5) feature_names:特征名称。
首先可以使用sklearn库中的datasets模块导入鸢尾花数据集,同时查看该数据的各方面特征。

from sklearn.datasets import load_iris
iris_dataset = load_iris()
#下面是查看数据的各项属性
print("数据集的Keys:\n",iris_dataset.keys())     #查看数据集的keys。
print("特征名:\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个字符

在这里插入图片描述

然后针对鸢尾花数据集进行训练集与测试集的拆分操作,可以使用train_test_split()函数来实现,该函数属于sklearn.model_selection中的交叉验证功能,随机的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七层楼的疯子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值