2013年认证杯SPSSPRO杯数学建模
B题 流行音乐发展简史
原题再现:
随着互联网的发展,流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好,自动推荐并播放其它音乐。由于每个人喜好的音乐可能横跨若干种风格,区别甚大,需要分别对待。这就需要探讨如何区分音乐风格的问题。
在流行音乐中,传统的风格概念包括 Pop(流行)、Country(乡村)、Jazz(爵士)、Rock(摇滚)、R&B(节奏布鲁斯)、New Age(新世纪)等若干大类,它们分别可以细分成许多小类,有些小类甚至可以做更进一步的细分。而每首歌曲只能靠人工赋予风格标签。这样的做法有许多不足:有的类别之间关系不清楚,造成混乱;有的类别过度粗略或精细;有的类别标签没有得到公认;有的音乐归属则存在争议或者难以划归。请你建立合理的数学模型,对流行音乐的风格给出一个自然、合理的分类方法,以便给网络电台的推荐功能和其它可能的用途1提供支持。
整体求解过程概述(摘要)
由于社会文化的发展,流行音乐的风格日趋多元化,风格之间相互融合发展,造成类别混乱,难以划分,存在分类不当等诸多不足。本文采用循序渐进的方法对流行音乐的风格给出多模型优势互补的分类方法。
模型一是基于标签的流行音乐风格分类模型。随着 Web日益健全完善,标签数据日益丰富且趋于稳定,标签所表达的语义信息要比描述文档中的关键词更接近被描述事物的特性,标签资源在音乐风格分类领域有着广阔的应用。模型通过 LDA 分析器对抽取的标签资源进行语料库建模,达到音乐风格分类的目的。
模型二是基于语义的流行音乐风格分类模型。互联网上拥有海量的文本资源,当我们在网络上抓取数据的时候,如果一段流行音乐总与某个特定的流行音乐风格出现在一起,那么我们就认为此流行音乐与这个风格有着非常紧密的联系,从而我们就可以推断其风格,同时也能弥补某些类别标签不够准确、没有得到公认的缺点。
模型三是基于 LDA 和多类 SVM的流行音乐风格分类模型。模型一和模型二都是在音乐文件具有大量相关数据的前提下具有较高分类准确率的,对于没有标签,数据较少的原创歌曲,体现了其局限性,此时需要提取底层的声学特征进行分类。这也是当前使用广泛且成熟的音频分类方法,本文通过对主流的特征提取及分类的算法进行改进,不但能取得最佳的分类精确率,而且也能实现最好的时间复杂度。
模型四是基于分形维数的流行音乐风格分类模型。传统的基于声学特征的分类方法算法复杂,数据庞大,开销高,不具有深度推广的潜质,如何在准确率和开销之间做出权衡十分必要。基于分形维数的优势在于只用一维特征就能区分音乐的不同类型即分形刻画了音乐的内在特征——部分与整体的相似性。该方法具有应用简单,分类准确度较高,速度快等优点。
没有一种模型能应对所有情况,只有扩大其优点,针对性解决,优势互补才能达到理想的分类效果,本文在模型的优化中将多种模型综合,提出了多模态音乐风格分类方法,使分类更加自然、合理、准确。
问题分析:
伴随着数字技术的飞速发展,越来越多的音乐被上传到互联网上,正是这种海量的且不断增长的音乐资源使得用来处理音乐数据库的音乐信息检索(MIR)系统受到了越来越多的关注。网络用户更希望可以利用和音乐内容有关的信息来检索音乐。音乐的风格,例如蓝调(Blues)、摇滚(Rock)等就是经常被用户使用的检索词。目前,很多音乐网站例如 Last.fm,mp3.com 等都相继推出了基于风格的音乐检索系统。因此,音乐风格的准确分类对于现代音乐信息检索系统来说是至关重要的。
音乐风格分类历经了人工化和自动化两个阶段。早期,绝大多数的音乐网站都是对音乐的风格进行人工标注,其中最著名的就是潘多拉网站(pandora.com)聘请音乐专家所进行的“音乐染色体工程(music genome project)”。虽然人工地对音乐进行风格标注取得了一定的成功,但是这样做消耗了大量的人力成本、时间成本和资金成本;而更为严重的问题是,人工标注的速度显然已经不能满足网络中音乐资源飞速增长的需求。
基于标签数据的分类方法
Web 时代的到来恰恰提供了这样的一个机遇。Web 技术允许网络用户使用标签对其感兴趣的资源进行个性化标注,这其中自然也包括音乐资源,文献通过实验证明了互联网中的标签数据的分布服从无标度网络的特征,在若干时间间隔后标签会趋于稳定,而且标签所表达的语义信息要比描述文档中的关键词更接近被描述事物的特性;文献通过大量的实验数据验证了用户对歌曲进行标注时使用的标签与音乐专家对音乐的评价具有高度的一致性。因此,标签资源在音乐风格的自动分类领域同样有着广阔的应用前景。在此提出了基于标签的音乐风格分类方法,使用 LDA 方法对由音乐标签组成的语料库进行建模。
基于语义的分类方法
模型一中存在标签信息的不明确,有的标签没有得到公认等问题,使其不具有普遍适用性。在此提出了基于语义音乐风格分类模型,使用音乐名称和艺术家姓名这些与音乐有关的语义信息,通过搜索网络资源,计算音乐与不同音乐风格之间的联系紧密度并以此为依据进行音乐的风格分类。
基于声学特征的分类方法
模型一和模型二都是在音乐文件具有大量相关数据的前提下具有较高分类准确率的,当音乐文件最初发布时,其相关数据相对而言较少,基于标签和语义的方法不再适用。此时需要提取音乐自身的声学特征,然后根据这些特征对音乐进行风格分类。在此提出了基于线性判别分析和支持向量机的音乐分类模型。
基于分形的分类方法
目前绝大多数音频分类算法集中在两方面——音频的特征提取以及根据音频特征进行分类。现有的音频特征算法有:短时过零率、时域的短时能量、谱质心分析、频域带宽等,还有基于听觉感受的 MFCC(Mel-frequency cepstral coefficients)梅尔倒频谱系数等。另一方面,分类算法可利用模式识别和模式分类中已知算法,如CMM(Gaussian mixture model) 高斯混合模型、NN(Neural Network) 神经网络、HMM(Hidden Markov Model) 隐马尔可夫模型等。这些方法都存在着算法复杂,数据庞大,高精度带来的高开销等问题。在此提出了基于分形维数的音乐分类模型,通过对不同风格音乐的分形维数的计算与比较,确定音乐分类的范围指标,然后利用此指标作为依据对音乐进行自动分类。由于维数为 1,所以此方法使用简单,速度较快,同时也具有较高的分类精度。
模型假设:
当代流行音乐进入了高度细分化的时代,同时尚在继续细分更微观的类型。流行音乐电台细分市场的类型化方向正是来自流行音乐的细分化。对于流行音乐的分类目前尚无统一标准,我们使用目前认同度较高的分类标准,对流行音乐类型进行筛选合并后将流行音乐分为如下类型。
1. Pop 流行(Dream-Pop, Classical Pop, Britpop, Synth Pop)
2. R&B 节奏布鲁斯(Soul)
3. Hip-Hop 饶舌(Trip-Hop, Brit-Hop)
4. Rap 说唱(Gangsta Rap)
5. Jazz 爵士(Bossa Nova)
6. Rock 摇滚(Reggae,Punk)
7. Electro 电子(Techno,House,Disco,Chill Out)
8. Country 乡村
9. Blue 蓝调
10. Newage 新世纪
论文缩略图:
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
部分程序代码:(代码和文档not free)
%%Feature_Extract.m
function [FileName,mean_value,variance]=Feature_Extract(FileName)
% [mean_value,variance]=Feature_Extract(FileName)
% FileName是需要分析的波形文件的路径
% mean_value是计算得出的特征值的平均值
% variance是计算得出的特征值的方差
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[F,Fs,NBITS] = wavread(FileName,20*44100); % 读入波形数据
time = 20; % 采样时间60秒
T = 1:time*Fs; % 采样时间轴
Wave = F(T); % 采样段数据
Wave = Wave/max(abs(Wave)); % 数据归一化处理
WLen = length(T); % 统计采样数据点的数量
winlen = 2^nextpow2(Fs*20/1000); % 窗长为10ms~30ms,这里取20ms
dupwin = 2^nextpow2(Fs*5/1000); % 为保持连续性,窗口有重叠,重叠5ms
stepwin = winlen-dupwin; % 窗每次移动stepwin个采样点
E = zeros(WLen-stepwin,1); %` 初始化能量矩阵
for i = 1:stepwin:WLen-stepwin % 计算帧能量FE
xm = Wave(i:i+stepwin);
E(i) = sum(xm.*xm);
end
E0 = [E zeros(length(E),1)]; % 为记录帧的位置准备,E0第一维是E,
% 第二维是相应的位置
E0 = setxor(E0(:,1),0); % 删除末尾零记录
j=1;
for i = 1:length(E) % 记录帧的位置
if E(i)>0
E0(j,1)=E(i);
E0(j,2)=i;
j = j+1;
end
end
Emin = min(E0(:,1)); % 计算帧能量的最小值
Emax = max(E0(:,1)); % 计算帧能量的最大值
Emean = mean(E0(:,1)); % 计算帧能量的平均值
lamda = 0.5; % 设定静音阈值
Ttfe = Emin + lamda * (Emean - Emin);
for i = 1:length(E0(:,1)) % 屏蔽E0中对饮帧能量小于静音阈值的值
if E0(i,1) < Ttfe
E0(i,1) = 0;
end
end
% 寻找特征片段
FER = ones(length(E0(:,1)),2); % 初始化帧能量比矩阵
for i = 1:(length(E0(:,1))-1) % 计算帧能量比
if(and(E0(i,1),E0(i+1,1))) % 若当前帧与后一帧都不为零
FERa = E0(i+1,1)/E0(i,1);
FERb = E0(i,1)/E0(i+1,1);
FER(i,1)=max(FERa,FERb);
FER(i,2)=E0(i,2);
end
end
level = mean(FER(:,1)); % 设定高潮端点阈值
result0 = zeros(length(FER(:,2)),1); % 初始化结果矩阵
j = 2;
if FER(1,1)-level >0
result(1) = FER(1,2);
end %过滤出高潮端点
for i = 2:length(FER(:,2))-1
if FER(i,2)-level >0
if FER(i-1,2)-level <0
result0(j) = FER(i,2);
j = j+1;
end
end
end
result0 = setxor(result0,0); % 删除多余的零元素
result = zeros(length(result0)-1,1);
for i = 1:length(result0)-1
result(i) = result0(i+1)-result(i);
end
charaction = zeros(size(result));
for i = 1:length(result)-1
charaction(i) = result(i+1)-result(i);
end
result = charaction;
FileName; %输出特征向量
u = mean(result);
d = var(result);
disp([FileName])
disp([ '均值:' num2str(u) '方差:' num2str(d)]);
mean_value = u; % 函数返回特征向量
variance = d;
end