大家好,我是EYS的张森,在EYS从事音乐机器学习的开发业务。今天我们谈谈非负矩阵分解(NMF)。
矩阵分解和非负矩阵分解
从某段钢琴的触的第一、第二成分
第一、第二成分强度的时间推移
矩阵分解,就是把一个(N,M)的矩阵V分解成两个矩阵W和H
V = WH
W和H分别为(N,h)和(h, M)的矩阵。这样一来,乍一看好像需要处理的变数增加了,然而通常情况下h远远小于N和M,所以整体的成分是减少的。也就是说用更少的数字记述同一个量。
在这里,V相当于你拥有N个样本,每个样本里有M种数据。而把V分解成W和H,就相当于你把原先有M成分的量分解成h种主要的成分(H),然后把每个样本数据用这h种成分来说明(W)。这样做的原因是,M在数量上可能有很多,但起主要作用的因素往往没有那么多。H把主要成分抽取了出来,有时也被称为字典(dictionary)。
比如说音乐,我们可以把频谱当作行列来看,每段时间就相当于一个样本,每段时间内的每个频率振幅就相当于样本所带的数据。我们知道每个声音往往都有其固定的频率分布,而矩阵分解就相当于抽出其中最常见的几种分布(比如说各种音高的音频分布等),然后用它们重新构成原先的音乐。频谱通常取傅立叶分解系数的绝对值,V是一个正值的矩阵,我们需要H也是正值。而我们把声音分解成各个成分时也每个成分应该也是正的,所以也需要W为正值。在V为正的前提下,保证W和H为正直的分解,就是非负矩阵分解。
实际效果
接下来我们看看处理的实际效果。声音是随便从Freesound.org下载的。
https://drive.google.com/open?id=1q-CbQ12pJ_fgs80vltTbPGZMtK-JCq2l
如果只用一种成分(h=1)的话,结果就是一种声音在演奏
https://drive.google.com/open?id=1Zxixv4mE4S7IWQYYgKF6FEhZkwJwjWjx
用五种成分(h=5)时,声音就显得有变化了:
https://drive.google.com/open?id=1MyXEPLIHhRe6B7VlDNFMQwi3GJEePHua
用十种成分,声音好许多了:
https://drive.google.com/open?id=1b1tbW4y8mXoklsCaxEFpmkcJdC4xed2S
用二十种成分,一部分余韵似乎也出来了:
https://drive.google.com/open?id=17F–ZBIzRe-aAR8Idi6HKSZKdGgbmtWF
需要注意的是,傅立叶分析后的数据每个样本里有600多个成分,现在仅用20个成分就可以几乎重现原本的声音了。说明钢琴声音作为音乐数据,内部应该是存在很强的结构和规律的。
最后,我们把整个音频的频率分布和NMF成分做了一个比较动画,供大家参考。