KNN算法(K- Nearest Neighbor)--- 邻近算法
一.KNN算法
1.1KNN算法の简介
KNN(K- Nearest Neighbor)法即K最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路非常简单直观:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别 。
该方法的不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最邻近点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。另外还有一种 Reverse KNN法,它能降低KNN算法的计算复杂度,提高分类的效率 。
KNN算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分 。
1.2核心思想
KNN算法的核心思想是,如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
如图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。也就是说,现在, 我们不知道中间那个绿色的数据是从属于哪一类(蓝色小正方形or红色小三角形),下面,我们就要解决这个问题:给这个绿色的圆分类。
我们常说,物以类聚,人以群分,判别一个人是一个什么样品质特征的人,常常可以从他/她身边的朋友入手,所谓观其友,而识其人。我们不是要判别图1中那个绿色的圆是属于哪一类数据么,好说,从它的邻居下手。但一次性看多少个邻居呢?从图1中,你还能看到:
-
如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
-
如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。
于此我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。
1.3算法流程
①准备数据,对数据进行预处理 。
②计算测试样本点(也就是待分类点)到其他每个样本点的距离 。
③对每个距离进行排序,然后选择出距离最小的K个点 。
④对K个点所属的类别进行比较,根据少数服从多数的原则,将测试样本点归入在K个点中占比最高的那一类 [3] 。
1.4KNN算法の三要素
K 近邻算法使用的模型实际上对应于对特征空间的划分。K 值的选择,距离度量和分类决策规则是该算法的三个基本要素:
-
K 值的选择会对算法的结果产生重大影响。K值较小意味着只有与输入实例较近的训练实例才会对预测结果起作用,但容易发生过拟合;如果 K 值较大,优点是可以减少学习的估计误差,但缺点是学习的近似误差增大,这时与输入实例较远的训练实例也会对预测起作用,使预测发生错误。在实际应用中,K 值一般选择一个较小的数值,通常采用交叉验证的方法来选择最优的 K 值。随着训练实例数目趋向于无穷和 K=1 时,误差率不会超过贝叶斯误差率的2倍,如果K也趋向于无穷,则误差率趋向于贝叶斯误差率。
-
该算法中的分类决策规则往往是多数表决,即由输入实例的 K 个最临近的训练实例中的多数类决定输入实例的类别
-
距离度量一般采用 Lp 距离,当p=2时,即为欧氏距离,在度量之前,应该将每个属性的值规范化,这样有助于防止具有较大初始值域的属性比具有较小初始值域的属性的权重过大。
二.KNN算法的模型建立
KNN中,当训练集、距离度量、k值及分类决策规则确定后,对于任何一个新的输入实例,它所属的类唯一地确定。这相当于根据上述要素将特征空间划分为一些子空间,确定子空间里的每个点所属的类。
2.1距离度量
特征空间中两个实例点的距离时两个实例点相似程度的反映。
在距离类模型,例如KNN中,有多种常见的距离衡量方法。 如欧几里得距离、曼哈顿距离、闵科夫斯基距离、切比雪夫距离及余弦距离。其中欧几里得距离 为最常见
2.2K值的选择
k
值的选择会对KNN
算法的结果产生重大影响。
k
值的减小就意味着整体模型变得复杂,器容易受到由于训练数据中的噪声而产生的过分拟合的影响。k
值的的增大就意味着整体的模型变得简单。如果k
太大,最近邻分类器可能会将测试样例分类错误,因为k
个最近邻中可能包含了距离较远的,并非同类的数据点。
在应用中,k
值一般选取一个较小的数值,通常采用交叉验证来选取最优的k
值。
2.3分类决策规则
根据 "少数服从多数,一 点算一票" 的原则进行判断,数量最多标签类别就是x
的标签类别。其中涉及到的原理是"越相近越相似",这也是KNN
的基本假设。
三.KNN算法的实现
- 实战案例
# 导入乳腺癌数据集的类及其他包
from sklearn.datasets import load_breast_cancer
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
# 实例化一份乳腺癌数据集对象
breast_cancer= load_breast_cancer()
# 查看数据
breast_cancer
# 数据的特征, 返回一个二维数组
X = breast_cancer['data']
X = pd.DataFrame(X)
name = ['平均半径','平均纹理','平均周长','平均面积','平均光滑度','平均紧凑度','平均凹度','平均凹点','平均对称','平均分形维数','半径误差','纹理误差','周长误差','面积误差','平滑度误差','紧凑度误差','凹度误差','凹点误差','对称误差','分形维数误差','最差半径','最差纹理','最差的边界','最差的区域','最差的平滑度','最差的紧凑性','最差的凹陷','最差的凹点','最差的对称性','最差的分形维数']
X.columns = name
# 数据的标签, 返回一个一维数组
y = breast_cancer['target']
# 划分数据,random_state固定划分方式
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y,random_state=42)
- 建立训练&测试模型
# 实例化一个5个最近邻的knn分类器
knn_clf = KNeighborsClassifier(n_neighbors=5)
# 训练模型
knn_clf.fit(X_train, y_train)
# 测试模型的准确率
knn_clf.score(X_test, y_test)
# 0.9590643274853801
这里的最近邻k
, 选取的是5,结果为0.9590643274853801
。需要思考两个问题:
1、前面提到 k
值的大小将会影响模型效果,如何选择合适的k
值?
2、模型得分是否可以进一步其他,受哪些因素影响?
- 数据预处理