如何减少以矩阵和向量形式出现的音频数据的维数?

数据挖掘 Python scikit-学习 降维 特征工程 音频识别
2021-09-22 17:44:55

我正在从事一个项目,该项目涉及识别彼此不同类型的声音(例如尖叫声、歌声和爆炸声)。我们的数据有合理数量的不同转换(例如:频谱图、色谱图、MFCC 等),但由于我们的大多数特征都是二维矩阵(有些实际上是一维向量),我们希望以某种方式减少这些信息,以便我们希望进行的机器学习需要“可行”的时间。 但是,我对数学和统计学知之甚少,无法对此做出有根据的决定。

我们的数据由大约 1-10 秒长的小声音文件组成。有尖叫声、歌声、砰砰声(和其他人造噪音)和鸟儿(和其他自然噪音)的录音。我们希望能够将每种来源类型与其他来源类型区分开来。请参阅https://github.com/BenSandeen/surveillance_sound_classifier/blob/master/Project.ipynb,了解我们为指导我们选择要使用的功能而制作的不同图。主要关注 3x3 图,因为这是进行比较的地方。这些图主要是时间与频率的关系,幅度由颜色表示。

我在想,也许我们可以通过在每个时间片上以某种方式选择一些代表性的频率/幅度相关特征(我们使用短时傅里叶变换来分析声音)将每个矩阵“折叠”成一个向量,然后得到一个向量一些长度,包含一堆标量。尽管这可能会使计算不同长度的声音变得困难。如果没有有用的数据,将较短的声音向量设置为用零填充是否合理?这将有效地使这些声音投射到一些低维空间上。然后,也许我们可以只使用点积来比较向量;如果它们是平行的,它们将有一个大的产品,但它们几乎是垂直的,它们将有一个接近零的点产品。

或者,我在想像我们的矩阵的踪迹,或者找到它们的特征多项式,可能是有用的方向。我已经阅读了一些关于PCA的内容,但我对它的理解还不够,无法知道这是否是我正在寻找的东西。

谁能想到其他处理和减少这些数据的方法?对于它的价值,我们目前正计划使用 Sci-Kit Learn(抱歉,我不能使用超过 2 个链接)来执行我们的机器学习。

2个回答

关于指纹的有趣想法,但这在这里行不通,因为您没有正在使用的确定声音。

对我来说,这似乎更像是一个图像处理问题。因此,与其考虑如何降低维度,不如尝试将您的数据组合成“图像”,以数字方式表示您正在查看的声音。然后使用标准的图像处理技术。我说这话含糊地挥舞着双手,因为我不知道具体的,但对边缘检测、特征检测和应用 map/reduce 类型的方法有足够的理解,这些方法可能能够为你所追求的提供模板。

只需将矩阵展开成一大组特征:

如果所有矩阵的大小相同,您可以将它们展开成一个大特征集,例如 20 x 20 矩阵变成 400 个特征。您可以使用多个不同的特征矩阵来做到这一点。由学习算法来推断每个特征的含义,所以不要过度考虑缺乏人类可读性。看一下scikit learn 中关于数字识别的教程,你会发现“图像像素矩阵”也同样展开了。

然后,您可以使用PCA非线性降维方案来选择特征空间的子集。尽管它可能违背您的直觉,但降维可能会改善您的分类算法。

考虑不同长度的声音是一个难题,因为归一化会改变频率,从而影响您的傅立叶变换。我建议定义某种特征声音长度并对长声音进行二次采样n 时间和过采样短声音 n 次。

希望这可以帮助!