KNN算法详解及实现

k近邻法(k-nearest neighbor,k-NN)是一种基本的分类和回归方法,是监督学习方法里的一种常用方法。k近邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其k个最近邻的训练实例类别,通过多数表决等方式进行预测。

k近邻算法用一句通俗的古语来说就是:“物以类聚,人以群分”。你要看一个实例的类别,你就可以看它附近是什么类别。如下图1.1所示,当要判断绿色实例的类别的时候,我们可以看看它的附近有哪些类,然后采取多数表决的决策规则(红色2个多于蓝色1个),于是把绿色实例也分类为红色那一类。

kkk近邻法三要素:距离度量kkk值的选择分类决策规则。常用的距离度量是欧氏距离及更一般的pL距离。kkk值小时,kkk近邻模型更复杂,容易发生过拟合;kkk值大时,kkk近邻模型更简单,又容易欠拟合。因此kkk值得选择会对分类结果产生重大影响。kkk值的选择反映了对近似误差与估计误差之间的权衡,通常由交叉验证选择最优的kkk。分类决策规则往往是多数表决,即由输入实例的kkk个邻近输入实例中的多数类决定输入实例的类。


距离度量:

设特征空间xxx是nnn维实数向量空间 ,xi,xj∈Xx_{i}, x_{j} \in \mathcal{X}xi​,xj​∈X,xi=(xi(1),xi(2),⋯,xi(n))Tx_{i}=\left(x_{i}^{(1)}, x_{i}^{(2)}, \cdots, x_{i}^{(n)}\right)^{\mathrm{T}}xi​=(xi(1)​,xi(2)​,⋯,xi(n)​)T,xj=(xj(1),xj(2),⋯,xj(n))Tx_{j}=\left(x_{j}^{(1)}, x_{j}^{(2)}, \cdots, x_{j}^{(n)}\right)^{\mathrm{T}}xj​=(xj(1)​,xj(2)​,⋯,xj(n)​)T,则:xix_ixi​,xjx_jxj​的LpL_pLp​距离定义为:

Lp(xi,xj)=(∑i=1n∣xi(i)−xj(l)∣p)1pL_{p}\left(x_{i}, x_{j}\right)=\left(\sum_{i=1}^{n}\left|x_{i}^{(i)}-x_{j}^{(l)}\right|^{p}\right)^{\frac{1}{p}}Lp​(xi​,xj​)=(∑i=1n​∣∣∣​xi(i)​−xj(l)​∣∣∣​p)p1​

  • p=1p= 1p=1 曼哈顿距离
  • p=2p= 2p=2 欧氏距离
  • p=∞p= \inftyp=∞ 切比雪夫距离

一般采用二维欧氏距离


交叉验证选取kkk值

在许多实际应用中数据是不充足的。为了选择好的模型,可以采用交叉验证方法。交叉验证的基本想法是重复地使用数据,把给定的数据进行切分,将切分的数据组合为训练集与测试集,在此基础上反复进行训练测试以及模型的选择。在实现过程中将采用sklearn.model_selection.cross_val_score()实现交叉验证选取kkk值。


分类决策规则

knn使用的分类决策规则是多数表决,如果损失函数为0-1损失函数,那么要使误分类率最小即使经验风险最小,多数表决规则实际上就等同于经验风险最小化。


KNN实现

实现K近邻算法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索。k近邻法最简单的实现方法是线性扫描,也就是暴力法计算输入实例到每一个训练实例的距离,然后取前k个距离最短的采取多数表决规则进行分类。但是如果训练集的数据量很大时,这种方法就不可行了。为了提高k近邻的搜索效率,可以考虑使用特殊的结构存储训练数据,以减少距离计算的次数,常用的有 kdkdkd(kdkdkd tree)树方法。


KNN算法实现

  1. sklearnsklearnsklearn封装KNN方法解析
sklearn.neighbors.KNeighborsClassifier(n_neighbors = 5,weights='uniform',algorithm = '',leaf_size = '30',p = 2,metric = 'minkowski',metric_params = None,n_jobs = None)

