情况: 我目前正在开发基于规则的Java应用程序。每个规则都有3个数字参数来影响数据库通信。我正在测量受此规则影响的值,并计算测量值的标准偏差。标准偏差应尽可能小。
问题: 我想知道是否可以自动完成这项工作?我已经可以自动启动测试场景,我可以自动计算标准偏差。所以,现在我正在寻找根据测量值调整参数的机制。有什么想法吗?
感谢名单。
PS:我知道,这是一个非常普遍的问题......答案 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)
,a
或b
稍作修改后c
的变化速度。
这不是最好的解决方案,而是一种易于尝试的实践方法。
答案 1 :(得分:1)
幸运的是,有许多通用的解决方案。它应该是解决函数以最小化结果的问题。如果你有一个函数x = f(a,b,c)你想找到a,b,c,它给出一个最小x
。最简单的方法是试错,但你可以通过使用二进制搜索和线性插值来改进(假设拓扑相对简单)有更复杂的方法,但你可能不需要它们。
你知道实际的功能是什么吗?如果它是一个纯粹的标准差,你可以使a,b,c相同,例如平均值,标准偏差为0。
答案 2 :(得分:0)
如果你对f
一无所知,我想我会随机抽样一段时间并查看结果。然后你可以决定是否要进行梯度下降或其他事情。