音乐类型分类一直是音乐信息检索领域研究的热点问题。在本教程中,我们将尝试使用隐马尔可夫模型对音乐类型进行分类,隐马尔可夫模型非常擅长对时间序列数据进行建模。由于音乐音频文件是时间序列信号,我们希望HMM能够满足我们的需求,给我们一个准确的分类。隐马尔可夫模型是表示观察序列的概率分布的模型。我们假设输出是由隐藏状态生成的。

数据集和特征

我们将使用Marsyas提供的机器学习数据集,这是一个名为GTZAN的开源软件。它是每30秒长的1000个音轨的集合。代表10种类型,每种包含100个音轨。所有音轨都是.au格式的22050Hz单声道16位音频文件。在我们的教程中,我们将使用所有提供的类型(blues, classical, jazz, country, pop, rock, metal, disco, hip-hop, reggae)。对于音乐类型分类,我们将更容易使用WAV文件,因为它们可以通过scipy库轻松读取。因此,我们必须将AU文件转换为WAV格式。可以在此处(http://opihi.cs.uvic.ca/sound/genres.tar.gz)访问机器学习数据集。

对于音频处理,我们需要找到一种简洁地表示歌曲波形的方法。Mel频率倒谱系数(MFCC)是一种很好的方法。MFCC获取信号的功率谱(power spectrum),然后使用Filter banks和离散余弦变换的组合来提取特征。

让我们开始为我们的项目导入必要的Python库。

from python_speech_features import mfcc, logfbankfrom scipy.io import wavfileimport numpy as npimport matplotlib.pyplot as pltfrom hmmlearn import hmmfrom sklearn.metrics import confusion_matriximport itertoolsimport os

让我们从机器学习数据集中选择一首歌并提取MFCC和Filter banks 特征。

sampling_freq, audio = wavfile.read("genres/blues/blues.00000.wav")mfcc_features = mfcc(audio, sampling_freq)filterbank_features = logfbank(audio, sampling_freq)

我们来看一下提取的特征的形状。Python代码如下:

print ('MFCC:Number of windows =', mfcc_features.shape[0])print ('Length of each feature =', mfcc_features.shape[1])print ('Filter bank:Number of windows =', filterbank_features.shape[0])print ('Length of each feature =', filterbank_features.shape[1])

现在,我们来看看我们机器学习数据集的一些示例。我们遍历流派文件夹并可视化每个文件夹中第一首歌曲的MFCC特征。Python实现如下:

import globimport os.path as pathgenre_list = [“blues”,”classical”, “jazz”, “country”, “pop”, “rock”, “metal”, “disco”, “hiphop”, “reggae”]print(len(genre_list))figure = plt.figure(figsize=(20,3))for idx ,genre in enumerate(genre_list):  example_data_path = ‘genres/’ + genre file_paths = glob.glob(path.join(example_data_path, ‘*.wav’)) sampling_freq, audio = wavfile.read(file_paths[0]) mfcc_features = mfcc(audio, sampling_freq, nfft=1024) print(file_paths[0], mfcc_features.shape[0]) plt.yscale(‘linear’) plt.matshow((mfcc_features.T)[:,:300]) plt.text(150, -10, genre, horizontalalignment=’center’, fontsize=20) plt.yscale(‘linear’)plt.show()

MFCC特征为每个文件夹(流派)中的第一首歌曲

建立隐马尔可夫模型

通过包装hmmlearn库提供的模型,我们构建了一个处理HMM训练和预测的Python类。

class HMMTrainer(object): def __init__(self, model_name='GaussianHMM', n_components=4, cov_type='diag', n_iter=1000): self.model_name = model_name self.n_components = n_components self.cov_type = cov_type self.n_iter = n_iter self.models = [] if self.model_name == 'GaussianHMM': self.model = hmm.GaussianHMM(n_components=self.n_components, covariance_type=self.cov_type,n_iter=self.n_iter) else: raise TypeError('Invalid model type')  def train(self, X): np.seterr(all='ignore') self.models.append(self.model.fit(X)) # Run the model on input data def get_score(self, input_data): return self.model.score(input_data)

训练和评估隐马尔可夫模型

为了训练隐马尔可夫模型,我们遍历数据集中的子文件夹,我们迭代子文件夹中的歌曲以提取特征并将其附加到变量。

我们应该存储所有训练过的HMM模型,这样我们就能预测出看不见的歌曲类别。由于HMM是无监督机器学习的生成模型,我们不需要标签来为每个类构建HMM模型。我们明确假设将为

每个类构建单独的HMM模型。

请注意,我们使用4作为components 的数量,这正是HMM模型中隐藏状态的数量。找出最佳状态数:测试不同值,并挑选优化预测的那个值。

hmm_models = []input_folder = 'genres/'# Parse the input directoryfor dirname in os.listdir(input_folder): # Get the name of the subfolder subfolder = os.path.join(input_folder, dirname) if not os.path.isdir(subfolder): continue # Extract the label label = subfolder[subfolder.rfind('/') + 1:] # Initialize variables X = np.array([]) y_words = [] # Iterate through the audio files (leaving 1 file for testing in each class) for filename in [x for x in os.listdir(subfolder) if x.endswith('.wav')][:-1]: # Read the input file filepath = os.path.join(subfolder, filename) sampling_freq, audio = wavfile.read(filepath) # Extract MFCC features mfcc_features = mfcc(audio, sampling_freq) # Append to the variable X if len(X) == 0: X = mfcc_features else: X = np.append(X, mfcc_features, axis=0) # Append the label y_words.append(label) print('X.shape =', X.shape) # Train and save HMM model hmm_trainer = HMMTrainer(n_components=10) hmm_trainer.train(X) hmm_models.append((hmm_trainer, label)) hmm_trainer = None

现在是时候评估我们的模型了,我们迭代测试数据集子文件夹,提取特征,然后我们遍历所有

HMM模型并选择得分最高的模型。

input_folder = 'test/'real_labels = []pred_labels = []for dirname in os.listdir(input_folder): subfolder = os.path.join(input_folder, dirname) if not os.path.isdir(subfolder): continue # Extract the label label_real = subfolder[subfolder.rfind('/') + 1:] for filename in [x for x in os.listdir(subfolder) if x.endswith('.wav')][:-1]: real_labels.append(label_real) filepath = os.path.join(subfolder, filename) sampling_freq, audio = wavfile.read(filepath) mfcc_features = mfcc(audio, sampling_freq) max_score = -9999999999999999999 output_label = None for item in hmm_models: hmm_model, label = item score = hmm_model.get_score(mfcc_features) if score > max_score: max_score = score output_label = labelpred_labels.append(output_label)

到目前为止,在我们的测试数据集中,我们已经有了每首歌曲的真实标签。由于我们的问题是一个多类分类,评估模型性能的最佳方法是查看混淆矩阵。

我们使用sklearn提供的混淆矩阵,并使用matplotlib库对其进行可视化。

首先,让我们定义一个Python函数来处理绘图。此函数打印并绘制混淆矩阵。可以通过设置`normalize = True`来应用归一化。

def plot_confusion_matrix(cm, classes, normalize=False, , cmap=plt.cm.Blues): if normalize: cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] print("Normalized confusion matrix") else: print('Confusion matrix, without normalization') print(cm) plt.imshow(cm, interpolation='nearest', cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) fmt = '.2f' if normalize else 'd' thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, format(cm[i, j], fmt), horizontalalignment="center

