为音乐创作选择 ML 算法

数据挖掘 机器学习 分类 分类数据
2021-09-16 08:06:56

我是作曲家和程序员。我想用 ML 来作曲。已经有针对已知音乐风格的机器作曲的一般问题的研究。我更感兴趣的是使用计算机来帮助自己作曲的具体问题……加快某些重复性任务,或者用意想不到的想法让我高兴。

首先,我想设计可以在单个短文中进行好/坏分类的机器学习。(起初不打算生成音乐。)

将这样的段落分解为重要的特征要容易得多。我可以说像

  • 也许存在特定的“间隔”(和声),而其他的则不存在
  • 也许音符从低到高均匀分布,或者可能不是
  • 也许音符聚集在某个音域周围,而不是分散开来
  • 可能节奏特别不均衡
  • 也许一个特定的音符经常出现

我可以很容易地编写算法,为任何给定的段落生成这些特征的列表,我什至可以很确定我包含了所有相关的特征。对于一种“艺术形式”来说,音乐令人惊讶地易于分析。

诀窍在于,首先,会有数百个观察结果,其次,这些观察结果中没有一个本身是好是坏。假设我们有 A、B 和 C 三个因素。A 单独一个并不坏,但也许当 A 和 B 同时出现时,那就不好了。但也许如果 A、B 和 C 同时出现,它又会变好!然后可能是第四个因素 D,改变了上下文,使得 A、B 和 C 不再重要。

这似乎是一个 ML 问题,但我想知道最好的方法是什么?

我可以构建或创作数百个标记为好和坏的音乐示例,并在每个示例中识别数百个“特征”。一些特征是“存在/不存在”类别,而另一些则是可以从 0 缩放到 1 的数字。

是否有一个通用且简单的学习算法,即使是像我这样的 ML 新手(但我是一位经验丰富的程序员)也可以实现?

我必须生成自己的训练示例,并且限制在 300 到 1000 个左右,因为我正在我的风格在简单的段落上训练它。这实际上可能是个好问题……与一般的音乐智力相比,我的工作并不复杂。

我将把这项任务与图像识别进行对比。图像具有数百万像素,并且特征分散,以无穷无尽的排列发生。试图弄清楚深度神经网络中发生了什么让我头疼。

但是,在音乐中,最多会有几百个特征。这些模式不会以无穷无尽的排列出现。事实上,在精简的情况下,我的疯狂猜测是,通过查看 10 个特征(假设您的权重和组合训练有素),您可以做出 80% 准确率的分类器。我的目标比这要高一些(我需要更多的功能和更准确的一点)。

让您对我的数据集有所了解:我正处于编写软件以提取特征的早期阶段,但我对自己的目标有一个很好的心理想法(多年来一直在手工编写)。为了使这一点更具体,我创建了一个网页,显示数据的外观。这很简单,完全是虚构的。

http://theunexpectedpearl.com/dataset.html

这显示了四行。每一行都是我将自动创作或生成的一段音乐示例。每一行都被我自己的耳朵分类为“好”或“坏” 。该行的其余部分是一长串特征,每个特征要么是“是/否”,要么是从 0.0 到 1.0 的单个数字。

我认为朴素贝叶斯分类器不会为此工作(如果我理解正确的话),因为特征本身既不好也不坏……只有它们(上下文)的组合才重要。事实上,同样的特征可以在一种情况下有助于“好”,并在另一种情况下立即成为“坏”的强烈指示。

数据的结构可能不同。在实践中,这个电子表格将是“稀疏的”,也许特性应该以某种方式分组,或者排列成树。

2个回答

让我们以一种可以从机器学习的角度理解的方式来表述这个问题。您有一组实例X每个实例X一世R在哪里是实例的维度。换句话说是描述实例的特征的数量。您的问题打算从一组功能到类别标签goodbad因此,这是从R是的{0,1}.

如何实现这种映射?

这是我们将使用机器学习算法的时候。我们将训练一个模型来有效地逼近从一组输入中给出输出标签的函数。很明显,稀疏特征(低信息熵)会使映射函数复杂化,从而提供更差的结果。这就是为什么特征工程对于机器学习至关重要的原因。它可能是机器学习管道中最难的部分,但它是决定你的结果的主要因素。

您可以使用一些特征缩减技术来删除与输出标签相关的无信息特征。我经常使用的一些技术是主成分分析 (PCA)、线性判别分析 (LDA)。或者,您可以使用一些投影方法来减少数据的维数,同时保持类之间的分离。此类技术是 Isomap、MDS、光谱嵌入和 TSNE。您可以检查哪个最适合您的数据类型。

如何选择型号?

首先,您的问题是一个有监督的分类问题。这已经缩小了您可以使用的模型类型。此外,模型选择基于一些关键因素,例如:您拥有的实例数量、每个实例的特征数量和输出节点的数量。您还应该考虑到输出类之间概率分布的可分离性将直接影响模型的性能。例如,区分汽车和橘子比区分橘子和柑桔要容易得多。

在您的情况下,您有 1,000 个实例和大约 13 个功能。这意味着基于深度学习的技术是可能的,但不鼓励。您没有足够的数据。然后您可以尝试以下流行的分类模型

  • 支持向量分类器
  • 朴素贝叶斯
  • K-最近邻
  • 决策树
  • 随机森林

要评估哪个模型表现最好,您将使用经过训练的模型在测试集上获得的准确度。该集合应独立于训练集以捕获过度拟合。这是模型无法泛化到新数据的时候。


在代码中

假设矩阵 X 包含数据,其中行是实例,列是特征,矩阵 包含标签。

首先,我们将数据拆分为训练和测试集

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33)

from sklearn.svm import SVC
clf = SVC()
clf.fit(X_train, y_train)
print('Score: ', clf.score(X_test, y_test))

from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X_train, y_train)
print('Score: ', neigh.score(X_test, y_test))

from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf.fit(X_train, y_train)
print('Score: ', clf.score(X_test, y_test))

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100)
forest.fit(X_train, y_train)
print('Score: ', forest.score(X_test, y_test))

这应该是一个起点。如果您遇到任何问题,请告诉我们,让我们知道您获得的准确性,然后我们可以更深入地研究这些模型并更好地使它们适合您的数据源。

我将提供一些建议,让创意源源不断。

首先,由于您有两个任务,您可以考虑将两个模型配置为生成对抗网络,其中

  • 一种模型生成音乐段落
  • 一种模型对音乐段落进行分类

然后由分类器评估生成模型的输出。然后可以使用分类器的输出来改进(训练)生成模型。

我想这些将在相同的标记数据集上进行训练。我会使用循环神经网络来训练分类器并从中调整鼻涕(可以这么说)。我会为生成模型使用生成神经网络。

也许你正在寻找更多的方向。如果是这样,很抱歉让您失望了。我想你可能一直在寻找更好的方法来寻求帮助。

祝你好运。