2

我有未知函数返回的值,例如

# this is an easy case - parabolic function
# but in my case function is realy unknown as it is connected to process execution time
[0, 1, 4, 9]

有没有办法预测下一个值?

4

9 回答 9

4

不必要。你的“抛物线函数”可能是这样实现的:

def mindscrew
  @nums ||= [0, 1, 4, 9, "cat", "dog", "cheese"]
  @nums.pop
end

你可以猜测,但要确定地预测是不可能的。

于 2009-07-19T20:59:38.743 回答
4

如果你只想要数据点

可以估计已知点之外的数据推,但您需要接受潜在差异比已知点之间的数据插值大得多。严格来说,两者都可能是任意不准确的,因为该函数可以在已知点之间做任何疯狂的事情,即使它是一个表现良好的连续函数。如果它表现得不好,所有的赌注都已经结束了;-p

有许多数学方法(直接应用于计算机科学)——从简单的线性代数到三次样条等;以及介于两者之间的一切。

如果你想要这个功能

变得深奥;另一个有趣的模型是遗传编程;通过在已知数据点上演化表达式,可以找到适当接近的近似值。有时它有效;有时它不会。不是您正在寻找的语言,但 Jason Bock 在这里展示了一些在 .NET 3.5 中执行此操作的 C# 代码:Evolving LINQ Expressions

我碰巧有他的代码“手头”(我在一些演示文稿中使用过它);使用类似的东西a => a * a几乎可以立即找到它,但它应该(理论上)能够找到几乎任何方法 - 但没有任何定义的最大运行长度;-p 也有可能进入死胡同(进化论),其中你永远不会恢复...

于 2009-07-19T21:04:06.750 回答
4

您可以尝试使用神经网络方法。您可以通过 Google 查询“神经网络函数逼近”找到很多文章。许多书籍也可用,例如本书。

于 2009-07-19T21:14:27.247 回答
2

一般来说,不......除非你知道它是一个特定形式的函数(例如某个N次多项式)并且有足够的信息来约束这个函数。

例如,对于一个更“普通”的反例(请参阅 Chuck 的回答),为什么你不能假设 n^2 不知道它是一个二次方程,你可以有 f(n) = n 4 - 6n 3 + 12n 2 - 6n,其中 n=0,1,2,3,4,5 f(n) = 0,1,4,9,40,145。

如果您确实知道它是一种特定的形式,则有一些选择...如果该形式是基函数的线性加法(例如 f(x) = a + b cos(x) + c sqrt(x)),则使用最少-squares 可以使用这些基函数为您提供最佳拟合的未知系数。

于 2009-07-20T21:12:37.757 回答
2

使用Wolfram Alpha API :)

于 2009-07-19T21:02:52.230 回答
2

是的。也许。

如果您有一些输入和输出值,即在您的情况下 [0,1,2,3] 和 [0,1,4,9],您可以使用响应面(我相信基本上是函数拟合)来“猜测”实际功能(在您的情况下为 f(x)=x^2)。如果你让你的猜测函数为 f(x)=c1*x+c2*x^2+c3 有算法将确定 c1=0、c2=1 和 c3=0 给定你的输入和输出并给出结果函数可以预测下一个值。

请注意,此问题的大多数其他答案也是有效的。我只是假设你想为数据拟合一些函数。换句话说,我觉得你的问题很模糊,请尽量让你的问题尽可能完整!

于 2009-07-19T21:06:35.297 回答
1

另请参阅此问题

于 2009-07-21T17:11:45.210 回答
1

您可以应用统计方法来尝试猜测下一个答案,但如果函数像这样 (c),则可能效果不佳:

int evil(void){
  static int e = 0;
  if(50 == e++){
    e = e * 100;
  }
  return e;
}

此函数将返回漂亮的简单递增数字,然后... BAM。

于 2009-07-19T20:57:47.777 回答
0

这是一个难题。

对于可能执行此类任务的特殊情况,您应该检查递归关系方程。

于 2009-07-19T21:03:11.417 回答