Python Train_使用隐马尔可夫模型进行音乐流派分类的Python实现相关推荐

  1. 隐马尔科夫模型HMM之前后向算法Python代码实现,包括2个优化版本

    ☕️ 本文系列文章汇总: (1)HMM开篇:基本概念和几个要素 (2)HMM计算问题:前后向算法 (3)HMM学习问题:Baum-Welch算法 (4)  HMM预测问题:维特比算法 本篇算法原理分析 ...

  2. 隐马尔可夫模型的java实现_机器学习——python模拟隐马尔可夫模型

    <统计学习方法> 李航著 第十章 隐马尔可夫模型 我是小白一个:本文代码转载地址文末有注释:有问题请多指教 先看书,看完书,代码就看懂了.程序只是将算法翻译成机器认识的罢了 import ...

  3. 【机器学习】隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现

    [机器学习]隐马尔可夫模型及其三个基本问题(四)状态序列预测算法及python实现 一.维特比算法 二.python实现 参考资料 隐马尔可夫模型状态序列预测问题是指给定模型 λ=[A,B,∏]\la ...

  4. 一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现

    一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现 1 隐马尔科夫模型 1.1 HMM解决的问题 1.2 HMM模型的定义 1.2.1HMM的两个假设 1.2.2 HMM模型 1.3 HM ...

  5. 隐马尔科夫模型HMM(一)HMM模型

    2019独角兽企业重金招聘Python工程师标准>>> 隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理 ...

  6. 【机器学习基础】数学推导+纯Python实现机器学习算法24:HMM隐马尔可夫模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab HMM(Hidden Markov Model)也就是隐马尔可夫模型,是一种由隐藏的马尔可夫链随机 ...

  7. 隐马尔科夫模型,第三种问题解法,维比特算法(biterbi) algorithm python代码

    上篇介绍了隐马尔科夫模型 本文给出关于问题3解决方法,并给出一个例子的python代码 回顾上文,问题3是什么, 下面给出,维比特算法(biterbi) algorithm 下面通过一个具体例子,来说 ...

  8. 【机器学习】隐马尔可夫模型及其三个基本问题(三)模型参数学习算法及python实现

    [机器学习]隐马尔可夫模型及其三个基本问题(三)模型参数学习算法及python实现 一.一些概率与期望值的计算 二.非监督学习方法(Baum-Welch算法) 三.python实现 隐马尔可夫模型参数 ...

  9. 【机器学习】隐马尔可夫模型及其三个基本问题(二)观测序列概率计算算法及python实现

    [机器学习]隐马尔可夫模型及其三个基本问题(二)观测序列概率计算算法及python实现 一.前向算法 二.后向算法 三.前向-后向算法的python实现 参考资料 隐马尔可夫(HMM)模型的第一个基本 ...

