文章目录

  • 1 原理
    • 1.1 数学形式
    • 1.2 几何空间
  • 2 优化
    • 2.1 k值的选择
    • 2.2 距离的度量
    • 2.3 分类决策规则
  • 3 代码
    • 3.1 直接使用sklearn中的API
    • 3.2 底层编写
  • 4 其余问题
  • 5 参考

1 原理

1.1 数学形式

kNN的算法和模型十分简单:

给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最近邻的k个实例,在某种评判标准下(平均或加权)这k个实例的“多数”属于某个类,就把该输入实例分为这个类。
本质:两个样本足够相似,就有更高的概率属于同一个类别。而看一个样本往往有失偏颇,因此会看k个样本。
KNN天然可以解决多分类问题
KNN可以解决分类和回归问题

用数学公式来描述该原理,则:

输入:给定训练数据集
T={(x1,y1),(x2,y2),…,(xN,yN)}{ T = \{(x_1,y_1),(x_2,y_2),\dots ,(x_N,y_N) \} }T={(x1​,y1​),(x2​,y2​),…,(xN​,yN​)}
其中,xi∈Rn{ x_i \in R^n }xi​∈Rn为实例的特征向量,yi∈Y={c1,c2,…,cK}{ y_i \in Y = \{ c_1,c_2,\dots ,c_K \}}yi​∈Y={c1​,c2​,…,cK​}为实例的类别,i=1,2,…,N{i=1,2,\dots,N}i=1,2,…,N
输出:实例x所属的类y
y=arg max⁡cj∑xi∈Nk(x)I(yi=cj),i=1,2,…,N;j=1,2,…,K{ y=\argmax_{c_j} \sum_{x_i \in N_k(x) } I(y_i = c_j),i=1,2,\dots,N; j=1,2,\dots,K}y=cj​argmax​xi​∈Nk​(x)∑​I(yi​=cj​),i=1,2,…,N;j=1,2,…,K
其中,I{I}I为指示函数,即:
I(yi=cj)={1,yi=cj0,otherwiseI(y_i=c_j)= \begin{cases} 1,\quad y_i=c_j \\ 0, \quad otherwise \end{cases} I(yi​=cj​)={1,yi​=cj​0,otherwise​

特别的,当k=1{k=1}k=1时,称为最近邻。

1.2 几何空间

KNN可以根据特征向量给实例一个类别,那么就可以看作该模型把特征空间划分为一些子空间,并确定子空间里的每个点所属的类
单元cell):特征空间中,对于每个训练实例点xi{x_i}xi​,距离该点比其它点更近的所有点组成的一个区域。
每个训练实例点拥有一个单元,所有训练实例的单元构成对特征空间的一个划分。
k=1{k=1}k=1时,最近邻模型将实例xi{x_i}xi​的类yi{y_i}yi​作为其单元所有点的类标记。因此,每个单元的实例点的类别是确定的。

(图from李航的统计学习方法)

2 优化

通过对原理的了解,我们很容易找到该模型的三个要素:

  • k值的选择
  • 距离的度量
  • 分类决策规则

2.1 k值的选择

选择较小的k值?

用较小的邻域中的训练实例进行预测
近似误差会减小(只有与输入实例较近的训练实例才会对预测结果其作用)
估计误差会增大(预测结果会对近邻的实例点非常敏感,如果那个点恰巧是噪声……)
整体模型变得复杂,容易发生过拟合

选择较大的k值?

近似误差会增大
估计误差会减小
整体模型变得简单

具体应用中,k值一般较小,采用交叉验证法来选取最优k值。
sklearn中API的n_neighbors默认值为5.

2.2 距离的度量

已知:

特征空间χ{\chi}χ是n维实数向量空间Rn,xi,xj∈χ,xi=(xi(1),xi(2),…,xi(n))T,xj=(xj(1),xj(2),…,xj(n))T{R^n,x_i,x_j \in \chi,x_i=(x_i^{(1)},x_i^{(2)},\dots,x_i^{(n)})^T,x_j=(x_j^{(1)},x_j^{(2)},\dots,x_j^{(n)})^T}Rn,xi​,xj​∈χ,xi​=(xi(1)​,xi(2)​,…,xi(n)​)T,xj​=(xj(1)​,xj(2)​,…,xj(n)​)T
xi,xj之间的距离Lp,p≥1{x_i,x_j之间的距离L_p,p\geq 1}xi​,xj​之间的距离Lp​,p≥1

数学上常用的距离有:

  • 欧式距离(Euclidean distance

p=2,L2(xi,xj)=(∑l=1n∣xi(l)−xj(l)∣2)12{p=2,L_2(x_i,x_j)=(\sum_{l=1}^n |x_i^{(l)}-x_j^{(l)}| ^2)^{\frac{1}{2}}}p=2,L2​(xi​,xj​)=(l=1∑n​∣xi(l)​−xj(l)​∣2)21​

  • 曼哈顿距离(Manhattan distance

p=1,L1(xi,xj)=∑l=1n∣xi(l)−xj(l)∣{p=1,L_1(x_i,x_j)=\sum_{l=1}^n |x_i^{(l)}-x_j^{(l)}| }p=1,L1​(xi​,xj​)=l=1∑n​∣xi(l)​−xj(l)​∣

  • 切比雪夫距离(Chebyshev distance

p=∞,L∞(xi,xj)=max⁡l∣xi(l)−xj(l)∣{p=\infty,L_\infty(x_i,x_j)=\max_l |x_i^{(l)}-x_j^{(l)}|}p=∞,L∞​(xi​,xj​)=lmax​∣xi(l)​−xj(l)​∣

但,这些均可以统一成Lp{L_p}Lp​距离,即Minkowski distance

Lp(xi,xj)=(∑l=1n∣xi(l)−xj(l)∣p)1p{L_p(x_i,x_j)=(\sum_{l=1}^n |x_i^{(l)}-x_j^{(l)}| ^p)^{\frac{1}{p}}}Lp​(xi​,xj​)=(l=1∑n​∣xi(l)​−xj(l)​∣p)p1​

sklearn中API的metric默认是Minkowski distance,其参数p默认为2,即欧式距离。
具体距离评价指标可以参考官方文档:

sklearn.neighbors.DistanceMetric

2.3 分类决策规则

最简单,也是最常用的就是“多数表决”:

如果分类的损失函数为0-1损失函数,分类函数:
f:Rn→{c1,c2,…,cK}{f:R^n\rightarrow \{ c_1,c_2,\dots,c_K\}}f:Rn→{c1​,c2​,…,cK​}
误分类的概率:
P(Y≠f(X))=1−P(Y=f(X)){P(Y\neq f(X)) = 1-P(Y=f(X))}P(Y​=f(X))=1−P(Y=f(X))
1k∑xk∈Nk(x)I(yi≠cj)=1−1k∑xk∈Nk(x)I(yi=cj){\frac{1}{k} \sum_{x_k\in N_k(x)} I(y_i\neq c_j)=1- \frac{1}{k} \sum_{x_k\in N_k(x)} I(y_i=c_j)}k1​xk​∈Nk​(x)∑​I(yi​​=cj​)=1−k1​xk​∈Nk​(x)∑​I(yi​=cj​)
分类决策规则的目的实际上等价于经验风险最小化

但是,这种没有权重的投票规则在遇到平票问题的时候就没法解决。
具体体现在sklearn中API的weights中,来决定是否加权。
如果选择加权,则直接使用距离的倒数来表示权重。

3 代码

代码这里有两部分:

  • 直接使用sklearn中的API进行应用

1.6. Nearest Neighbors
sklearn.neighbors.KNeighborsClassifier
sklearn.neighbors.KNeighborsRegressor

  • 仿照上面的API进行自己编写调用

3.1 直接使用sklearn中的API

这里给出一个分类的demo:

from sklearn.neighbors import KNeighborsClassifier
# 分类器实例化
kNN_classifier = KNeighborsClassifier(n_neighbors=6)
# 训练分类器
kNN_classifier.fit(X_train, y_train)
# 使用训练后的分类器进行预测
y_predict = kNN_classifier.predict(X_predict)

3.2 底层编写

直接参考:
github的04-KNN

4 其余问题

  1. 解决回归问题可以看作周围k个邻居的(加权)平均
  2. KNN使用暴力法效率低下,如果训练集有m个样本,n个特征,则每预测一个新的数据,需要O(m*n)=》使用树结构进行优化:KD-Tree,Ball-Tree
  3. 高度数据相关=》对异常数据敏感
  4. 预测结果不具有可解释性
  5. 维数灾难=》降维手段

5 参考

本博客的目的在于记录自己学习的过程,若有错误,还望各位批评指正。
参考资料如下:

Python3入门机器学习 经典算法与应用
西瓜书 by zzh
南瓜书 from github
统计学习方法 by lh

个人在学习这几个资源的相应章节之后,感觉:

  • bobo老师讲的通俗易懂,更加贴近代码使用层面
  • 西瓜书关于KNN的内容比较少,更加注重于降维处理
  • 南瓜书是对西瓜书中“泛化错误率”推导的解释
  • 统计学习方法这本书,我认为是学习KNN的最好资源,很好的符合学习该模型的思路,并且解释与公式并存。

【笔记】k-Nearest Neighbors(KNN/k近邻)原理相关推荐

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

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

  2. 机器学习笔记(一) KNN K-最近邻

    零.摘要 本篇文章主要讲述KNN算法(K-nearest neighbor)的原理与技术细节,并简单提及了数据预处理的方法. 主要参考资料: 斯坦福CS231n课程笔记:分类 <机器学习> ...

  3. [机器学习-sklearn] KNN(k近邻法)学习与总结

    KNN 学习与总结 引言 一,KNN 原理 二,KNN算法介绍 三, KNN 算法三要素 1 距离度量 2. K 值的选择 四, KNN特点 KNN算法的优势和劣势 KNN算法优点 KNN算法缺点 五 ...

  4. k Nearest Neighbor Algorithm

    k Nearest Neighbor Algorithm k Nearest Neighbor(kNN) algorithm算法和k-Means算法一样,都是简单理解,但是实际效果出人意料的算法之一. ...

  5. 【cs231n作业笔记】一:KNN分类器

    安装anaconda,下载assignment作业代码 作业代码数据集等2018版基于python3.6 下载提取码4put 本课程内容参考: cs231n官方笔记地址 贺完结!CS231n官方笔记授 ...

  6. 机器学习——K近邻算法(KNN)(K Nearest Neighbor)

    参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...

  7. kNN算法(k近邻算法,k Nearest Neighbor)

    主要内容: 1.认识kNN算法 2.kNN算法原理 3.应用举例 4.kNN改进方法 1.认识knn算法 "看一个人怎么样,看他身边的朋友什么样就知道了",kNN算法即寻找最近的K ...

  8. 【机器学习】机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解...

    k-最近邻算法是基于实例的学习方法中最基本的,先介绍基于实例学习的相关概念. 01 基于实例的学习 已知一系列的训练样例,很多学习方法为目标函数建立起明确的一般化描述:但与此不同,基于实例的学习方法只 ...

  9. 机器学习笔记(十)---- KNN(K Nearst Neighbor)

    KNN是一种常见的监督学习算法,工作机制很好理解:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个"邻居"的信息来进行预测.总结一句话就是&quo ...

  10. knn K近邻算法python实现

    本文主要内容: knn K近邻算法原理 sklearn knn的使用,以及cross validation交叉验证 numpy 实现knn knn改进方法 1 knn K近邻算法原理 K近邻算法:给定 ...

最新文章

  1. linux里的dd权限不够怎么办,Linux dd 遇到 容量不足 的 resize 解法
  2. 表格 树形结构 HTML 语言 CSS,HTML介绍(示例代码)
  3. php intl make 错误,无法在Debian上为php安装’intl’扩展名
  4. linux 下 apache启动、停止、重启命令
  5. hadoop学习5 搭建storm集群
  6. [20170617]vim中调用sqlplus.txt
  7. Linux - which xxx - 查找执行的命令所在的路径
  8. Python爬取抖音app视频
  9. Python爬虫实战01:Requests+正则表达式爬取猫眼电影
  10. 计算机机房工程规划方案,机房工程规划书文档.docx
  11. mac小技巧——快速修改图片尺寸
  12. 8、ESP8266 深度睡眠
  13. electron 静默打印,及 打印机状态汇总
  14. 北京逛街攻略总结篇(MM必看)
  15. PayPal 全攻略
  16. 综述:神经网络的优化-优化器,动量,自适应学习率,批量归一化
  17. csv文件——读和遍历csv文件
  18. 图像语义分割实战:TensorFlow Deeplabv3+ 训练自己数据集
  19. 经历 C/C++ 大辩论之后
  20. python网络安全的书下载_Kindle电子书 网络安全技术 – 计算机网络安全技术 PDF...

热门文章

  1. Angular4+ 页面切换 显示进度条
  2. 从源码解析kube-scheduler默认的配置
  3. 一键安装lamp环境 centos
  4. Jenkins实现持续集成 上传远程服务器war 并执行sh脚本重启
  5. PHP专家陪练营试听课程下载
  6. vue里动态设置并获取ref
  7. if判断与while、for循环语句
  8. 一个HTML 导航栏下划线跟随效果
  9. 流畅的python和cookbook学习笔记(五)
  10. centos7 centos6.5部KVM使用NAT联网并为虚拟机配置firewalld iptables防火墙端口转发...