我正在为身体生成训练一个网络,即给定一些特定的测量,(5个特征)输出将是一组代表身体对象的顶点。我想知道哪种机器学习算法最适合这种情况。
低维输入到高维输出的机器学习算法
解决问题的一种常见方法是首先以无监督的方式学习输出空间的低维表示,然后将输入映射到现在降维的输出。用一种伪 SKLearn 术语来说,整个过程如下所示:
模型拟合:
dr = SomeDimensionalityReducer()
Y_dr = dr.fit_transform(Y)
m = SomeSupervisedModel()
m.fit(X, Y_dr)
模型应用:
dr.inverse(m.predict(X_new))
对于您的角色,SomeSupervisedModel您可以自由选择任何标准的机器学习回归模型,记住您可能需要将向量预测为输出而不是单个数字。在某些情况下(例如神经网络),它是模型的自然组成部分,在其他情况下,这意味着您需要为输出中的每个组件训练一个单独的模型。
降维技术的选择有点棘手,因为该inverse操作通常不是标准实现的一部分,因此您可能需要手动理解和实现它。
您的主要选项列在有关降维的 Wikipedia 页面中。考虑PCA、Kernel-PCA和自动编码器作为您的基本选择。
- PCA 将导致线性映射,并且可能不足以在除了最简单的任务之外的所有任务中充分表示输出空间。但是,它易于使用和理解,并且不太容易过度拟合。
- Kernel-PCA 是一种更灵活的非线性模型,仍然很容易实现,但它对内存和计算量的要求更高,可能会过拟合。
- Autoencoder 路线可能是三者中最好的,但是,作为一种基于神经网络的方法,它可能很繁琐,需要大量调整。有各种各样的自动编码器可供选择。
另一种可能性,在上面的维基百科文章中没有提到(因为它更像是一种“维度扩展”而不是减少方法)是生成对抗网络。在所有提到的方法中,它可能是最复杂的,如果你很幸运并且拥有大量数据,它可能会给出最好的结果。不幸的是,它是最麻烦的,所以在尝试之前先尝试其他的东西。
请注意,您不需要输入 X来执行降维,因此您可以通过从输出空间提供更多样本来“帮助”您的方法,而无需获得相应的输入。
如果我理解正确,您想对一组数据(在这种情况下以网络形式)进行建模,您可以为其提供 5 个输入参数,并获得 N 个对象作为模型的输出,其中 N>5。
网络基本上根据输入参数对对象进行分类并输出预测值。放置一个基本的网络生成,您可以根据 3 个特定特征对您正在查看的汽车进行分类:“电机尺寸”、“座位数”和“汽车设计的国家/地区”。从网络中,您可以提取型号和生产年份(如果提供足够的数据)并预测您拥有的汽车。但是,由于该方法,您获得的输出维度小于输入(通常 N_output=1)。
但是,您可以将某些信息与该输出相关联。在前面的示例中,它可能是网络输出的汽车模型的技术数据表。该技术数据表可能包含模型(网络)中未考虑的许多特征,导致 N_output>N_input。
在这种情况下,关键步骤是正确选择您想要的网络输出(分类算法),以及您希望如何将该输出与进一步了解该分类相关联。
创建网络的算法本身取决于数据和您想要的输出。例如,在前一种情况的基本 KNN 中,您选择输出作为导致网络的所有输入的“复合加权效应”。