最近邻居法KNN

模式识别领域中,最近邻居法KNN算法,又译K-近邻算法)是一种用于分类回归非参数统计方法。[1] 在这两种情况下,输入包含特征空间中的 k 个最接近的训练样本。

  • k-NN分类中,输出是一个分类族群。一个对象的分类是由其邻居的“多数表决”确定的,k 个最近邻居(k 为正整数,通常较小)中最常见的分类决定了赋予该对象的类别。若 k = 1,则该对象的类别直接由最近的一个节点赋予。
  • k-NN回归中,输出是该对象的属性值。该值是其 k 个最近邻居的值的平均值。

最近邻居法采用向量空间模型来分类,概念为相同类别的案例,彼此的相似度高,而可以借由计算与已知类别案例之相似度,来评估未知类别案例可能的分类。

K-NN是一种基于实例的学习,或者是局部近似和将所有计算推迟到分类之后的惰性学习。k-近邻算法是所有的机器学习算法中最简单的之一。

无论是分类还是回归,衡量邻居的权重都非常有用,使较近邻居的权重比较远邻居的权重大。例如,一种常见的加权方案是给每个邻居权重赋值为1/ d,其中d是到邻居的距离。[2]

邻居都取自一组已经正确分类(在回归的情况下,指属性值正确)的对象。虽然没要求明确的训练步骤,但这也可以当作是此算法的一个训练样本集。

步骤[编辑]

如下图
我们考虑样本为二维的情况下,利用knn方法进行二分类的问题。图中三角形和方形是已知类别的样本点,这里我们假设三角形为正类,方形为负类。图中圆形点是未知类别的数据,我们要利用这些已知类别的样本对它进行分类。

  • k近邻算法例子示意图

分类过程如下:
1 首先我们事先定下k值(就是指k近邻方法的k的大小,代表对于一个待分类的数据点,我们要寻找几个它的邻居)。这边为了说明问题,我们取两个k值,分别为3和5;
2 根据事先确定的距离度量公式(如:欧氏距离),得出待分类数据点和所有已知类别的样本点中,距离最近的k个样本。
3 统计这k个样本点中,各个类别的数量。如上图,如果我们选定k值为3,则正类样本(三角形)有2个,负类样本(方形)有1个,那么我们就把这个圆形数据点定为正类;而如果我们选择k值为5,则正类样本(三角形)有2个,负类样本(方形)有3个,那么我们这个数据点定为负类。即,根据k个样本中,数量最多的样本是什么类别,我们就把这个数据点定为什么类别。

训练样本是多维特征空间向量,其中每个训练样本带有一个类别标签。算法的训练阶段只包含存储的特征向量和训练样本的标签。 在分类阶段,k是一个用户定义的常数。一个没有类别标签的向量 (查询或测试点)将被归类为最接近该点的K个样本点中最频繁使用的一类。 一般情况下,将欧氏距离作为距离度量,但是这是只适用于连续变量。在文本分类这种非连续变量情况下,另一个度量——重叠度量(或海明距离)可以用来作为度量。通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。

“多数表决”分类的一个缺点是出现频率较多的样本将会主导测试点的预测结果,那是因为他们比较大可能出现在测试点的K邻域而测试点的属性又是通过K领域内的样本计算出来的[3]。解决这个缺点的方法之一是在进行分类时将样本到测试点的距离考虑进去。

### KNN算法中交叉验证的应用与实现 #### 背景介绍 K最近邻(K-Nearest Neighbors, KNN)是一种基于实例的学习方,其核心思想是通过计算样本间的距离来进行分类或回归预测。然而,在实际应用中,选择合适的 \( k \) 值是一个重要的问题,因为不同的 \( k \) 值会对模型性能产生显著影响[^1]。 为了找到最佳的 \( k \) 值,可以利用交叉验证技术评估不同参数下的模型表现。这种方不仅能够有效减少过拟合的风险,还能帮助我们更科学地选取超参数。 --- #### 什么是交叉验证? 交叉验证是一种用于评估统计分析结果稳定性和泛化能力的技术。其中最常用的是 **K折交叉验证**(\( K \)-fold Cross Validation)。该方将数据集划分为 \( K \) 个子集(称为“折叠”,folds),每次训练时使用 \( K-1 \) 折作为训练集,剩下的那一折作为测试集。重复此过程 \( K \) 次后,最终取平均误差作为模型的整体评价指标[^2]。 --- #### 如何在KNN中应用交叉验证? 以下是具体的操作流程: 1. **准备数据**: 将原始数据随机打乱并分割成若干部分。 2. **定义候选 \( k \) 值范围**: 设定一系列可能的 \( k \) 值供后续比较,例如 \( k=[1, 3, 5, ..., 21] \)。 3. **执行K折划分**: 对于每种 \( k \),分别按照上述方式完成多次训练和测试。 4. **记录错误率/准确性得分**: 记录每一次实验的结果,并汇总得到每个 \( k \) 下的表现均值。 5. **选择最优 \( k \)**: 找到使目标函数最小化的那个 \( k \) 值。 下面给出一段Python代码示例展示这一过程的具体实施步骤: ```python from sklearn.model_selection import cross_val_score from sklearn.neighbors import KNeighborsClassifier import numpy as np # 初始化变量 X_train = ... # 特征矩阵 y_train = ... # 标签向量 k_values = range(1, 22, 2) best_k = None best_accuracy = 0 for k in k_values: knn_model = KNeighborsClassifier(n_neighbors=k) scores = cross_val_score(knn_model, X_train, y_train, cv=5, scoring='accuracy') mean_accuracy = np.mean(scores) if mean_accuracy > best_accuracy: best_accuracy = mean_accuracy best_k = k print(f"The optimal value of k is {best_k} with accuracy {best_accuracy:.4f}") ``` 以上脚本实现了自动寻找最佳邻居数的功能,同时借助`cross_val_score()`简化了手动拆分数据的工作负担。 --- #### 结果解释 当运行完毕后,程序会打印出最适合当前数据分布情况的那个整数值以及对应的精确度水平。这一步骤极大地提高了调参效率,减少了人为干预带来的偏差风险。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值