我有未知函数返回的值,例如
# 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]
有没有办法预测下一个值?
不必要。你的“抛物线函数”可能是这样实现的:
def mindscrew
@nums ||= [0, 1, 4, 9, "cat", "dog", "cheese"]
@nums.pop
end
你可以猜测,但要确定地预测是不可能的。
可以估计已知点之外的数据外推,但您需要接受潜在差异比已知点之间的数据插值大得多。严格来说,两者都可能是任意不准确的,因为该函数可以在已知点之间做任何疯狂的事情,即使它是一个表现良好的连续函数。如果它表现得不好,所有的赌注都已经结束了;-p
有许多数学方法(直接应用于计算机科学)——从简单的线性代数到三次样条等;以及介于两者之间的一切。
变得深奥;另一个有趣的模型是遗传编程;通过在已知数据点上演化表达式,可以找到适当接近的近似值。有时它有效;有时它不会。不是您正在寻找的语言,但 Jason Bock 在这里展示了一些在 .NET 3.5 中执行此操作的 C# 代码:Evolving LINQ Expressions。
我碰巧有他的代码“手头”(我在一些演示文稿中使用过它);使用类似的东西a => a * a
几乎可以立即找到它,但它应该(理论上)能够找到几乎任何方法 - 但没有任何定义的最大运行长度;-p 也有可能进入死胡同(进化论),其中你永远不会恢复...
一般来说,不......除非你知道它是一个特定形式的函数(例如某个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 可以使用这些基函数为您提供最佳拟合的未知系数。
使用Wolfram Alpha API :)
是的。也许。
如果您有一些输入和输出值,即在您的情况下 [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 给定你的输入和输出并给出结果函数可以预测下一个值。
请注意,此问题的大多数其他答案也是有效的。我只是假设你想为数据拟合一些函数。换句话说,我觉得你的问题很模糊,请尽量让你的问题尽可能完整!
另请参阅此问题。
您可以应用统计方法来尝试猜测下一个答案,但如果函数像这样 (c),则可能效果不佳:
int evil(void){
static int e = 0;
if(50 == e++){
e = e * 100;
}
return e;
}
此函数将返回漂亮的简单递增数字,然后... BAM。
这是一个难题。
对于可能执行此类任务的特殊情况,您应该检查递归关系方程。