我正在尝试使用 scipy basinhopping 优化函数的输出算法。
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函数。 因此,该标准仍未实现。
任何人都可以帮我解释为什么 basshopping 没有调用 Accept_test 函数吗?
谢谢
编辑: 回应@sascha的评论, 函数中有参数的分数幂和 1/参数项。 在这种情况下,不限制允许的参数值的范围给出了complex 和inf 值。 这实际上是一个特征值问题,我试图最小化一组 18*18 矩阵的特征值的迹。 矩阵元素以包含数十个非线性项的复杂方式依赖于 7 个参数。
我以前从未研究过比多项式回归更复杂的东西,所以我根本不熟悉这些算法或其适用性。 然而,只要避免参数值接近极点,我试图最小化的函数就是平滑的;由 1/parameter 和 1/(paramter^n -constant) 项引起。
编辑2: 问题澄清 这里的问题与basinhopping算法的适用性无关。
那为什么它的具体实现,在2.7版本的python和scipy中,没有调用accept_test函数呢?
最佳答案
我不能说为什么你的例子不起作用,但这里有一个类似但最小的例子,它确实调用了accept_test,也许你可以发现差异
import scipy
import numpy as np
from scipy.optimize import basinhopping
class MyClass:
def Calculate(self, x):
return np.dot(x, x)
def acceptance_criteria(self, **kwargs):
print("in accept test")
return True
def run(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)
my_class = MyClass()
my_class = my_class.run()
关于python - scipy.optimize.basinhopping 不调用accept_test。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39963601/