参数如下:

  • n_neighbors:这个值就是指 KNN 中的 “K”了。前面说到过,通过调整 K 值,算法会有不同的效果。
  • weights(权重):最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,决定了如何分配权重。参数选项如下:
    • ‘uniform’:不管远近权重都一样,就是最普通的 KNN 算法的形式。
    • ‘distance’:权重和距离成反比,距离预测目标越近具有越高的权重。
    • 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。
  • algorithm:在 sklearn 中,要构建 KNN 模型有三种构建方式,1. 暴力法,就是直接计算距离存储比较的那种放松。2. 使用 kd 树构建 KNN 模型 3. 使用球树构建。 其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 KD 树构建 KNN 模型,而当 KD 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下:
    • ‘brute’ :蛮力实现
    • ‘kd_tree’:KD 树实现 KNN
    • ‘ball_tree’:球树实现 KNN
    • ‘auto’: 默认参数,自动选择合适的方法构建模型
    不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 ‘brute’
  • leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的,当使用KD树或球树,它就是是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,否则速度过慢不说,还容易过拟合。
  • p:和metric结合使用的,当metric参数是"minkowski"的时候,p=1为曼哈顿距离, p=2为欧式距离。默认为p=2。
  • metric:指定距离度量方法,一般都是使用欧式距离。
    • ‘euclidean’ :欧式距离
    • ‘manhattan’:曼哈顿距离
    • ‘chebyshev’:切比雪夫距离
    • ‘minkowski’: 闵可夫斯基距离,默认参数
  • n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

属性如下:

  • classes_ : 分类器已知的类别标签,返回ndarray标签数组。
  • effective_metric_ :距离度量,和上述参数中metric参数设定的距离度量一致。
  • effective_metric_params_:指标函数附加的关键字参数,对于大多数距离指标,将会和metric参数相同,但如果effective_metric_params_属性设置为‘minkowski’,那么也可能包含p参数的值。返回的形式是字典。
  • outputs_2d_:训练时当y的形状为(n,)或(n,1),则返回False,否则返回True。

方法如下:

  • fit(X, y):使用X作为训练数据,y作为标签目标数据进行数据拟合训练。
  • get_params([deep]):获取参数组成的字典。
  • kneighbors([X, n_neighbors, return_distance]):找寻一个点的k个邻居。
  • predict(X):根据提供的数据去预测它的类别标签。
  • predict_proba(X):返回测试数据X的概率估计值。
  • score(X, y[, sample_weight]):返回给定数据和标签的平均准确度。
  • set_params(params):设置估值器的参数。

  1. 交叉验证法选取最佳kkk值
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier#加载鸢尾花数据集
iris = load_iris()
x = iris.data
y = iris.target
k_range = range(1, 31) # 设置循环次数
k_error = []
#循环,取k从1~30,查看误差效果
for k in k_range:knn = KNeighborsClassifier(n_neighbors=k)#cv参数决定数据集划分比例,这里是按照5:1划分训练集和测试集scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy')k_error.append(1 - scores.mean())#画图,x轴为k值,y值为误差值
plt.plot(k_range, k_error)
plt.xlabel('Value of K in KNN')
plt.ylabel('Error')
plt.show()

输出如下:

由这个图我们可以看出大致在k=11的时候,损失值是最小的,所以我们选择k = 11进行训练。

  1. knnknnknn实例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import neighbors, datasetsn_neighbors = 11# 加载鸢尾花数据集
iris = datasets.load_iris()
# 选择其中的两个特征
X = iris.data[:, :2]
y = iris.targeth = .02 # 网格步长# 创建色彩图
cmap_light = ListedColormap(['orange', 'cyan', 'cornflowerblue'])
cmap_bold = ListedColormap(['darkorange', 'c', 'darkblue'])# 在两种权重下绘制图像
for weights in ['uniform', 'distance']:# 创建knn分类器实例, 并进行训练拟合clf = neighbors.KNeighborsClassifier(n_neighbors, weights = weights)clf.fit(X,y)# 绘制决策边界x_min, x_max = X[:,0].min() - 1, X[:,0].max() + 1y_min, y_max = X[:,1].min() - 1, X[:,1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.figure()plt.pcolormesh(xx, yy, Z, cmap = cmap_light)# 绘制训练点plt.scatter(X[:, 0], X[:, 1], c = y, cmap = cmap_bold, edgecolor='k', s=20)plt.xlim(xx.min(), xx.max())plt.ylim(yy.min(), yy.max())plt.title('3-Class classification (k = %i, weights = "%s")' % (n_neighbors, weights))plt.show()

