什么是KNN算法?

 

KNN(K-Nearest Neighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。

KNN算法的思想非常简单:对于任意n维输入向量,分别对应于特征空间中的一个点,输出为该特征向量所对应的类别标签或预测值。

KNN算法是一种非常特别的机器学习算法,因为它没有一般意义上的学习过程。它的工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。

输入没有标签的数据后,将这个没有标签的数据的每个特征与样本集中的数据对应的特征进行比较,然后提取样本中特征最相近的数据(最近邻)的分类标签。

一般而言,我们只选择样本数据集中前k个最相似的数据,这就是KNN算法中K的由来,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的类别,作为新数据的分类。

KNN分类算法

KNN分类算法的分类预测过程十分简单并容易理解:对于一个需要预测的输入向量x,我们只需要在训练数据集中寻找k个与向量x最近的向量的集合,然后把x的类别预测为这k个样本中类别数最多的那一类。

如图所示,ω1、ω2、ω3分别代表训练集中的三个类别。其中,与xu最相近的5个点(k=5)如图中箭头所指,很明显与其最相近的5个点中最多的类别为ω1,因此,KNN算法将xu的类别预测为ω1。

基于上述思想给出如下所示的KNN算法:

输入:训练数据集

其中: 

为n维的实例特征向量。 

为实例的类别,其中,i=1,2,…,N,预测实例x。

输出:预测实例x所属类别y。

算法执行步骤:

1. 根据给定的距离量度方法(一般情况下使用欧氏距离)在训练集T中找出与x最相近的k个样本点,并将这k个样本点所表示的集合记为N_k(x);

2. 根据如下所示的多数投票的原则确定实例x所属类别y:

上式中I为指示函数:

通过上述KNN算法原理的讲解,我们发现要使KNN算法能够运行必须首先确定两个因素:(1)算法超参数k;(2)模型向量空间的距离量度。

 

K值的确定

KNN算法中只有一个超参数k,k值的确定对KNN算法的预测结果有着至关重要的影响。接下来,我们讨论一下k值大小对算法结果的影响以及一般情况下如何选择k值。

如果k值比较小,相当于我们在较小的领域内训练样本对实例进行预测。这时,算法的近似误差(Approximate Error)会比较小,因为只有与输入实例相近的训练样本才会对预测结果起作用。

但是,它也有明显的缺点:算法的估计误差比较大,预测结果会对近邻点十分敏感,也就是说,如果近邻点是噪声点的话,预测就会出错。因此,k值过小容易导致KNN算法的过拟合。

同理,如果k值选择较大的话,距离较远的训练样本也能够对实例预测结果产生影响。这时候,模型相对比较鲁棒,不会因为个别噪声点对最终预测结果产生影响。但是缺点也十分明显:算法的近邻误差会偏大,距离较远的点(与预测实例不相似)也会同样对预测结果产生影响,使得预测结果产生较大偏差,此时模型容易发生欠拟合。

因此,在实际工程实践中,我们一般采用交叉验证的方式选取k值。通过以上分析可知,一般k值选得比较小,我们会在较小范围内选取k值,同时把测试集上准确率最高的那个确定为最终的算法超参数k。

 

距离量度

样本空间内的两个点之间的距离量度表示两个样本点之间的相似程度:距离越短,表示相似程度越高;反之,相似程度越低。

常用的距离量度方式包括:

闵可夫斯基距离

欧氏距离

曼哈顿距离

切比雪夫距离

余弦距离

 

闵可夫斯基距离

闵可夫斯基距离本身不是一种距离,而是一类距离的定义。对于n维空间中的两个点x(x1,x2,…,xn)和y(y1,y2,…,yn),x和y之间的闵可夫斯基距离可以表示为:

其中,p是一个可变参数:

当p=1时,被称为曼哈顿距离;

当p=2时,被称为欧氏距离;

当p=\infty时,被称为切比雪夫距离。

 

欧氏距离

根据以上定义,欧氏距离可以写为:

 欧氏距离(L2范数)是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式,也是最常用的距离量度。

 

曼哈顿距离

根据闵可夫斯基距离定义,曼哈顿距离的计算公式可以写为:

KNN算法的核心:KDTree

KNN分类算法的思想非常简单,就是k个最近邻多数投票的思想,关键就是在给定的距离量度下,如果快速找到预测实例的最近的k个邻居?

初学者一般采用直接暴力寻找的方法,因为k值一般不会取得特别大。确实,特征空间维度不高且训练样本容量小时,暴力寻找方法是可行的,但是当特征空间维度特别高或者样本容量较大时,计算过程就会非常耗时,这种方法就不可行了。

因此,为了快速查找到k个近邻,我们可以考虑使用特殊的数据结构存储训练数据,用来减少搜索次数。其中,KDTree就是最著名的一种。

KDTree(K-dimension Tree)是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。KDTree是一种二叉树,表示对k维空间的一种划分构造KDTree相当于不断地利用垂直于坐标轴的超平面将k维空间进行切分,构成一系列的k维超矩形区域。KDTree的每个节点对应于一个k维超矩形区域。利用KDTree可以省去对大部分数据点的搜索,从而减少搜索的计算量。

 

KDTree的构造

我们使用递归方法来构造KDTree:(1)构造根节点,使根节点对应于k维空间中包含的所有点的超矩形区域;(2)不断地对k维空间进行切分,生成子节点。

构造根节点

首先,在包含所有节点的超矩形区域内选择一个坐标轴和在此坐标轴上的一个切分点,确定一个垂直于该坐标轴的超平面,这个超平面将当前区域划分为两个子区域(即二叉树的左右两个子节点)。

递归构造子节点

通过递归方法对两个子区域进行相同的划分,知道子区域内没有实例时终止(此时只有子节点)。

通常我们循环地选择坐标轴对空间进行划分,当选定一个维度坐标时,我们选择所有训练实例在该坐标轴上的中位数作为切分点。此时,我们构造的KDTree是平衡二叉树,但是平衡二叉树在搜索近邻时并不一定是最高效的。

 

KNN回归算法

上文所述的KNN算法主要用于分类,实际上,KNN算法也可以用于回归预测。接下来,我们讨论一下KNN算法如何用于回归。

与分类预测类似,KNN算法用于回归预测时,同样是寻找新来的预测实例的k近邻,然后对这k个样本的目标值去均值即可作为新样本的预测值:

KNN的局限性

KNN有着非常明显的优点和缺点:

优点:精度高、对异常值不敏感、无数据输入假定

缺点:计算复杂度高、空间复杂度高

适用数据范围:数值型和标称型

 

在理想化的经典场景中,KNN是非常好用的,但是在非理想化、非经典场景中,KNN这种方法就有点力不从心了。K值究竟选多少?我们需要跟哪些关键属性计算距离?如果我们需要计算的属性很多,对计算机的资源消耗也很大,非常不划算。

 


相关文章

深度学习的最新研究进展(一)

深度学习的最新研究进展(二)

深度学习的最新研究进展(三)

机器学习的“进化”

智能反欺诈算法概览

KNN(K-Nearest Neighbors)算法是一种监督学习方法,广泛应用于分类和回归任务。其核心思想在于利用数据点在特征空间中的位置关系进行预测[^2]。 ### KNN算法的基本原理 1. **无显式训练过程**:与其他机器学习算法不同,KNN不通过训练数据生成一个模型,而是直接保存所有训练样本。当需要对新数据点进行预测时,它才会根据训练集中的信息得出结果。 2. **基于邻近性决策**:在分类任务中,KNN会查找与待预测数据最接近的K个邻居,并依据这些邻居的类别标签进行投票,最终将票数最多的类别作为预测结果;而在回归任务中,则通常取这K个邻居的目标值的平均值作为预测值[^2]。 3. **距离度量**:KNN通常使用欧氏距离来衡量两个数据点之间的相似性,但也可以采用其他距离度量方式,例如曼哈顿距离或余弦相似度。 ### 工作流程 1. 选择参数K值,确定最近邻居的数量。 2. 对于新的输入数据点,计算它与训练集中每个数据点的距离。 3. 找出距离最近的K个邻居。 4. 根据这些邻居的信息进行分类回归预测。 ### 示例代码 以下是一个简单的Python实现示例,用于演示KNN算法分类任务中的应用: ```python from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 生成模拟数据 X, y = make_classification(n_features=2, n_redundant=0, n_informative=2, n_clusters_per_class=1, random_state=42) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建KNN分类器并训练 knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) # 预测与评估 y_pred = knn.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f"模型准确率: {accuracy:.2f}") ``` ### 应用场景 KNN因其简单性和有效性被广泛应用于各种领域,如推荐系统、图像识别和异常检测等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值