The Study Note of K-NN Algorithm
数据标准化
Background
K-NN 等机器学习模型的工作内容依赖于初始数据集中数据分布的特点。为了使算法能够正确对新数据进行预测、分类等操作,我们需要对原始数据集进行预处理,减少噪声、离群点等异常数据对模型质量的影响,提高模型预测精度。
数据标准化是预处理过程的一个特定子集,具体而言属于预处理中的数据变化步骤。其主要行为是对原始数据进行线性变换,使得数据符合特定的数值范围或分布特征。数据标准化通常包括两种常见方法:归一化和标准化。
归一化(Normalization)通常将数据缩放到一个固定的区间,例如 [0, 1] 或 [-1, 1]。这种方法适用于数据分布范围已知,且对极值敏感的场景。例如,在图像处理中,像素值常被归一化到 0 到 1 之间,以加快模型训练速度并提高收敛稳定性。
标准化(Standardization)则通过调整数据的均值和标准差,使其符合标准正态分布(均值为 0,标准差为 1)。这种方法适用于数据分布未知或存在明显偏差的情况,能够有效减少不同特征之间的量纲差异对模型的影响。
数据归一化
常见的数据归一化方式有以下几种:
-
MinMax算法
-
Log归一化
-
Mean归一化
-
分数倍归一化
MinMax算法
公式:
目的:将数据线性映射至 \([0,1]\) 区间内
优点:保障了数据分布的特征和规律
缺点:如果数据中存在极端的离群值则会将数据压扁,让正常数据处于中间区间
Log归一化
公式:
目的:通过取对的方式压缩数据的范围
特点:处理数值跨度巨大的数据,将指数级增长的数据拉回到线性尺度,使模型更容易捕捉小数值区域的变化。
Mean归一化
公式:
特点:和MinMax相似,但将数据中心(数据的几何中心)移至0
分数倍归一化
公式:
特点:计算简单
Summary
无论哪种归一化公式,其目的都是通过数值变换将原本分布广泛的区域映射到范围更小的区域,削减数值较大的离群点对模型更新中的主导作用
K值选取方法
Background
K-NN是机器学习中最基础的算法之一,其核心思想是“近朱者赤,近墨者黑”。该算法通过计算待分类点周围最近K个数据中不同类别的分布概率,选取概率最大的类别作为新数据的分类结果。算法的关键在于K值的选取:K值较小,则数据探测范围较小,模型更容易捕捉精细边界,但也容易陷入过拟合;K值较大,则数据探测范围较大,模型抗噪声能力更强,但也容易陷入欠拟合。因此,K值的选取是决定K-NN算法泛化能力的关键一步。
K 值的选取主要依赖于 交叉验证法,其中,根据样本集的不同,可以选用经验公式与先验评估、肘部法则以及逻辑约束等方法辅助选取 K 值。
经验公式与先验评估
根据 K 值在 K-NN 算法中的作用我们可以知道,K 值不能过大同样也不能过小。人们在多次去值后发现, \(K \approx \sqrt{N}\) (N为样本数量)。通过经验公式,我们可以确定最佳 K 值搜索的起点,缩小搜索空间。
肘部法则
在 K 值的选取中,K 越小,模型越容易过拟合;K 值越大,模型越容易欠拟合。肘部法则主要作为交叉验证结果的定性解释与决策辅助工具。通过绘制候选 K 值与其对应的交叉验证误差率曲线,我们可以直观地观察到模型泛化性能随局部邻域扩大的演变趋势,并根据趋势选择最优的权衡点(肘部)
交叉验证法
Background
该方法采用了类似数学中“穷举”的思想,通过将数据集分为训练集和验证集,尝试一系列 K 值,分别计算模型在验证集上的错误率,选取错误率最小且曲线区域平缓的 K 值。交叉验证中的“交叉”在该方法中具体体现在划分出的每个数据子集都参与了验证集和训练集的扮演,提高了评估的准确性
交叉验证法最常见的形式是 \(K - Fold\) 验证法(为了和 K 进行区分,下面 K-Fold 中的 K 用 F 替代),具体步骤如下:
-
数据切分:将原始训练数据集随机打乱,并平均分成 F 个不相交的子集(称为“Flod”)。
-
循环迭代:选取一个想要进行测试的 K 值进行 F 轮训练和验证。在第 i 轮中:
-
将第 i 个子集固定为验证集(Validation Set)。
-
将其余 F-1 个子集整合为训练集(Training Set)。
-
在训练集上训练模型,在验证集上计算评价指标(如准确率或 MSE)。
-
-
指标聚合:计算这 F 轮评价指标的平均值,作为该 K 值下模型的性能评估。
-
K值选取:挑选出平均准确率最高(或平均误差最小)的 K 值,作为最终选取的参数
具体流程图如下
伪代码
Algorithm: Select Best K for KNN using F-Fold Cross Validation
Input:
Dataset (Features and Labels)
Candidate_K_List (e.g., [1, 3, 5, 7, 9, 11])
F (Number of folds, e.g., 5)
Output:
Best_K (The optimal number of neighbors)
Procedure:
1. Randomly shuffle the Dataset.
2. Split the Dataset evenly into F independent folds: Fold_1, Fold_2, ..., Fold_F.
3. Initialize an empty dictionary Average_Scores to store the final score of each K.
4. For each current_k in Candidate_K_List:
a. Initialize an empty list Current_K_Scores.
b. For i from 1 to F:
i. Validation_Set = Fold_i
ii. Training_Set = All folds combined EXCEPT Fold_i
iii. Train a KNN model using Training_Set with K = current_k
iv. Test the trained model on Validation_Set to get an Accuracy_Score
v. Append Accuracy_Score to Current_K_Scores
c. Calculate the Mean_Accuracy of Current_K_Scores.
d. Store Mean_Accuracy in Average_Scores under the key current_k.
5. Best_K = The key in Average_Scores corresponding to the highest Mean_Accuracy.
6. Return Best_K
误差率的计算
交叉验证法的误差率计算本质上就是对经验误差求解数学期望的过程,具体而言:
假设我们将整个数据集均匀划分为 F 个互不相交的子集。在第 i 轮迭代中,第 i 个子集被指定为验证集,其余 F-1 个子集共同构成训练集。
对于验证集中的每一个输入样本,算法会基于当前设定的 \(K\) 值以及距离度量规则来预测其类别。单次 Fold 误差率 \(E_i\) 的数学本质是误分类样本在当前验证集总样本中所占的比例
其中,\(m_i\) 代表第 \(i\) 个验证集所包含的样本总数,\(y_j\) 是该样本客观真实的类别标签,而 \(\hat{y}_j\) 则是 KNN 模型输出的预测类别。指示函数 \(I(y_j \neq \hat{y}_j)\) 的判定逻辑是:当预测类别与真实类别不一致时,函数值为 1;若一致,则为 0。将其在验证集上累加并求平均,即可得到当前这一 Fold 的错误率。
当完整的 \(F\) 轮交替验证迭代执行完毕后,系统会收集到一个包含 \(F\) 个独立单 Fold 误差率的集合。为了彻底消除由于单一数据切分方式所引入的偶然性与随机偏差,算法会对这组离散的误差率求算术平均值。最终该候选 \(K\) 值的全局交叉验证误差率 \(E_{CV}(K)\) 为:

浙公网安备 33010602011771号