情況: 我目前正在開發基於規則的Java應用程序。每條規則都有3個數字參數來影響數據庫通信。我正在測量一個值,該值受此規則的影響並計算測量值的標準偏差。標準偏差應儘可能小。自動調整3個參數以最小化標準差
問題: 我想知道是否可以做到這一點自動化?我已經可以自動啓動測試場景,並且可以自動計算標準偏差。所以,現在我正在尋找根據測量值調整參數的機制。有任何想法嗎?
Thanx。
PS:我知道,這是一個非常普遍的問題...
情況: 我目前正在開發基於規則的Java應用程序。每條規則都有3個數字參數來影響數據庫通信。我正在測量一個值,該值受此規則的影響並計算測量值的標準偏差。標準偏差應儘可能小。自動調整3個參數以最小化標準差
問題: 我想知道是否可以做到這一點自動化?我已經可以自動啓動測試場景,並且可以自動計算標準偏差。所以,現在我正在尋找根據測量值調整參數的機制。有任何想法嗎?
Thanx。
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
,這取決於s(a,b,c)
如果在a
,b
或c
上做了少量修改,其變化速度有多快。
這不是最好的解決方案,但很容易嘗試動手的方法。
幸運的是有一些通用的解決方案。它應該是解決功能以最小化結果的問題。如果你有一個函數x = f(a,b,c),你想要找到一個給出最小值x
的a,b,c。最簡單的方法是嘗試一個錯誤,但可以通過使用二分搜索和線性插值(假設拓撲相對簡單)來改進此方法。更復雜的方法但您可能不需要它們。
你知道實際功能是什麼嗎?如果它是一個純粹的標準差,你可以使a,b,c與之相同。平均值和您的標準偏差將爲0.
如果您不知道f
的任何內容,我想我會運行隨機樣本一段時間並查看結果。然後,您可以決定是否要進行梯度下降或其他操作。
我對我的參數(a,b和c)的標準偏差不感興趣。參數影響另一個值,我每10秒測量一次。我對這個值和每個時間間隔值的偏差感興趣。 –