当前位置: 首页 > news >正文

2013年认证杯SPSSPRO杯数学建模B题(第一阶段)流行音乐发展简史全过程文档及程序

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 % 计算帧能量FExm = 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)>0E0(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 >0result(1) = FER(1,2);
end              %过滤出高潮端点
for i = 2:length(FER(:,2))-1if FER(i,2)-level >0if FER(i-1,2)-level <0result0(j) = FER(i,2);j = j+1;endend
end
result0 = setxor(result0,0); % 删除多余的零元素
result = zeros(length(result0)-1,1);
for i = 1:length(result0)-1result(i) = result0(i+1)-result(i);
end
charaction = zeros(size(result));
for i = 1:length(result)-1charaction(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
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

相关文章:

2013年认证杯SPSSPRO杯数学建模B题(第一阶段)流行音乐发展简史全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 B题 流行音乐发展简史 原题再现&#xff1a; 随着互联网的发展&#xff0c;流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好&#xff0c;自动推荐并播放其它音乐。由于每个人喜好…...

代码随想录算法训练营第39天 | 62.不同路径, 63不同路径II

Leetcode - 62&#xff1a;不同路径 题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#…...

Redis 的慢日志

Redis 的慢日志 Redis 的慢日志&#xff08;Slow Log&#xff09;是用于记录执行时间超过预设阈值的命令请求的系统。慢日志可以帮助运维人员和开发人员识别潜在的性能瓶颈&#xff0c;定位那些可能导致 Redis 性能下降或响应延迟的慢查询。以下是 Redis 慢日志的相关细节&…...

第十四届蓝桥杯第十题:蜗牛分享

问题描述 输入格式 输出格式 输出共一行&#xff0c;一个浮点数表示答案&#xff08;四舍五入保留两位小数&#xff09;。 样例输入 3 1 10 11 1 1 2 1样例输出 4.20样例说明 蜗牛路线&#xff1a;(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0)(0,0)→(1,0)→(1,1)→(10,1…...

不懂技术的老板,如何避免过度依赖核心技术人员

在这个日新月异、技术驱动的时代&#xff0c;即使作为非技术背景的老板&#xff0c;也深知核心技术人员的价值。然而&#xff0c;过度依赖某几位核心技术人员&#xff0c;不仅可能带来经营风险&#xff0c;还可能限制企业的创新与发展。那么&#xff0c;不懂技术的老板&#xf…...

Vue系列-el挂载

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>el:挂载点</title> </head> <body&g…...

python--os和os.path模块

>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…...

前端通用命名规范和Vue项目命名规范

​​​​​​通用命名规范 变量和常量命名&#xff1a;变量和常量的命名应具有描述性&#xff0c;清晰明了&#xff0c;使用驼峰命名法或下划线命名法&#xff0c;例如&#xff1a;firstName、MAX_VALUE。 函数和方法命名&#xff1a;函数和方法的命名应该能够准确描述其功能&…...

NTP服务搭建

一、ntpd和ntpdate区别 1.ntpd是自动执行的远程更新本地系统时钟的服务&#xff0c;是平滑同步&#xff1b; 2.ntpdate是手工执行的服务&#xff0c;也就是一般用它执行一次本地时间更新&#xff0c;如果做成半自动&#xff0c;可以写入到crontab自动任务&#xff0c;从而变成…...

Linux离线安装mysql,node,forever

PS:本文是基于centos7实现的,要求系统能够查看ifconfig和unzip解压命令, 实现无网络可安装运行 首先现在百度网盘的离线文件包****安装Xftp 和 Xshell 把机房压缩包传到 home目录下****解压unzip 包名.zip 获取IP先获取到 linux 主机的ip ifconfig Xftp 连接输入IP,然后按照…...

WPF中获取TreeView以及ListView获取其本身滚动条进行滚动

实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) TreeView:TreeViewAutomationPeer lvap new TreeViewAutomationPeer(treeView); var svap lvap.GetPattern(PatternInterface.Scroll) as ScrollViewerAutomationPeer; var scroll svap.Owner as ScrollVie…...

C语言: 指针讲解

为什么需要指针? &#xff08;1&#xff09;指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果&#xff0c;但是这样往往效率不太好&#xff0c;因为诸如结构体等大型数据&#xff0c;占用的字节数多&#xff0c;复制很消耗性能…...

C#使用Stopwatch类来实现计时功能

前言 在 C# 中&#xff0c;Stopwatch 类是用于测量经过的时间的工具类&#xff0c;提供了高精度的计时功能。Stopwatch 类位于 System.Diagnostics 命名空间中。通常情况下&#xff0c;使用 Stopwatch 的流程是创建一个 Stopwatch 对象&#xff0c;然后调用 Start 方法开始计时…...

ubuntu18.04安装qt

ubuntu18.04安装qt 1、下载文件 比如我下载的是5.13.0版本 下载链接 2、安装 wget https://download.qt.io/archive/qt/5.13/5.13.0/qt-opensource-linux-x64-5.13.0.runsudo chmod x qt-opensource-linux-x64-5.13.0.runsudo ./qt-opensource-linux-x64-5.13.0.run参考文…...

ElasticSearch、java的四大内置函数式接口、Stream流、parallelStream背后的技术、Optional类

第四周笔记 一、ElasticSearch 1.安装 apt-get install lrzsz adduser -m es 创建用户组&#xff1a; useradd *-m* xiaoming(用户名) *PS&#xff1a;追加参数-m* passwd xiaoming(用户名) passwd xiaoming 输入新的 UNIX 密码&#xff1a; 重新输入新的 UNIX 密码&…...

深入MNN:开源深度学习框架的介绍、安装与编译指南

引言 在人工智能的世界里&#xff0c;深度学习框架的选择对于研究和应用的进展至关重要。MNN&#xff0c;作为一个轻量级、高效率的深度学习框架&#xff0c;近年来受到了众多开发者和研究人员的青睐。它由阿里巴巴集团开源&#xff0c;专为移动端设备设计&#xff0c;支持跨平…...

[LeetCode][400]第 N 位数字

题目 400. 第 N 位数字 给你一个整数 n &#xff0c;请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;…...

clickhouse 查询group 分组最大值的一行数据。

按照 sql_finger_md5 分组取query_time_ms 最大的一行数据。 使用any函数可以去匹配到的第一行数据&#xff0c;所以可以先让数据按照query_time_ms 排序&#xff0c;然后再使用group by 和any结合取第一行数据&#xff0c;就是最大值的那一行数据。 selectany (time) as time…...

Python装饰器与生成器:从原理到实践

一、引言 Python 是一种功能强大且易于学习的编程语言&#xff0c;其丰富的特性使得开发者能够高效地完成各种任务。在 Python 中&#xff0c;装饰器和生成器是两个非常重要的概念&#xff0c;它们能够极大地增强代码的可读性和可维护性。本文将详细介绍如何学习 Python 装饰器…...

python-函数引入模块面向对象编程创建类继承

远离复读机行为 def calculate_BMI(weight,height):BMI weight / height**2if BMI < 18.5:category "偏瘦"elif BMI < 25:category "正常"elif BMI < 30:category "偏胖"else:category "肥胖"print(f"您的BMI分类…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...