KNN模型理论
K最近邻分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
KNN方法虽然从原理上依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
KNN算法流程
1. 准备数据,对数据进行预处理;
2. 选用合适的数据结构存储训练数据和测试元组;
3. 设定参数;
4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列;
5. 遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L 与优先级队列中的最大距离Lmax;
6. 进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L < Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队列;
7. 遍历完毕,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别;
8. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值。
数据集准备
Iris(鸢尾花)数据集是多重变量分析的数据集。数据集包含150行数据,分为3类,每类50行数据。每行数据包含4个属性:Sepal Length(花萼长度)、Sepal Width(花萼宽度)、Petal Length(花瓣长度)和Petal Width(花瓣宽度)。可通过这4个属性预测鸢尾花卉属于三个种类(Setosa,Versicolour,Virginica)中的哪一类。
数据预处理
import pandas as pddf = pd.read_csv('iris.csv')# 读入数据df.columns = ['Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Species']df.head()# 查看前5条数据
数据集结果如下图所示:
df.describe()# 查看数据信息
对于数据集做描述,结果如下所示:
K-最近邻算法
import numpy as np #使用K-近邻算法对鸢尾花数据进行交叉验证from sklearn.datasets import load_irisimport matplotlib.pyplot as plt
#下载数据集iris = load_iris()data = iris.data[:,:2]target = iris.targetprint (data.shape)print (data[:10])print (target[:10])label = np.array(target)index_0 = np.where(label==0)plt.scatter(data[index_0,0],data[index_0,1],marker='x',color = 'b',label = '0',s = 15)index_1 =np.where(label==1)plt.scatter(data[index_1,0],data[index_1,1],marker='o',color = 'r',label = '1',s = 15)index_2 =np.where(label==2)plt.scatter(data[index_2,0],data[index_2,1],marker='s',color = 'g',label = '2',s = 15)plt.xlabel('X1')plt.ylabel('X2')plt.legend(loc = 'upper left')plt.show()
由图像可以看出,借助于KNN算法,可以将150个Iris(鸢尾花)数据样本分为3类,分类结果如上所示,分别分为0,1,2这3类,分类结果明显。