K近邻算法是我们学习机器学习时的第一个算法,K近邻算法不像其他算法那样需要建立一个显式的算法模型,但是掌握K近邻算法的原理非常重要。

1.K-近邻(KNearestNeighbor,KNN)算法简介:对于一个未知的样本,我们可以根据离它最近的k个样本的类别来判断它的类别。

以下图为例,对于一个未知样本绿色小圆,我们可以选取离它最近的3的样本,其中包含了2个红色三角形,1个蓝色正方形,那么我们可以判断绿色小圆属于红色三角形这一类。
我们也可以选取离它最近的5个样本,其中包含了3个蓝色正方形,2个红色三角形,那么我们可以判断绿色小圆属于蓝色正方形这一类。

Knn网络构造图_数据集


2.原理简介:对于给定一个未知样本Xu,我们首先计算它距离数据集中每个样本的距离d1、d2…dn。然后对距离按照从小到大的顺序排序,选取前k个样本。观察这k个样本的分布。

两种距离计算方法:

曼哈顿距离:Knn网络构造图_数据集_02

欧式距离:Knn网络构造图_机器学习_03

Knn网络构造图_数据集_04

3.API文档

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, 
algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=None, **kwargs)

下面我们来对KNN算法中的参数项做一个解释说明:


‘n_neighbors’:选取的参考对象的个数(邻居个数),默认值为5,也可以自己指定数值,但不是n_neighbors的值越大分类效果越好,最佳值需要我们做一个验证。
‘weights’: 距离的权重参数,默认uniform。
‘uniform’: 均匀的权重,所有的点在每一个类别中的权重是一样的。简单的说,就是每个点的重要性都是一样的。
‘distance’:权重与距离的倒数成正比,距离近的点重要性更高,对于结果的影响也更大。
‘algorithm’:运算方法,默认auto。
‘auto’:根绝模型fit的数据自动选择最合适的运算方法。
‘ball_tree’:树模型算法BallTree
‘kd_tree’:树模型算法KDTree
‘brute’:暴力算法
‘leaf_size’:叶子的尺寸,默认30。只有当algorithm = ‘ball_tree’ or ‘kd_tree’,这个参数需要设定。
‘p’:闵可斯基距离,当p = 1时,选择曼哈顿距离;当p = 2时,选择欧式距离。
n_jobs:使用计算机处理器数目,默认为1。当n=-1时,使用所有的处理器进行运算。


4.应用案例演示
下面以Sklearn库中自带的数据集–手写数字识别数据集为例,来测试下kNN算法。上一章,我们简单的介绍了机器学习的一般步骤:加载数据集 - 训练模型 - 结果预测 - 保存模型。这一章我们还是按照这个步骤来执行。
手写数字识别数据集

#导入我们要使用的库
import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
#train_test_split可以将我们的数据集切分为训练集和测试集
from sklearn.model_selection import train_test_split

#加载我们要使用的数据集
digits = datasets.load_digits()
X = digits.data #获取特征值
y = digits.target #获取标签值

#切分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state = 0)
#test_size=0.3是将我们的数据集分为70%的训练集和30%的测试集。
#random_state = 0指定一个随机种子,使得每次切分的训练集和测试集都是一致的。

#指定我们要使用的模型
knn = KNeighborsClassifier()#在此我们使用默认值就可以。

#模型训练
knn.fit(X_train,y_train)
#模型预测
knn.predict(X_test[:10,:]) #预测下测试集中前10个结果
[2 8 2 6 6 7 1 9 8 5 2 8 6 6 6 6 1 0 5 8]

#模型精度评估
knn.score(X_test,y_test)
0.9814814814814815

5.模型的方法

每一种模型都有一些它独有的属性方法(模型的技能,能做些什么事),下面我们来了解下knn算法常用的的属性方法。

knn.fit(X,y)#训练数据集
knn.get_params()#获取当前模型中的参数
{'algorithm': 'auto',
 'leaf_size': 30,
 'metric': 'minkowski',
 'metric_params': None,
 'n_jobs': None,
 'n_neighbors': 5,
 'p': 2,
 'weights': 'uniform'}
knn.predict(X)#预测X的结果
knn.score(X,y)#评估模型的精度

6.knn算法的优缺点
优点:
简单,效果还不错,适合多分类问题
缺点:
效率低(因为要计算预测样本距离每个数据点的距离,然后排序),效率会随着样本量的增加而降低。