最新文章

  1. 浅谈Transformer的初始化、参数化与标准化
  2. linux kernel and user space通信机制,Linux内核与用户空间通信机制研究.pdf
  3. android开发版本,Android开发之版本统一规范
  4. Java动态代理的两种实现方法
  5. echo和@echo_如何在Echo Show和Echo Spot上切换到24小时时钟
  6. python学习:re模块
  7. 数值运算python嵩天_python语法_算数运算+赋值运算符+比较运算符+逻辑运算符
  8. Python 下载文件并保存文件到本地
  9. “Talk is cheap, show me the code”你一行代码有多贵?
  10. stl 向量_C ++ STL中的向量delete()和clear()
  11. 什么是中台?这篇漫画总算讲清楚了
  12. iOS 8 Auto Layout界面自动布局系列5-自身内容尺寸约束、修改约束、布局动画
  13. 度量 数据突变_使用K-Means和PCA进行基因组序列分析 COVID-19接下来如何突变?
  14. 打造线上的大数据风控,我们发现了这三个坑
  15. 智能玩具小风扇制作教程
  16. 一键清理系统垃圾文件.BAT
  17. 【MicroPython ESP32】ssd1306 0.96“OLED+气象数据中文显示
  18. 属于计算机网络硬件系统有哪些,下列不属于计算机硬件系统的是()
  19. 不到三十行代码,免费看“美剧”
  20. js 获取ip地址进行跳转

热门文章

  1. FRM P1B4笔记:Valuation and Risk Models
  2. 程序化交易策略系统的构成
  3. 一位医疗 AI 创业者的自述:这个行业到底需要什么样的产品?
  4. 如何查看自己WiFi密码
  5. 串口数据交换,实现串口合二为一
  6. 物联网-电力监控平台(二)
  7. docker-compose部署的服务访问https报错:x509: certificate signed by unknown authority
  8. kubeadm集群化部署多master节点(生产环境适用)
  9. 这算通过审核了么?接下来还有没有什么坑,求大神指点!--酷课堂iOS交流群问答精华整理(201808期)
  10. 多张照片怎么做成动图