输出如下:


KNN总结

KNN算法优点:

  • 简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
  • 模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
  • 预测效果好。
  • 对异常值不敏感

KNN算法缺点:

  • 对内存要求较高,因为该算法存储了所有训练数据
  • 预测阶段可能很慢
  • 对不相关的功能和数据规模敏感

KNN算法详解及实现相关推荐

  1. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了     前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用 ...

  2. 3. KNN最近邻算法详解与关键技术剖析(理论篇)

    一.KNN算法概述 K最近邻(K-Nearest-Neighbour,KNN)算法可以说是最简单的分类算法,易于理解,其核心思想就是距离的比较,即离谁最近,就被归类于谁(群体投票的方式). 通俗解释: ...

  3. 【20210922】【机器/深度学习】KNN (K近邻) 算法详解

    一.算法概念 KNN, K-near neighbor,即最近邻算法.它是一种分类算法,算法思想是:一个样本与数据集中的 k 个样本最相似,如果这 k 个样本中的大多数属于某一个类别,则该样本也属于这 ...

  4. KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践

    KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践 如何使用GridSea ...

  5. 图解机器学习算法(13) | 聚类算法详解(机器学习通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...

  6. 【机器学习】集成学习及算法详解

    集成学习及算法详解 前言 一.随机森林算法原理 二.随机森林的优势与特征重要性指标 1.随机森林的优势 2.特征重要性指标 三.提升算法概述 四.堆叠模型简述 五.硬投票和软投票 1.概念介绍 2.硬 ...

  7. 邻域保留投影算法(NPE)(Neighborhood Preserving Embedding)算法详解

    上一篇降维算法的相关论文为LPP算法,也是何小飞老师的论文https://blog.csdn.net/qq_39187538/article/details/90402961 1.问题导入 2.算法出 ...

  8. 谱聚类算法详解及代码实现

    谱聚类算法详解及代码实现 文章目录 谱聚类算法详解及代码实现 参考 关于谱聚类介绍 谱聚类概述 谱聚类前置知识 无向权重图 邻接矩阵 度矩阵 拉普拉斯矩阵 相似度矩阵 确定目标函数 初始化目标函数(最 ...

  9. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

最新文章

  1. java lambda 变量_java8新特性-lambda(变量捕获)
  2. codeforces_A. Salem and Sticks_数组/暴力
  3. mysql压力测试工具Mysqlslap
  4. springboot中controller单例模式多线程安全的简单理解
  5. modbus软件开发实战指南_C++核心准则?GSL:指南支持库
  6. 优质的程序员需为代码效率而呕心沥血
  7. Java讲课笔记07:计数循环与嵌套循环
  8. C# Winform播放多媒体文件 [AudioVideoPlayback ]
  9. 辞职腾讯去了小公司,从0到1搭建后端架构,工资就翻倍了
  10. Winform文件下载之断点续传
  11. MATLAB最基础的教程
  12. 二进制颜色查询对照表
  13. camera - 滤镜格式 (原生RGGB、RCCB、RCCC、RGB-IR和Monochrome(单色传感器))
  14. python安装pyaudio_关于python:PyAudio不会安装
  15. Google 最新版 Chrome 崩溃
  16. InputStream 、FileInputStream、InputStreamReader 、BufferedReader的区别
  17. Windows Server 2012 R2更新补丁后:你的电脑将在一分钟后自动重启
  18. 计算机专业硕士论文评语,硕士论文评审意见范文
  19. android 清理后自动重启,解决Android后台清理APP后,程序自动重启的问题
  20. 传统的招投标or在线招投标

热门文章

  1. 同样苹果iPhone备份,为什么 Mazing和iTunes差距这么大
  2. 快递单号物流查询,怎样查找出多次揽收的单号
  3. 孪生再世代表数字几_黑暗传说之再世狼人
  4. 扩展 WPF 动画类
  5. 宇宙工大路由器管理APP使用手册
  6. 进程截杀器v1.1.1.5去插件正式版
  7. 360自带--JS开发工具箱
  8. python anaconda和pycharm_python anaconda与pycharm的特点
  9. 视频监控,硬盘录像机安装
  10. 怎样能显示计算机的配置高低,电脑配置怎么看高低,电脑配置知识大全