1

情況: 我目前正在開發基於規則的Java應用程序。每條規則都有3個數字參數來影響數據庫通信。我正在測量一個值,該值受此規則的影響並計算測量值的標準偏差。標準偏差應儘可能小。自動調整3個參數以最小化標準差

問題: 我想知道是否可以做到這一點自動化?我已經可以自動啓動測試場景,並且可以自動計算標準偏差。所以,現在我正在尋找根據測量值調整參數的機制。有任何想法嗎?

Thanx。

PS:我知道,這是一個非常普遍的問題...

回答

5

正如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,這取決於s(a,b,c)如果在abc上做了少量修改,其變化速度有多快。

這不是最好的解決方案,但很容易嘗試動手的方法。

1

幸運的是有一些通用的解決方案。它應該是解決功能以最小化結果的問題。如果你有一個函數x = f(a,b,c),你想要找到一個給出最小值x的a,b,c。最簡單的方法是嘗試一個錯誤,但可以通過使用二分搜索和線性插值(假設拓撲相對簡單)來改進此方法。更復雜的方法但您可能不需要它們。

你知道實際功能是什麼嗎?如果它是一個純粹的標準差,你可以使a,b,c與之相同。平均值和您的標準偏差將爲0.

+0

我對我的參數(a,b和c)的標準偏差不感興趣。參數影響另一個值,我每10秒測量一次。我對這個值和每個時間間隔值的偏差感興趣。 –

0

如果您不知道f的任何內容,我想我會運行隨機樣本一段時間並查看結果。然後,您可以決定是否要進行梯度下降或其他操作。