自动调整3个参数以最小化标准偏差

时间:2011-09-23 09:26:25

标签: java database automation artificial-intelligence machine-learning

情况: 我目前正在开发基于规则的Java应用程序。每个规则都有3个数字参数来影响数据库通信。我正在测量受此规则影响的值,并计算测量值的标准偏差。标准偏差应尽可能小。

问题: 我想知道是否可以自动完成这项工作?我已经可以自动启动测试场景,我可以自动计算标准偏差。所以,现在我正在寻找根据测量值调整参数的机制。有什么想法吗?

感谢名单。

PS:我知道,这是一个非常普遍的问题......

3 个答案:

答案 0 :(得分:5)

正如彼得所说,你必须尽量减少一个函数f(a,b,c)。良好的行为功能有很多精心设计的方法。例如,对于可以区分的函数,或者对于所谓的凸函数。在你的情况下,你有一个我们不太了解的功能。因此f可以具有不同的局部最小值,这会杀死许多已建立的最小化方法。

如果对参数集a,b,c的简单评估很快,您可以尝试某种坐标下降。这不是最好的方法,蛮力但很容易实现。我将(a,b,c)所取得的标准差命名为s(a,b,c)

我给你一些python样式的伪代码,应该很容易阅读:

   def improve(a,b,c):
       eps = .01


       s1 = s(a*(1+eps), b, c)
       s2 = s(a, b*(1+eps), b, c)
       s3 = s(a, b, c*(1+eps))

       s4 = s(a*(1-eps), b, c)
       s5 = s(a, b*(1-eps), c)
       s6 = s(a, b, c*(1-eps))

       # determine minimal of (s1....s6) and take index:
       i = argmin (s1....s6) 

       # take parameters which lead to miminal si:   
       if i==1:
          a = a*(1+eps)
       if i==2:
          b = b*(1+eps)

       ...

       if i==6:
          c = c*(1-eps)

       return a,b ,c

您必须从一些值(a,b,c)开始,此功能应该为您提供一个新的三元组(a,b,c),从而减​​少变化。现在,您可以根据需要随时应用此步骤。 也许您必须调整eps,这取决于s(a,b,c)ab稍作修改后c的变化速度。

这不是最好的解决方案,而是一种易于尝试的实践方法。

答案 1 :(得分:1)

幸运的是,有许多通用的解决方案。它应该是解决函数以最小化结果的问题。如果你有一个函数x = f(a,b,c)你想找到a,b,c,它给出一个最小x。最简单的方法是试错,但你可以通过使用二进制搜索和线性插值来改进(假设拓扑相对简单)有更复杂的方法,但你可能不需要它们。

你知道实际的功能是什么吗?如果它是一个纯粹的标准差,你可以使a,b,c相同,例如平均值,标准偏差为0。

答案 2 :(得分:0)

如果你对f一无所知,我想我会随机抽样一段时间并查看结果。然后你可以决定是否要进行梯度下降或其他事情。