KNN 的简单应用

本文通过实验分析了KNN算法在UCI的iris数据集上的应用,探讨了k值、欧拉距离的使用以及数据归一化对分类错误率的影响。实验表明,在iris数据集上,不使用欧拉距离且k值取sqrt(m)时,错误率最低。此外,未归一化的数据在本数据集上表现出更好的分类效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 概述

    本报告在单一数据集上测试了 KNN 的 k 值,欧拉距离的使用与否,归一化数据与否对 KNN 算法结果的影响,测试数据来源于 UCI 机器学习数据集的 iris 数据集,由于数据量较少,采用交叉验证的方式(10-fold-cross validation),实验结果表明,在本数据集上使用欧拉距离,不进行特征归一化,在 k = sqrt(m)(m 为数据测试量)能取得最小的错误率,并对不同变量影响下的结果进行了分析。

二、 数据集分析

iris 数据集的中文名是安德森鸢尾花卉数据集,英文全称是 Anderson’s Iris dataset。iris 包含 150 个样本,对应数据集的每行数据。每行数据包含每个样本的四个特征和样本的类别信息,一共分为三类:


虽然是四维数据,但其属性主要分为两类:sepal 的长宽, petal 的长宽,首先分别根据其绘制散点图进行分析:



图中可以看出红色点代表的 Setosa 类与其他两类区分交大,而蓝绿点在 sepal属性上有所混叠,可以尝试使用 KNN 算法。

三、 测试准备

由于数据量较小采用 10-fold-crossvalidation 的方法进行测试分析,误差测度采用分类错误率。

机器学习实战的代码中并没有用欧拉距离赋权,对其 classify0 代码稍作修改,

添加 ifuseED 0-1 变量控制赋权与否。

改变部分如下:



封装了 cross_validation 函数用于测试改变 k, fold 值(k-fold-cross validation),ifuseED,返回交叉验证的平均错误率,函数原型如下:


另外,设计的交叉验证算法每次根据顺序采样数据与测试集,为了增加实验结果的普遍性,每次单一测试前对数据集顺序进行打乱:


四、 实验结果与分析

首先,测试采用欧拉矩阵赋权与否根据 k 值对结果的影响,绘制结果图如下:


测试前查阅相关文献发现,一般 K 值的选取根据经验主义(empirically)可以选用数据量的开方,本数据采用 10-fold crossvalidation,总数据量 150,所以训练数据是 135,sqrt(135)=11.62,可以看出与实验结果较为符合,并且在本数据集上,不使用欧拉距离赋权在 26 之前错误率甚至优于使用欧拉赋权但随 k 值增大,错误率波动增大,而使用欧拉距离赋权的错误率随 k 增长趋于稳定。

同时测试了在本数据集上实现归一化数据与否对精确度的影响,两组测试都使用欧拉距离赋权:


    在本数据集上,不归一化特征的错误率明显优于归一化后的,可能原因是几组数据处于一个量级,不会产生由于数据量级导致的偏差,并且归一化后影响了本身不同数据的权重。

五、 其他组测试图展示

为了保证实验结果的普遍性,每组测试对测试数据打乱再交叉验证,其他组的测试结果如下:





其结果与之前的实验分析较为一致

### KNN算法简易实例 KNN(k-最近邻)是一种基于实例的学习方法,在分类和回归预测方面都有应用。对于给定的数据点,通过计算该点与训练集中各点的距离来找到距离最小的k个邻居,并依据这些邻居的信息来进行决策[^1]。 下面是一个简单的Python实现案例,用于展示如何利用scikit-learn库中的`KNeighborsClassifier`类完成KNN分类器构建: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 加载鸢尾花数据集作为样本数据 data = load_iris() X, y = data.data, data.target # 将数据分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 数据标准化处理 scaler = StandardScaler().fit(X_train) X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) # 创建并训练模型 clf = KNeighborsClassifier(n_neighbors=3) # 设置近邻数量为3 clf.fit(X_train_scaled, y_train) # 使用模型进行预测 y_pred = clf.predict(X_test_scaled) # 输出准确率 print(f'Accuracy: {accuracy_score(y_test, y_pred):.2f}') ``` 此段代码展示了完整的流程:从加载数据到预处理、建立模型直至评估性能。这里选择了经典的Iris数据集作为例子,它包含了三种不同类型的鸢尾花卉测量值;同时采用了标准缩放变换以确保特征尺度一致性和更好的收敛效果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值