📝本文介绍
本文为作者阅读鸢尾花书籍以及一些其他资料的k最近邻分类后,所作笔记
👋作者简介:一个正在积极探索的本科生📱联系方式:943641266(QQ)
🚪Github地址:https://github.com/sankexilianhua
🔑Gitee地址:https://gitee.com/Java_Ryson
由于本人的知识所限,如果文章有问题,欢迎大家联系并指出,博主会在第一时间修正。
文章目录
- [📕1. 原理](#📕1. 原理)
- [📘2. 流程](#📘2. 流程)
- [📙3. 分类](#📙3. 分类)
-
- [📖3.1 二分类](#📖3.1 二分类)
- [📖3.2 三分类](#📖3.2 三分类)
- [📖3.3 k值的影响](#📖3.3 k值的影响)
- [📗4. k-nn变种](#📗4. k-nn变种)
-
- [📖4.1 对投票权重的处理](#📖4.1 对投票权重的处理)
- [📖4.2 最近质心分类器(NCC)](#📖4.2 最近质心分类器(NCC))
📕1. 原理
K 最近邻 (KNN) 算法是一种非参数化的监督学习分类器,它利用邻近度来对单个数据点的分组进行分类或预测。 它是当今机器学习中使用的最广泛且最简便的分类与回归分类器之一。 k近邻算法,也称为 KNN 或 k-NN,是一种非参数、有监督的学习分类器,KNN 使用邻近度对单个数据点的分组进行分类或预测。
优点:
- 简单
- 不需要训练过程
- 对非线性分类问题表现良好
缺点:
- 需要大量存储训练集
- 预测速度较慢
- 对高维数据容易出现维数灾难
核心思想:小范围投票,少数服从多数
📘2. 流程
给定样本数据X( x ( 1 ) , x ( 2 ) , x ( 3 ) , . . . x^{(1)},x^{(2)},x^{(3)},... x(1),x(2),x(3),...,分别对应已知标签 y ( 1 ) , y ( 2 ) , y ( 3 ) , . . . y^{(1)},y^{(2)},y^{(3)},... y(1),y(2),y(3),....查询点q标签未知,待预测分类。
- 计算样本数据X任意一点x和查询点q的距离
- 找X中距离查询点q最近的k个样本,即k个"近邻"
- 根据k个邻居已知标签,直接投票或加权投票;k个邻居出现数量最多的标签即为查询点q预测分类结果
📙3. 分类
📖3.1 二分类
有一组数据集两个特征( x 1 , x 2 x_1,x_2 x1,x2)(特征显然也可以不止两个),有两类标签, c 1 , c 2 c_1,c_2 c1,c2,c1表示红色,c2表示蓝色。在其中随便查找一个点q,这个点属于哪一类?
显然,这里的任一点x和q的距离可以看作是两点之间的距离。k就是指定几个近邻(按距离远近来排,看要取几个点)。
这里就可以看出,采用k=4的话,选择4个最近的点,统计他们的标签,最后少数服从多数,可以得到q的一个归属。
这里要注意:k是一个超参数,对其设定的不同,会影响到最后对于q归属的判定。
sklearn.neighbors.KNeighborsClassifier 为 Scikit-learn工具包k-NN分类算法函数
默认的近邻数量n_neighbors为5
默认距离量metric为欧氏距离
常用的methods为
fit(x,y):拟合样本数据
predit(q):预测查询点q的分类
📖3.2 三分类
三分类,实际上是有三类标签,其他的都与二分类差不多。
图中蓝色的线称为决策边界。
-
若决策边界为直线,平面,或超平面,那么这个分类问题是线性的。否则,该问题是非线性的。
-
如果决策边界可以使用简单或复杂的函数来表示,那么该模型称为参数模型 。类似k-NN这样的学习算法得到的决策边界为非参数模型
泛化能力:指机器学习算法对全新样本的适应能力。适应能力越强,泛化能力越强。
k-NN基于训练数据,更准确地说是把训练数据以一定的形式存储起来完成学习任务。
📖3.3 k值的影响
k值为用户输入值(即:超参数),其会影响到决策边界的形成。
- 较小的k值能准确捕捉训练数据的分类模式;但,容易受到噪声的影响、
- 较大的k值能够抑制噪声的影响;但分类界限不明显
为什么会影响?
在KNN中,不论要分多少个类,实际上决定计算次数的还是超参数K,它决定了取四周最近的多少个点来确定,那么一旦范围扩大,就有可能包含更多的点,对分类的结果就会有所影响。影响分类的结果,自然而然就会影响到决策边界的形成。
📗4. k-nn变种
在原本的knn中,所有点的投票权重都是相同的(即等权重投票)。但是,很多knn也可以使用加权投票的方式,有时会更加有效。
📖4.1 对投票权重的处理
距离查询点越近的近邻,投票权重越高;越近的近邻,投票权重越低。
实际sklearn库中可以使用:sklearn.neighbors.KNeighborsClassifier 来实现,使用其来设定投票权重
此外,也可以将近邻投票权归一化处理:
w i = m a x ( d N N ) − d i m a x ( d N N ) − m i n ( d N N ) w_i={max(d_{NN})-d_i \over max(d_{NN})-min(d_{NN})} wi=max(dNN)−min(dNN)max(dNN)−di
这样,距离随着距离增大,权重逐渐减小。
归一化:
将一列数据变化到某个固定区间(范围)中,通常,这个区间是[0, 1] 或者(-1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。
📖4.2 最近质心分类器(NCC)
数据质心
μ k = 1 c o u n t ( C k ) i = C k Σ i = C k X ( i ) {μ_k = {1 \over count(C_k){i=C_k}}}Σ{i=C_k}X^{(i)} μk=count(Ck)i=Ck1Σi=CkX(i)
也就是每一组向量的相同位置的元素,相加之后取平均值。所以实际上的 μ k = { E ( x 1 ) , E ( x 2 ) , . . . } {μ_k=\{E(x_1),E(x_2),...\}} μk={E(x1),E(x2),...}
最质心分类器原理
先求解得到不同类别样本数据簇质心位置 μ m μ_m μm;查询点q距离哪个分类质心越近,其预测分类则被划定为这一类。
最质心分类器,不需要设定最近邻数量k
python工具包完成最近质心分类的函数为:sklearn.neighbors.NearestCentroid。
同时,可以发现,多个类别之间的分类线,其实就是不同质心之间的中垂线。
收缩阈值
sklearn.neighbors.NearestCentroid函数同时也提供收缩阈值,以获得最近收缩质心。
即:随着收缩阈值的增大,各类数据的质心会向着数据总质心靠近,那么分类边界也会随之不断变化