我試圖優化使用scipy basinhopping算法的函數的輸出。scipy.optimize.basinhopping不會調用accept_test。爲什麼?
def acceptance_criteria(self,**kwargs):
print "kwargs "
print kwargs
x = kwargs["x_new"]
beta = x[0]
alpha = [x[1],x[2],x[3],x[4],x[5],x[6]]
print x
inputnow= raw_input()
beta_gamma_pass = beta != self.gamma
beta_zero_pass = beta >= 0.0
alpha1_pass = alpha[0] > 0.0
alpha2_pass = alpha[1] > 0.0
alpha3_pass = alpha[2] > 0.0
alpha4_pass= alpha[3] > 0.0
alpha5_pass= alpha[4] > 0.0
alpha6_pass= alpha[5] > 0.0
return beta_gamma_pass,beta_zero_pass,alpha1_pass,alpha2_pass,alpha3_pass,alpha4_pass,alpha5_pass,alpha6_pass
def variational_calculation(self):
minimizer_kwargs = {"method": "BFGS"}
initial_paramater_guesses = [2,1.0,1.0/2.0,1.0/3.0,1.0/4.0,1.0/5.0,1.0/6.0]
ret = basinhopping(self.Calculate, initial_paramater_guesses, minimizer_kwargs=minimizer_kwargs, niter=200, accept_test=self.acceptance_criteria)
我在計算函數中遇到了Nans和infs的問題。 這是由於使用的參數值無效。 我試圖通過使用驗收標準來防止這種情況。 但流域購買例程不會調用accept_test函數。 因此,標準保持不變。
任何人都可以幫我解釋爲什麼流域購買不會調用accept_test函數嗎?
感謝
編輯: 響應@薩沙的評論, 有參數的分數冪,並且在功能1 /參數方面。 在這種情況下,不限制允許參數值的範圍會給出複數和inf值。 它實際上是一個特徵值問題,我試圖最小化一組18 * 18矩陣的特徵值的軌跡。 矩陣元素以複雜的方式依賴於7個參數,並帶有數十個非線性項。
我從來沒有做過比多項式迴歸更復雜的任何事情,所以我不熟悉算法或它們的適用性。 但是,只要避免極點附近的參數值,我試圖最小化的函數是平滑的;由1 /參數和1 /(參數n常數)項引起。
EDIT2: 問題澄清 這裏的問題與流域購物算法的適用性無關。
這就是爲什麼它的具體實現,在Python版本的Python和scipy,沒有調用accept_test函數?
也許是因爲它之前破了?您的函數是否符合此算法的有效函數?如果有nan和inf,我想它是不光滑的?盆地購物不是爲此而建! – sascha
你是什麼意思「之前破碎」? –
我不確定,你的錯誤是什麼。你說過,一些回調沒有被調用。我不知道在調用這個回調之前,你的算法是否以某種錯誤狀態結束。這就是我想說的。另外:'''然而,我試圖最小化的函數是平滑的,只要你避免極點附近的參數值對我來說聽起來很不光滑:-)。我不熟悉特徵值問題,但其中一些問題在數值問題方面很麻煩。我認爲你應該堅持一些更簡單的本地優化器,並檢查它們是否正常工作 – sascha