【笔记】k-Nearest Neighbors(KNN/k近邻)原理
文章目录
- 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 maxcj∑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=cjargmaxxi∈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=cj0,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)=maxl∣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)}k1xk∈Nk(x)∑I(yi=cj)=1−k1xk∈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 其余问题
- 解决回归问题可以看作周围k个邻居的(加权)平均
- KNN使用暴力法效率低下,如果训练集有m个样本,n个特征,则每预测一个新的数据,需要O(m*n)=》使用树结构进行优化:KD-Tree,Ball-Tree
- 高度数据相关=》对异常数据敏感
- 预测结果不具有可解释性
- 维数灾难=》降维手段
5 参考
本博客的目的在于记录自己学习的过程,若有错误,还望各位批评指正。
参考资料如下:
Python3入门机器学习 经典算法与应用
西瓜书 by zzh
南瓜书 from github
统计学习方法 by lh
个人在学习这几个资源的相应章节之后,感觉:
- bobo老师讲的通俗易懂,更加贴近代码使用层面
- 西瓜书关于KNN的内容比较少,更加注重于降维处理
- 南瓜书是对西瓜书中“泛化错误率”推导的解释
- 统计学习方法这本书,我认为是学习KNN的最好资源,很好的符合学习该模型的思路,并且解释与公式并存。
【笔记】k-Nearest Neighbors(KNN/k近邻)原理相关推荐
- KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践
KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践 如何使用GridSea ...
- 机器学习笔记(一) KNN K-最近邻
零.摘要 本篇文章主要讲述KNN算法(K-nearest neighbor)的原理与技术细节,并简单提及了数据预处理的方法. 主要参考资料: 斯坦福CS231n课程笔记:分类 <机器学习> ...
- [机器学习-sklearn] KNN(k近邻法)学习与总结
KNN 学习与总结 引言 一,KNN 原理 二,KNN算法介绍 三, KNN 算法三要素 1 距离度量 2. K 值的选择 四, KNN特点 KNN算法的优势和劣势 KNN算法优点 KNN算法缺点 五 ...
- k Nearest Neighbor Algorithm
k Nearest Neighbor Algorithm k Nearest Neighbor(kNN) algorithm算法和k-Means算法一样,都是简单理解,但是实际效果出人意料的算法之一. ...
- 【cs231n作业笔记】一:KNN分类器
安装anaconda,下载assignment作业代码 作业代码数据集等2018版基于python3.6 下载提取码4put 本课程内容参考: cs231n官方笔记地址 贺完结!CS231n官方笔记授 ...
- 机器学习——K近邻算法(KNN)(K Nearest Neighbor)
参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...
- kNN算法(k近邻算法,k Nearest Neighbor)
主要内容: 1.认识kNN算法 2.kNN算法原理 3.应用举例 4.kNN改进方法 1.认识knn算法 "看一个人怎么样,看他身边的朋友什么样就知道了",kNN算法即寻找最近的K ...
- 【机器学习】机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解...
k-最近邻算法是基于实例的学习方法中最基本的,先介绍基于实例学习的相关概念. 01 基于实例的学习 已知一系列的训练样例,很多学习方法为目标函数建立起明确的一般化描述:但与此不同,基于实例的学习方法只 ...
- 机器学习笔记(十)---- KNN(K Nearst Neighbor)
KNN是一种常见的监督学习算法,工作机制很好理解:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个"邻居"的信息来进行预测.总结一句话就是&quo ...
- knn K近邻算法python实现
本文主要内容: knn K近邻算法原理 sklearn knn的使用,以及cross validation交叉验证 numpy 实现knn knn改进方法 1 knn K近邻算法原理 K近邻算法:给定 ...
最新文章
- linux里的dd权限不够怎么办,Linux dd 遇到 容量不足 的 resize 解法
- 表格 树形结构 HTML 语言 CSS,HTML介绍(示例代码)
- php intl make 错误,无法在Debian上为php安装’intl’扩展名
- linux 下 apache启动、停止、重启命令
- hadoop学习5 搭建storm集群
- [20170617]vim中调用sqlplus.txt
- Linux - which xxx - 查找执行的命令所在的路径
- Python爬取抖音app视频
- Python爬虫实战01:Requests+正则表达式爬取猫眼电影
- 计算机机房工程规划方案,机房工程规划书文档.docx
- mac小技巧——快速修改图片尺寸
- 8、ESP8266 深度睡眠
- electron 静默打印,及 打印机状态汇总
- 北京逛街攻略总结篇(MM必看)
- PayPal 全攻略
- 综述:神经网络的优化-优化器,动量,自适应学习率,批量归一化
- csv文件——读和遍历csv文件
- 图像语义分割实战:TensorFlow Deeplabv3+ 训练自己数据集
- 经历 C/C++ 大辩论之后
- python网络安全的书下载_Kindle电子书 网络安全技术 – 计算机网络安全技术 PDF...