原生态k-nn算法
1.题目分析
Python写一个原生态的K-NN算法。然后用测试集数据对缩写K-NN算法进行测试。K-NN算法主要用来解决分类问题 ,主要思想是根据现有训练数据集,判断新的样本属于哪种类。K-NN算法的分类方法是:①求新样本点在样本空间内与所有训练样本的欧拉距离(欧拉距离是比较常用的样本差异性计算方法);②对欧拉距离排序,找出最近的k个点;③对k个点分类统计,看哪种类型的点数量最多,此类型即为对新样本的预测类型;
构造原生态K-NN算法的重点在于样本邻居数量的选取,所以因设置不同数量的邻居,然后对分类结果正确性进行对比,选出使算法结果最优的邻居数量。
2.算法构造
①训练集数据和测试集数据的选取。
数据集选择鸢尾花卉数据集,通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa(山鸢尾),Versicolour(杂色鸢尾),Virginica(维吉尼亚鸢尾))三个种类中的哪一类。因为这个数据集,仅有150行,5列。该数据集的四个特征属性的取值都是数值型的,他们具有相同的量纲,不需要做任何标准化的处理,第五列为通过前面四列所确定的鸢尾花所属的类别名称。Iris数据集给出的三种花是按照顺序来的,前50个是第0类,51-100是第1类,101~150是第二类,如果我们分训练集和测试集的时候要把顺序打乱。选取112个为训练集,38个为测试集。为实现随机性,选第一类的后12个,后面两种的后13个作为测试集。
②求新样本在样本空间内与所有训练数据的欧拉距离。欧拉距离计算公式为样本与样本之间的欧式距离为:
③对欧拉距离排序,找出最近的k个点;
④找出最近的K个点中的最多的类别为测试数据的类别。
3.算法实现
①对鸢尾花数据集进行分割。
使用numpy库中的Concatenate()函数对切片法分割好的数据集进行拼接(Concatenate((a1,a2…),axis=0) 数组拼接函数,其中a1,a2为要拼接的数组,axis为在哪个维度上进行拼接,默认为0)
②计算每个测试数据与训练数据的欧氏距离。定义函数distance(t_data,train)用于计算距离,其中t_data为测试数据,train为训练数据。
③对每个测试数据的欧氏距离进行排序,找出距离他最且数量最多的训练集类型。定义函数sort(d,k,t_label):其中d是计算出的欧氏距离,k是输入的邻居个数,t_label是训练集数据的标签。
④计算K-NN算法的得分情况。定义函数score(s,train_label)其中s是K-nn算法的结果,train_label是测试集的标签。
⑤主函数
4.运行结果、测试、调试截屏经验总结
①运行结果
②测试截屏
主要测试(测试K-nn算法的判别结果是否正确)
结果为[‘B’,’B’]
测试距离计算函数是否正确
结果为:a,b列表元素键的欧氏距离为 [[1.0, 2.0, 3.0, 4.0], [0.0, 1.0, 2.0, 3.0], [1.0, 0.0, 1.0, 2.0], [2.0, 1.0, 0.0, 1.0]]
测试返回排序索引方法是否正确
结果为:排序后的索引为 [1, 0, 3, 2]
③调试截屏
5.经验总结
总结:通过本次练习,基本掌握了K-NN算法的分类思想k-N以及算法的三要素:k值的选择,距离度量,分类决策规则。
k值的选择:
k值选的过小,训练误差会很小,但测试误差会对应增加,这是明显的过拟合现象。k值选的过大,训练误差过大,测试误差也会很大,明显的欠拟合现象。
K近邻法不具有显示的学习过程,也就是没有显示的训练过程,怎么会有训练误差呢?其实从原理上还是挺容易理解的,K近邻法确定后k值大小,距离度量和分类决策之后,数据集本身就可以使用该模型进行误差的计算(这便是训练误差),而测试误差便是加入新的测试数据来估计该不用训练(只用设置超参数)的模型。
当K很小的时候,训练结果对临近点的实例点非常敏感,K越小,结果越是敏感,当K取1时,训练误差下降到0,但测试误差却会反向增加(因为模型容量过高,表达能力太高),则便是K值选太小会产生过拟合的原因。
k值选的过大,相当于用较大领域中的训练实例来进行预测。过大的话,这时与输入实例较远(不相近的)训练实例也会对测设起到预测作用,从而是预测发生错误,个人感觉是因为数据规模不够大(如果数据规模大,K值即使大页不会选择到较远的点),我便认为这是一种数据不够而导致的欠拟合现象,如果理解有误还望见谅。 K值的选择办法:通常采用交叉验证法来选取最优的K值。距离度量个人感觉对应于机器学习中损失函数(但又不能直接说是损失函数,因为分类决策规则也有损失函数的感觉)。简单的理解就是如何选择样本之间的“距离”,从而使数据样本集能按自己的标签更好的分类。从而使测试样本能根据这个距离很好的正确预测自己的结果。
参考链接:(https://blog.csdn.net/aizenggege/article/details/65441595)