【问题标题】:How to best approach the problem of trying to determine the form of an unknown function如何最好地解决试图确定未知函数形式的问题
【发布时间】:2010-10-15 17:05:17
【问题描述】:

我有一组变量X, Y, ..., Z。我的工作是设计一个函数,它采用这组变量并产生一个整数。我有一个适应度函数来测试它。

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

f(X, Y, ..., Z) -> aX + bY ... cZ

我的第一个想法是使用 PSO(粒子群优化)或遗传算法来解决 fa, b, .., c 的问题,我相信它们肯定会产生良好的结果。

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

它有什么缺点?任何有此类问题经验的人?我能想到的最大的一个可能是,我认为a,b, .., c 的良好起始值可能是“局部最优”,并且拥有某种进化算法会产生一个全局算法。

f 应该是象棋类游戏的 Minimax 算法的近似函数,如果这很重要的话。

谢谢

【问题讨论】:

  • 我相信这类问题如果不加一些的上限,比如假设目标函数是线性的或者多项式的,几乎是不可能解决的度数固定。
  • 是的,我很清楚这一事实。这篇文章的目标之一是试图了解人们是否通常像我一样假设函数是线性的,或者通常尝试其他形式的函数是否是个好主意。也许是多项式,我不知道?
  • “函数是线性的”只是您需要针对数据进行测试的假设。

标签: artificial-intelligence genetic-algorithm linear-regression


【解决方案1】:

您正在描述一个回归问题,这是一个经典的机器学习问题。有数以千计的科学论文和整本教科书都是关于这个主题的。我建议在线查看一些机器学习课程或查看standard machine learning text

一般方法与您提到的类似,求解变量的线性系数以最小化一些损失,通常是平方误差之和(L2 损失)。这是可取的,因为它是一个凸函数,因此包含一个最小值,并且可以在多项式时间内求解权重。然而,就像你提到的,真正的函数可能不在这个函数类中,你的估计会很差。这种情况下的方法是尝试使用一些晦涩的粒子群方法或遗传算法或任何其他全局优化技术进行某种非凸优化。你的陈述“......可能是一个“局部最优”,并且拥有某种进化算法会给我一个全局算法。”是一个天真的。全局优化是 NP-Hard 的,这些技术只是近似值,绝对不能保证运行时间或最优性,而且它们几乎从不工作。

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

【讨论】:

  • 我并不担心如何识别这些特征,我想我已经识别出了一组很好的特征。我想了解更多关于功能扩展的信息,我找不到 wiki 文章(至少对于那个名字)。你能提供更多关于它的参考吗?
  • 我链接到的教科书的第 5 章,“基础扩展和正则化”,正是你想看的。
【解决方案2】:

鉴于您正在开发一款游戏,首先想到的是一个古老的跳棋程序,由 Arthur Samuel 在 1950 年代开发,Russell and Norvig 在他们的游戏章节中提到(其中其他人;它仍然是无监督/半监督机器学习的经典)。

这个程序假设棋盘的价值是棋盘位置的线性函数。我不知道细节,但我假设每个玩家的棋子值 +1,对手的棋子值 -1,空域为 0。每个方格都有一个与之相关的权重,这是通过让程序对战来学习的本身一些(大量)次,在每场比赛后评估比赛。

这种策略被称为自我训练,也被应用于经典的步步高软件TD-Gammon,它基于神经网络(多层/非线性)。关于该程序的 Wikipedia 页面有一些可能很有趣的参考资料。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我仍然不知道输入变量到底是什么(所以我不知道变量的域)。当我扫描每个变量时,您修复每个变量的想法似乎并不好。使用进化算法的想法正是为了避免必须扫描所有值(状态空间很大!)。
    猜你喜欢
    • 2012-02-26
    • 2010-11-03
    • 1970-01-01
    • 2019-05-01
    • 2021-12-24
    • 2021-10-12
    • 2010-09-29
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多