kNN

1. kNN

kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

安装scikit-learn依赖
sudo apt-get install build-essential python-dev python-numpy python-setuptools python-scipy libatlas-base-dev libatlas3-base
kNN_第1张图片
安装scikit-learn
kNN_第2张图片
安装pandas
kNN_第3张图片
下载所需数据文件
kNN_第4张图片
KNN算法的思想:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类
以下图为例
kNN_第5张图片
测试样本(绿色圆形)应归入要么是第一类的蓝色方形或是第二类的红色三角形。如果k=3(实线圆圈)它被分配给第二类,因为有2个三角形和只有1个正方形在内侧圆圈之内。如果k=5(虚线圆圈)它被分配到第一类(3个正方形与2个三角形在外侧圆圈之内)

KNN算法是实现主要分为下面的五个步骤,本文将各个功能写成函数,并分别给出了简单的数据集用于测试。

第一步是处理数据
首先需要做的是加载我们的数据文件。 数据为CSV格式,我们可以使用open函数打开文件,并使用csv模块中的reader函数读取数据行
在这里插入图片描述
执行后如图
kNN_第6张图片
接下来,我们需要将数据拆分为kNN可用于进行预测的训练数据集和我们可用于评估模型准确性的测试数据集。
我们首先需要将作为字符串加载的花卉度量转换为我们可以使用的数字。接下来,我们需要将数据集随机分成训练和数据集。 一般来说,训练集/测试集的比率为67/33。
我们定义一个名为loadDataset的函数,该函数使用提供的文件名加载CSV,并使用提供的分割比率将其随机分成训练和测试数据集。
kNN_第7张图片
运行结果如下
在这里插入图片描述

第二步是计算相似度
为了进行预测,我们需要计算任何两个给定数据实例之间的相似性。 这样我们就可以在训练数据集中为测试数据集的给定成员定位k个最相似的数据实例,然后以此为根据进行预测。
由于本次所用的数据集都是数字并具有相同的单位,我们可以直接使用欧几里德距离测量。
因为花有很多属性,所以我们需要控制在距离计算中包括哪些属性字段。我们这次假设只包含前4个属性。
接下来就可以用python来写欧几里得距离函数了
kNN_第8张图片
运行结果如下:
在这里插入图片描述

第三步是选择邻居
现在我们已经有了计算相似度的方案,我们就可以针对给出的未知的实例选择k个最相似的实例。
为了实现这一步,我们需要计算所以实例的距离并选择具有最小距离值的子集
下图的函数用于从给定测试实例的数据集中返回k个最相似的邻居(因为涉及计算欧式距离,所以还需要上文写的计算距离的函数)
kNN_第9张图片
运行如下
在这里插入图片描述
可以看到,针对给出的训练集222’a’和444’b’,以及测试集555,函数会判定444’b’离555更近

第四步是获得响应
为测试集找到了最相似的邻居后,下一个任务就是根据这些邻居设计预测响应。可以通过允许每个邻居投票选择他们的类属性来做到这一点,并将多数投票作为预测。
下图中是用于从多个邻居获得多数投票响应的函数。 此处假定该类是每个邻居的最后一个属性。
kNN_第10张图片
运行结果
在这里插入图片描述
可以看到,邻居的最后一个属性是a,a,b,获得多数投票的是a

第五步是评估准确性
评估所选择的模型的准确性的一种简单方法是计算所有预测中的正确预测的比率,称为分类准确度。
下图中的函数用于对正确预测求和,并以正确分类的百分比形式返回准确度。
kNN_第11张图片
运行结果
在这里插入图片描述
针对给出的数据,我们知道测试集最后一个属性是aab,而预测的数据是aaa,所以正确率是66.6

现在五步都走完了,我们可以把前面单独写好的函数都组装在一起,组成一个完整的KNN
kNN_第12张图片
前面都是我们写好的函数,看看main函数吧
kNN_第13张图片
显示设置了训练集,测试集和它们的比例,拆分后通过计算欧式距离进行分类,以及预测响应,最后给出了分类的准确度
运行结果如下:
kNN_第14张图片
准确率
在这里插入图片描述
当然了,实际上每次运行的准确率都是有差异的,在我们的demo中,这主要是因为随机划分造成的
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

参考:
1.<机器学习实战>
2. https://zh.wikipedia.org/wiki/%E6%9C%80%E8%BF%91%E9%84%B0%E5%B1%85%E6%B3%95
3.<机器学习>(周志华的西瓜书)
4. https://machinelearningmastery.com/category/algorithms-from-scratch/

你可能感兴趣的:(AI)