本文由 伯乐在线 - ggspeed 翻译,耶鲁怕冷 校稿。未经许可,禁止转载!

英文出处:jared polivka。欢迎加入翻译组。

利用 K-means 聚类算法来聚类和可视化音调

Galvanize 数据科学课程包括了一系列在科技产业的数据科学家中流行的机器学习课题,但是学生在 Galvanize 获得的技能并不仅限于那些最流行的科技产业应用。例如,在 Galvanize 的数据科学强化课中,音频信号和音乐分析较少被讨论,却它是一个有趣的机器学习概念应用。借用 Galvanize 课程中的课题,本篇教程为大家展示了如何利用 K-means 聚类算法从录音中分类和可视化音调,该方法会用到以下几个 python 工具包: NumPy/SciPy, Scikit-learn 和 Plotly。

K-means 聚类是什么

k-means 聚类算法是基于未标识数据集将相关项聚类的常用技术。给定 K 值后,该算法会将每个数据点划分到离其最近的中心点对应的簇,从而将整个数据集分成 k 组。k-means 算法有很广泛的应用,比如识别手机发射塔的有效位置,或为制造商选择服装的型号。而本教程将会为大家展示如何应用 k-means 根据音调来给音频分类。

音调的简单入门

一个音符是一串叠加的不同频率的 Sine 型波,而识别音符的音调需要识别那些听上去最突出的 Sine 型波的频率。

最简单的音符仅包含一个 Sine 型波:

绘制的强度图谱中,每个组成要素频率的大小显示了上面波形的一个单独的频率。

主流乐器制造出来的声音是由很多 sine 型波元素构成的,所以他们比上面展示的纯 sine 型波听起来更复杂。同样的音符(E3),由吉他弹奏出来的波形听看起来如下:

它的强度图谱显示了一个更大的基础频率的集合:

k-means 可以运用样例音频片段的强度图谱来给音调片段分类。给定一个有 n 个不同频率的强度图谱集合,k-means 将会给样例图谱分类,从而使在 n 维空间中每个图谱到它们组中心的欧式距离最小。

使用Numpy/SciPy从一个录音中创建数据集

本教程将会使用一个有 3 个不同音调的录音小样,每个音调是由吉他弹奏了 2 秒。

运用 SciPy 的 wavfile 模块可以轻松将一个 .wav 文件 转化为 NumPy 数值。

Python

1

2

3

4

importscipy.io.wavfileaswav

filename='Guitar - Major Chord - E Gsharp B.wav'

# wav.read returns the sample_rate and a numpy array containing each audio sample from the .wav file

sample_rate,recording=wav.read(filename)

这段录音应该被分为多个小段,从而使每段的音调都可以被独立地分类。

Python

1

2

3

4

5

6

7

8

9

10

11

defsplit_recording(recording,segment_length,sample_rate):

segments=[]

index=0

whileindex

segment=recording[index:index+segment_lengthsample_rate]

segments.append(segment)

index+=segment_lengthsample_rate

returnsegments

segment_length=.5# length in seconds

segments=split_recording(recording,segment_length,sample_rate)

每一段的强度图谱可以通过傅里叶变换获得;傅里叶变换会将波形数据从时间域转换到频率域。以下的代码展示了如何使用 NumPy 实现傅里叶变换(Fourie transform)模块。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

defcalculate_normalized_power_spectrum(recording,sample_rate):

# np.fft.fft returns the discrete fourier transform of the recording

fft=np.fft.fft(recording)

number_of_samples=len(recording)

# sample_length is the length of each sample in seconds

sample_length=1./sample_rate

# fftfreq is a convenience function which returns the list of frequencies measured by the fft

frequencies=np.fft.fftfreq(number_of_samples,sample_length)

positive_frequency_indices=np.where(frequencies>0)

# positive frequences returned by the fft

frequencies=frequencies[positive_frequency_indices]

# magnitudes of each positive frequency in the recording

magnitudes=abs(fft[positive_frequency_indices])

# some segments are louder than others, so normalize each segment

magnitudes=magnitudes/np.linalg.norm(magnitudes)

returnfrequencies,magnitudes

一些辅助函数会创建一个空的 NumPy 数值并将我们的样例强度图谱放入其中。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

defcreate_power_spectra_array(segment_length,sample_rate):

number_of_samples_per_segment=int(segment_length*sample_rate)

time_per_sample=1./sample_rate

frequencies=np.fft.fftfreq(number_of_samples_per_segment,time_per_sample)

positive_frequencies=frequencies[frequencies>0]

power_spectra_array=np.empty((0,len(positive_frequencies)))

returnpower_spectra_array

deffill_power_spectra_array(splits,power_spectra_array,fs):

filled_array=power_spectra_array

forsegmentinsplits:

freqs,mags=calculate_normalized_power_spectrum(segment,fs)

filled_array=np.vstack((filled_array,mags))

returnfilled_array

power_spectra_array=create_power_spectra_array(segment_length,sample_rate)

power_spectra_array=fill_power_spectra_array(segments,power_spectra_array,sample_rate)

“power_spectra_array “是我们的训练数据集,它包含了一个强度图谱,在此图谱中录音按每 0.5 秒的间隔进行了分段。

利用 Scikit-learn 来执行 k-means

Scikit-learn 有一个易用的 k-means 实现。我们的音频样例包括 3 个不同的音调,所以将 k 设置为 3。

Python

1

2

3

4

fromsklearn.clusterimportKMeans

kmeans=KMeans(3,maxiter=1000,n_init=100)

kmeans.fit_transform(power_spectra_array)

predictions=kmeans.predict(power_spectra_array)

“predictions”是一个 Python 数据,它包含了 12 个音频分段的分组标签(一个任意的整数)。

