python - scipy.optimize.basinhopping 不调用accept_test。为什么?

标签 python scipy mathematical-optimization

我正在尝试使用 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/

相关文章:

python - 我如何弄清楚为什么 Python 在 Windows 7 64 位中抛出这个非描述性错误

python - scipy.signal.spectrogram 频率分辨率

wolfram-mathematica - Mathematica 中计算元素数量的最大化函数

python - 如何在循环过程中将 df 附加到另一个 df

python - 有没有办法在 Python 的多重继承对象中访问重写的方法?

python - 导入 matplotlib.pyplot 时的警告消息

python - 两个数组的高效匹配(KDTree的使用方法)

python - 比 python 中的嵌套循环更快的搜索方式

python - 更快的算法来定制给定的数学表达式

python - pip install xmltodict 不工作