Artificial intelligence 如何最好地解决试图确定未知函数形式的问题

Artificial intelligence 如何最好地解决试图确定未知函数形式的问题,artificial-intelligence,genetic-algorithm,linear-regression,Artificial Intelligence,Genetic Algorithm,Linear Regression,我有一组变量X,Y,…,Z。我的工作是设计一个函数,它接受这组变量并生成一个整数。我有一个适合度函数来测试它 我对这个问题的第一个尝试是假设我可以将f建模为一个线性函数: f(X, Y, ..., Z) -> aX + bY ... cZ 我的第一个想法是使用PSO(粒子群优化)或遗传算法来求解a,b,…,c的f,我相信它们一定会产生好的结果 另一方面,我觉得也许真的不需要那种进化算法。首先,我可以为a,b,…,c想出几个好的“起点”。既然f是一个线性函数,试一试几个点,然后对它们进行线

我有一组变量
X,Y,…,Z
。我的工作是设计一个函数,它接受这组变量并生成一个整数。我有一个适合度函数来测试它

我对这个问题的第一个尝试是假设我可以将
f
建模为一个线性函数:

f(X, Y, ..., Z) -> aX + bY ... cZ
我的第一个想法是使用PSO(粒子群优化)或遗传算法来求解
a,b,…,c
f
,我相信它们一定会产生好的结果

另一方面,我觉得也许真的不需要那种进化算法。首先,我可以为
a,b,…,c
想出几个好的“起点”。既然
f
是一个线性函数,试一试几个点,然后对它们进行线性回归难道不是更容易吗?在线性回归之后,再尝试几个点,这次更接近一个好的“点”,再次对它们进行线性回归

它的缺点是什么?有没有人有这方面的经验?我能想到的最大的一点是,也许我认为<代码> a,b,…,c>代码>的好的起始值可能是一个“局部最优”,并且具有某种进化算法会使我成为一个全局优化算法。
f
被认为是象棋类游戏的Minimax算法的近似函数,如果这很重要的话


谢谢

考虑到你正在做一个游戏,首先想到的是一个古老的跳棋程序,由20世纪50年代开发,并在他们关于游戏的章节中提到(除其他外,它仍然是无监督/半监督机器学习的经典)

该程序假设棋盘的值是棋盘位置的线性函数。我不知道细节,但我假设每个玩家的棋子值+1,对手的棋子值-1,空位值为0。每个方块都有一个与之相关的权重,它是通过让程序对自己进行多次(大量)比赛来学习的,每次比赛后都要对比赛进行评估

这种策略称为自训练,也应用于基于神经网络(多层/非线性网络)的经典双陆棋软件中。关于该计划的维基百科页面有一些潜在的有趣的参考资料


这个答案正在变成一篇关于我不是专家的文章。请参阅相关文献。

如果我理解你的问题,你有一个函数,它接受输入,然后提供一些输出,这应该与象棋类游戏的近似函数有关,你应该猜它是如何计算输出的


您没有说明输入变量是什么,因此我无法告诉每个变量的域是什么,但一般策略是保持所有输入相同,并迭代一个变量域中的所有值。对所有输入重复上述步骤,并使用生成的数据集指导下一组测试。很可能函数使用的实际方法是绝对愚蠢的,如果不将每个输入映射到每个输出,就无法合理地复制该方法。

您描述的是一个回归问题,这是一个经典的机器学习问题。有数以千计的科学论文和完整的教科书只写了这个主题。我建议你在网上看一些机器学习课程,或者去看一本书

一般方法与您提到的类似,求解变量上的线性系数以最小化某些损失,通常是误差平方和(L2损失)。这是可取的,因为它是一个凸函数,因此包含一个最小值,并且权重可以在多项式时间内求解。但是,正如您所提到的,真正的函数可能不在这个函数类中,并且您的估计很差。这种情况下的方法是而不是尝试某种非凸优化,使用一些模糊的粒子群方法或遗传算法或任何其他全局优化技术。你的说法“可能是“局部最优解”,拥有某种进化算法会让我得到一个全局最优解。”是一个幼稚的说法。全局优化是NP难的,这些技术只是近似值,对运行时或最优性没有任何保证,而且几乎不起作用


一种更被接受的方法是使用“特征扩展”,它接受变量
X,Y,…,Z
,并将非线性变换应用于某个新集合
phi(X),phi(Y),…,phi(Z)
。此时,您可以使用最小二乘法(如果使用L2)或其他方法为每个特征找到最佳线性权重。如何找到好的特征在机器学习中是一个开放的问题,但是有大量的想法和免费可用的算法可以做到这一点。

我认为如果不加限制,例如假设目标函数是线性的或固定次数的多项式,这类问题几乎不可能解决。是的,我很清楚这个事实。这篇文章的目的之一是试图了解人们是否像我一样一般认为函数是线性的,或者通常来说,尝试其他形式的函数是个好主意。也许多项式,我不知道?“函数是线性的”只是一个假设,你需要对你的数据进行测试。我仍然不知道输入变量是什么(所以我不知道变量的域)。当我浏览每一个变量时,你修复每一个变量的想法似乎不太好。使用进化算法的想法正是为了避免扫描所有的值(状态空间是巨大的!)。我不担心如何识别特征,我想我已经知道了