Python

1

2

printpredictions

=>[222200001111]

这个数组说明了在听这段音频时连续音频分段被正确地分在了一起。

使用 Plotly 可视化结果

为了更好的理解预测结果,需要绘制每个样例的强度图谱,每个样例均用颜色来标记出其对应的 k-means 分组结果。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

# find x-values for plot (frequencies)

numberof_samples=int(segment_length*sample_rate)

sample_length=1./sample_rate

frequencies=np.fft.fftfreq(number_of_samples,sample_length)

# create plot

traces=[]

forpitch_id,colorinenumerate(['red','blue','green']):

forpower_spectruminpower_spectra_array[predictions==pitch_id]:

trace=Scatter(x=frequencies[0:500],

y=power_spectrum[0:500],

mode='lines',

showlegend=False,

line=Line(shape='linear',

color=color,

opacity=.01,

width=1))

traces.append(trace)

layout=Layout(xaxis=XAxis(title='Frequency (Hz)'),

yaxis=YAxis(title='Amplitude (normalized)'),

title='Power Spectra of Sample Audio Segments')

data_to_plot=Data(traces)

fig=Figure(data=data_to_plot,layout=layout)

# py.iplot plots inline using IPython Notebook

py.iplot(fig,filename='K-Means Classification of Power Spectrum')

下面的图中每个有色的细线代表了样例 .wav 文件中 12 个音频分段的强度图谱。不同颜色的线表示了 k-means 预测出来的分段音调。其中蓝色,绿色,红色图谱的高峰分别在 82.41 Hz (E), 103.83 Hz (G#), and 123.47 Hz (B),这些是音频小样的音符。音频小样中频率最强的是低频,所以只有由 FFT (快速傅里叶变换)测量出的最低的 500 个频率被包含进了以下图表。

绘制在 3 个采样音调中共有的 2 个最强泛音的振幅,这种自然的聚类过程便十分明显了。

Learn More at Galvanize!

k-means 是 Galvanize 数据科学强化项目中众多机器学习课题的一个。如果感兴趣,可以在这里学到更多。

python音频聚类_用K-means聚类算法实现音调的分类与可视化相关推荐

  1. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  2. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  3. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  4. python机器学习案例系列教程——k均值聚类、k中心点聚类

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 上一篇我们学习了层次聚类.层次聚类只是迭代的把最相近的两个聚类匹配起来.并没有给出能给出多少的分组.今天我们来研究一个K均值聚类.就是 ...

  5. Kmeans++、Mini-Batch Kmeans、Bisecting Kmeans、K中心点(K-Medoids)算法、K众数聚类、核K均值聚类

    Kmeans++.Mini-Batch Kmeans.Bisecting Kmeans.K中心点(K-Medoids)算法.K众数聚类.核K均值聚类 目录 Kmeans++.Mini-Batch Km ...

  6. 支撑阻力指标_使用k表示聚类以创建支撑和阻力

    支撑阻力指标 Note from Towards Data Science's editors: While we allow independent authors to publish artic ...

  7. python(scikit-learn)实现k均值聚类算法

    k均值聚类算法原理详解 示例为链接中的例题 直接调用python机器学习的库scikit-learn中k均值算法的相关方法 from sklearn.cluster import KMeans imp ...

  8. k均值聚类图像分割matlab代码_用K均值聚类法为人类拍摄的首张黑洞照片进行分割...

    众所周知,人类最近拍摄了首张黑洞照片.网友们纷纷表示,这明明就是一个甜甜圈嘛!以前以为黑洞是这个世界上最最高冷的存在,而此刻突然现出真身,形象却是如此的人畜无害!不但如此,还勾起了网友的食欲!简直是罪 ...

  9. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

最新文章

  1. ssh suse 配置_SUSE+linux+配置节点间的SSH信任关系
  2. Ecplise中的Maven项目提示找不到jar包
  3. 计算机科学与技术创新实验班是什么意思,计算机科学与技术系成立2010级创新实验班(图)...
  4. INTEL和AMD两大巨头的前身
  5. phpstudy本地搭建域名访问
  6. Spring获取前台参数的几种方式
  7. Exchange 服务器可支持性矩阵
  8. 云服务器的安全组各个端口代表什么意思?
  9. paip.提升性能---string split
  10. Vmware安装vmware-tools后,仍无法上网
  11. 计算机视觉应用培训心得体会,三维计算机视觉学习感想
  12. 【数码复印新生态】东芝泰格强势支持统信UOS
  13. 如何删除我的计算机里的搜索记录,计算机里搜索栏的历史记录怎么删除?
  14. 基于WEB快速开发平台的轻量ERP
  15. Android博通BCM libbt-vendor.so 分析蓝牙初始化流程
  16. python统计中英文字符_如何统计文本中的中英文字符数?Python帮你解决
  17. 聚焦运营商信创运维,美信时代监控易四大亮点值得一试!
  18. 金融分析与风险管理——风险价值(VaR)
  19. ios- 地图路线规划
  20. Group Box组合框的简单使用

热门文章

  1. QUERY 1:制作扩展字段
  2. 有一种病,叫情绪枯竭
  3. Java短信接口开发经验及具体开发实现
  4. grep内容着重显示
  5. 利用Python实现阴阳师自动抽卡,SSR手到擒来,开始爆肝!
  6. 2022年全球市场腹腔镜套管针总体规模、主要生产商、主要地区、产品和应用细分研究报告
  7. 4_1Linux概述
  8. 10.大数据技术之Flink
  9. LTC4056/TP4056国产替代DP4056锂电池充电保护芯片
  10. 计算机主机拆解报告,计算机主机拆装实训报告.doc