4.4 实例分析

本节将通过“手写体”数据集、“红酒等级”数据集和“鸢尾花”数据集,来分别介绍KNN算法的实际应用。

4.4.1 数据集介绍

本小节将以“手写体”数据集和“鸢尾花”数据集来测试KNN算法的分类效果,以“红酒等级”数据集用来测试KNN算法的回归效果。

1.“手写体”分类数据集

训练数据集大约2000个样本,每个数字大概有200个样本。测试数据大概有900个样本,由于每个样本都是一个32×32的数字,如图4-1所示。我们将其转换为1×1024的矩阵,方便应用KNN算法。

图4-1 手写字数据

2.“红酒等级”回归数据集

训练数据集有1000条红酒数据,测试数据集有599条数据。每一条数据是一个12维的向量,其中最后1维数据是待回归的属性值(红酒评分)。在图4-2的红酒等级数据中,第一行是维度名称,其余每一行为一条数据。

图4-2 红酒等级数据

3.“鸢尾花”分类数据集

鸢尾花分类数据集一共150条数据,随机选取100条作为训练数据集,其余50条作为测试数据集。每一条数据是一个5维的向量,其中最后1维是待分类的属性值(鸢尾花类别),数据如图4-3所示。

图4-3 鸢尾花数据

4.4.2 函数介绍

KNN算法将训练与预测合为一个函数,具备分类和回归两种功能,该函数的代码调用如下。

函数的输入inx为测试数据集, test_labels是测试数据标签, data为训练数据集, labels为训练数据标签, dimensions是数据维度, KK近邻的个数, di决定KNN中的距离公式, is-plot决定了是否调出可视化结果, isClassify决定了是分类还是回归。

函数的输出是测试数据的标签(分类问题)或者属性值(回归问题),在两个测试案例中,我们选取K都为15。

4.4.3 结果分析

本节给出了手写字识别的KNN分类结果和红酒等级数据KNN回归拟合的结果。虽然都是KNN算法,但回归问题和分类问题有所区别,其评价标准和输出结果形式也有所区别。

1.手写体数字识别结果

结果显示,K=15时手写数字测试的识别准确率达到97.36%,不同的K值所取得的识别准确率有所不同。图4-4给出了所有0~9的数字文件预测正确和预测错误的手写字的K近邻中的标签分布。

图4-4 KNN预测手写字的正确与错误标签的频数

2.红酒等级回归结果

K=15时,测试数据的红酒等级回归结果与实际等级对比,如图4-5所示。

图4-5 KNN对红酒等级回归预测的结果分析

3.鸢尾花分类结果

K=15时,图4-6给出了3类鸢尾花的预测正确和预测错误的测试数据的K近邻中的标签分布。

图4-6 KNN预测鸢尾花的正确与错误标签的频数