基于Adaboost的音乐情绪分类算法

基于Adaboost的音乐情绪分类算法-2015实习设计总结

=========================================

  • 基于Adaboost的音乐情绪分类算法-2015实习设计总结
    • 写在开头
      • 1 感谢
      • 2 参考资料
    • 音乐情绪
    • Adaboost
      • 1 关于代码
        • 11 训练样本
        • 12 训练结果
        • 13 进行分类
      • 音乐特征

1. 写在开头

此次实习设计选题是基于Adaboost的音乐情绪分类算法,由于在公司实习期间,参与的项目刚刚起步连个雏形都没有,实在不合适直接拿来。无奈只能自己拟定一个题目,因为对于Sony Walkman上的音乐分析很感兴趣,所以就决定写个音乐情绪分类的算法,看了些论文,感觉大多使用Adaboost进行完成,所以最终拟定了这个题目。老师点头过了题目,同时要求将这个算法嵌入到一个音乐播放器中。

1.1 感谢

此次实习设计,主要目的是为了学习Adaboost算法的使用流程,大部分代码都是使用现成的,自己主要是将各个部分组合在一起。能够顺利完成此次的实习设计,需要感谢各位无私的开源精神,此次设计使用到了其他人的代码,在这里特别感谢它们的作者:
https://github.com/cbefus/CAMEL-A-Framework-for-Audio-Analysis
https://github.com/yamaguchi23/adaboost
https://github.com/FreedomZZQ/IcePlayer
https://github.com/keli/netease-music
再道一声感谢!

1.2 参考资料

参考资料不多,主要是一些论文以及博客,我这里列出来
Adaboost
http://blog.csdn.net/tiandijun/article/details/48036025
http://blog.csdn.net/haidao2009/article/details/7514787
http://wenku.baidu.com/link?url=77xTzysMJt7k90q1BUBpzuYmw5RWO_uEvpP6QeU0lgCrxH-lqPReMBlMXMd9UFG-oHg3eZa3ON5fMcn9kjNX5sFMQKlkwabAaEKcI8XUuP7
http://www.open-open.com/lib/view/open1436021046513.html
相关论文
基于AdaBoost的音乐情绪分类
基于情感的音乐分类系统的研究与实现
数字音频系统下音乐情绪分类算法的研究与实现

2 音乐情绪

音乐是表达情绪的艺术,它通过某种精确的组合,来传递某种特定的情绪,这种情绪可能因人而异,但是大多感受到的情绪很相似,而且往往不是简单的情绪。
关于情绪类型,可以参看《The biopsychology of mood and arousal》,其中的Thayer模型大概是这样的:
基于Adaboost的音乐情绪分类算法_第1张图片
其中一个维度是Arousal,从Calm到Excited逐渐增加,Arousal与个体的生理活动性和音乐的能量有光。另一个维度是Valence,从Sad到Pleased逐渐增加,Valence与个体的内部心理活动有关。
为了简单起见,我们选择Thayer模型的Excited、Pleased、Calm、Sad四个情绪为分类类型。
这4个情绪中,Sad和Pleased是典型的负面情绪和正面情绪,Excited和Calm是音乐强度较高和较低的代表。

3 Adaboost

有关Adaboost的内容已经在这里给到,其中要说明的是Adaboost有很多种,在代码中可以进行选择Discrete AdaBoost、Real Adaboost、Gentle AdaBoost。虽然网上的一些关于Adaboost的资料都是Discrete Adaboost的,但是并不妨碍我们使用准确度更好的Gentle Adaboost。(๑•̀ㅂ•́)و✧

3.1 关于代码

Adaboost部分的代码使用的是https://github.com/yamaguchi23/adaboost 作者已经给出了使用的方法,简单明了。我对这个部分做一个补充的说明

3.1.1 训练样本

训练首先需要训练样本,作者提示说可以从这里获得一些训练样例。例如这个 a1a,是训练样本,a1a.t是测试样本。
样本格式符合这样的格式(libsvm格式):

<label><index1>:<value1><index2>:<value2>...

我们称这是一个”样本(sample)“
label 通常是 +1 或者 -1,代表“是”或者“不是”
index 是一个数字,代表特征的标号
value 是一个数字,代表对应特征的值
而训练样本就是由很多行样本组成的数据,大概长这样
+1 1:-0.137674 5:0.0218209 6:-0.616122 14:21387.2 16:83781.9

3.1.2 训练结果

在程序中我们选择训练次数,每次训练得到一个弱分类器,这个次数还是挺重要的,反正不要太少了。约5000个样本的训练样本,我采用的是3w次训练。
训练的结果是一组数据,这组数据就是Adaboost中的”弱分类器“了,这组数据构成了“强分类器”,大概长这样:
5
40 631.832 0.134146 -0.711574
26 34401.2 0.391827 -0.252791
26 22610.7 0.0810144 -0.382917
13 30358.9 0.910024 -0.0354104
40 448.577 0.134795 -0.133638

  • 5代表强分类器的个数,也是训练次数。
  • 第1列,强分类器的特征标号。对应训练样本中的index
  • 第2列,阈值或者说门限
  • 第3列,小于阈值时给出的”评分“
  • 第4列,大于阈值时给出的”评分“
  • 第3列和第4列,在Discrete Adaboost中数值相同,符号相反,但是在Real Adaboost和Gentle Adaboost中符号相反,但是数值并不一定相同。

3.1.3 进行分类

得到了训练结果,我们就可以说得到一个模型,我们通过这个模型来预测音乐的类型。大致流程是:先获得一个音乐特征值value,这个音乐特征的标号是index,然后再和所有特征标号等于index的强分类器进行比较,然后比较,得到”评分“,累加”评分“,最终如果”评分“大于0说明是,否则不是
用C++代码大概是这样的

    double score = 0.0;
    for (int classifierIndex = 0; classifierIndex < static_cast<int>(weakClassifiers_.size()); ++classifierIndex) {
        score += weakClassifiers_[classifierIndex].evaluate(featureVector);
    }

    return score;

在实际的使用当中,如果仅是以大于0来判定是否属于一个类型是不妥当的,因为经常出现都是小于0的情况,所以我通常都是去4个分类模型中得分最高的最为最终结果。

4 音乐特征

在Adaboost中,我们需要提前音乐的特征值来作为训练样本,同样在预测的时候我们也需要提取音乐特征作为依据。
音乐特征的提取采用的是https://github.com/cbefus/CAMEL-A-Framework-for-Audio-Analysis 代码也是简单明了的,我们需要做的就是讲提取出来的特征组合成符合libsvm格式,聪明的你们一定是没有问题的吧,这个部分可以参看我的代码SampleMaker那个类。
在使用这份代码之前,需要安装好fftw这个是做有关傅里叶变化的代码。
可以提取的特征大概有30种,其中calcWindowSpectralIrregularityK这个是有bug的(j-1这个位置)。特征越多当然效果越好,但是时间也会越慢,所以还是有选择性的挑选一些比较好。

你可能感兴趣的:(算法,c++,音乐,算法,adaboost)