基于KNN算法的少量数据分类实验
一、实验目的
利用knn分类算法来对汽车碰撞声以及汽车鸣笛声进行识别,本次实验使用的声学特征是37维mfcc特征,其中包括前12维倒谱系数、12维一阶差分系数、12维二阶差分系数以及1维短时信号能量谱系数。
二、实验内容
1、实验步骤
1.1实验步骤流程图
2、knn分类算法简述
2.1算法概述
KNN(k-Nearest Nerghbor)是一种有监督分类算法,是最简单的机器学习算法之一,顾名思义,其算法主体思想就是根据距离相近的邻居类别,来判定自己的所属类别。算法的前提是需要有一个已被标记类别的训练数据集,具体的计算步骤分为以下三步:
(1)、计算测试对象与训练集中所有对象的距离,可以是欧式距离、余弦距离等,比较常用的是较为简单的欧式距离;
(2)、找出上步计算的距离中最近的K个对象,作为测试对象的邻居;
(3)、找出K个对象中出现频率最高的对象,其所属的类别就是该测试对象所属的类别。
2.2算法优缺点
(1)、优点
思想简单,易于理解,易于实现,无需估计参数,无需训练;
适合对稀有事物进行分类;
特别适合于多分类问题。
(2)、缺点
懒惰算法,进行分类时计算量大,要扫描全部训练样本计算距离,内存开销大,评分慢;
当样本不平衡时,如其中一个类别的样本较大,可能会导致对新样本计算近邻时,大容量样本占大多数,影响分类效果;
可解释性较差,无法给出决策树那样的规则。
3、算法参数选择
本次实验使用汽车碰撞声和汽车鸣笛声各10条数据作为训练数据集,临近K值选取9。
三、实验结果
1、分类结果
使用50条声音片段来测试分类器,并将分类结果结果保存到表格中,如下表列出的16条分类结果数据。
抽取的文件名 | 抽取的帧数 | knn算法是否正确识别 | 标签及其出现的次数 |
crash1 | 44-53 | 是 | {0: 8, 1: 1} |
crash2 | 278-287 | 是 | {0: 6, 1: 3} |
crash3 | 118-127 | 是 | {1: 2, 0: 7} |
crash4 | 6-15 | 是 | {0: 5, 1: 4} |
crash5 | 22-31 | 是 | {0: 6, 1: 3} |
crash6 | 10-19 | 否 | {1: 5, 0: 4} |
crash7 | 44-53 | 否 | {0: 3, 1: 6} |
crash8 | 88-97 | 是 | {1: 3, 0: 6} |
crash9 | 125-134 | 是 | {0: 5, 1: 4} |
crash10 | 5-14 | 是 | {1: 4, 0: 5} |
crash11 | 6-15 | 否 | {1: 5, 0: 4} |
crash12 | 3-12 | 否 | {0: 4, 1: 5} |
crash13 | 11-20 | 否 | {1: 6, 0: 3} |
crash14 | 27-36 | 否 | {1: 6, 0: 3} |
horn1 | 8-17 | 是 | {1: 5, 0: 4} |
horn3 | 3-12 | 是 | {1: 7, 0: 2} |
表1 分类结果表格
2、分类结果分析
50个样本数据中,分类器正确识别31个样本数据,整体准确率仅仅达到62%,在其中34条碰撞声数据中,分类器正确识别到17条数据,识别准确率仅仅达到50%。在其中16条鸣笛声中数据中,分类器正确识别到14条数据,准确率能达到87.5%。
四、实验总结
从本次实验结果来看,knn+mfcc组合的声音识别算法对汽车碰撞声的识别准确率仅仅达到50%,其分类效果并不好,但是对汽车鸣笛声的识别率能达到87.5%,在可以接受的范围内。
本次实验有多处不足之处,
(1) 实验中对每一段声音信号仅仅随机选取了十帧的特征来做为训练和识别的特征集有待商榷,不能保证十帧的特征数据能够表征声音信号的完整特征。
(2) 实验中knn算法训练集数据集过少,每个标签仅仅选取十个样本数据。训练样本数据集过少会降低knn算法的识别准确率。
(3) 实验数据仅仅选取两种声音信号,不足以说明分类器适用性。