情景:
我目前正在开发一个基于规则的 Java 应用程序。每个规则都有 3 个数值参数来影响数据库通信。我正在测量一个受这些规则影响的值,并计算测量值的标准差。标准差应尽可能小。
问题:
我想知道是否可以自动执行此操作?我已经可以自动启动测试场景,并且可以自动计算标准差。所以,现在我正在寻找一种机制来根据测量值调整参数。有什么想法吗?
谢谢。
PS:我知道,这是一个非常笼统的问题…
回答:
正如Peter所说,您必须最小化一个函数 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
,这取决于如果您对 a
、b
或 c
进行少量修改,s(a,b,c)
变化的速度。
这不是最好的解决方案,但是一种易于尝试的实践方法。