【问题标题】:class method as model function and class method as optimization function for scipy.optimize类方法作为模型函数和类方法作为 scipy.optimize 的优化函数
【发布时间】:2014-08-25 05:11:22
【问题描述】:

我正在使用 python 来解决优化问题。我想定义一个类来完成这项工作。在课堂上,我想使用模型函数作为类的方法,例如:

class MyClass(object):
      def f(self,x,parameters):

但我还想在同一个类中定义另一个方法,对 x 上的函数 f 进行优化,例如:

     def Optim_Funtion(self):
         scipy.optimize.minimize(f,x0,'method='Nelder-Mead')

我的问题是如何做到这一点?我必须在 Optim_Funtion 方法中将函数 f 作为 self.f 传递吗? 我发现了一个与此相关的问题,但他们将优化问题从类定义中取出: class method as a model function for scipy.optimize.curve_fit 这不是我想做的。

这里是我使用的代码:

class LaserGating:
# Given laser pulse energy and min photon number to be received at a detector, calculate the max distance  


def __init__(self, alpha, PhotonNumber, EnergyMin, EnergyMax, Wavelength,TargetReflection,d):

    self.alpha = alpha
    self.PhotonNumber = PhotonNumber # photon number @detector
    self.EnergyMax = EnergyMax # laser pulse energy max
    self.EnergyMin = EnergyMin # laser pulse energy Min
    self.Wavelength = Wavelength # laser wavelengh
    self.TargetReflection = TargetReflection # target reflection 
    self.d = d # detector size
    self.PhotonEnergy = 1.054e-34*2*np.pi*3.e8/self.Wavelength # energy of a photon at wavelength "Wavelength"
    self.PulseEnergy = self.EnergyMin 
    self.PulseEnergyRange = np.linspace(self.EnergyMin,self.EnergyMax,1000) # array of energy pulse values

    return


def fMin(self,x,PulseEnergy):
    # laser range model: x is the argument (distance) that the function is to be minimized on

    f = self.PhotonNumber - PulseEnergy*self.TargetReflection * ((self.d/x)**2)*np.exp(-self.alpha*x)/self.PhotonEnergy
    return f


def FindDistance(self):
    #find maximale distance given energy and photon number@ detector
    #print self.PulseEnergyRange
    rangeEnergy = self.PulseEnergyRange
    #print rangeEnergy
    testrange = []
    #for testeleements in rangeEnergy:
        #print testeleements

    for elements in rangeEnergy:

        #initial guess. Fixed for the moment but should depend on elements
        x0 = 10.
        #print elements
        # optimisation on x, using elements as arg
        test = scp.optimize.newton(self.fMin,x0,args = (elements,),tol= 1e-3)

        # append answer
        testrange.append(test)

    return testrange

当我运行它时,例如使用:

DistanceRange = LaserGating(0.001,1000,1.e-9,1.e-6,532.e-9,0.2,0.001)
DistanceRange.FindDistance()

我收到以下错误消息:

enter ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-199-597c7ff1bb69> in <module>()
 ----> 1 DistanceRange.FindDistance()

 <ipython-input-194-b1c115d544c0> in FindDistance(self)
 32             x0 = 1000.
 33 
 ---> 34             test = scp.optimize.minimize(self.fMin,x0,args =        (elements),method='Nelder-Mead',tol= 1e-2)
 35             testrange.append(test)
 36             print elements

 C:\Users\spinchip\AppData\Local\Continuum\Anaconda\lib\site-    packages\scipy\optimize\_minimize.pyc in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
411                       callback=callback, **options)
412     elif meth == 'nelder-mead':
--> 413         return _minimize_neldermead(fun, x0, args, callback, **options)
414     elif meth == 'powell':
415         return _minimize_powell(fun, x0, args, callback, **options)

C:\Users\spinchip\AppData\Local\Continuum\Anaconda\lib\site-  packages\scipy\optimize\optimize.pyc in _minimize_neldermead(func, x0, args, callback,   xtol, ftol, maxiter, maxfev, disp, return_all, **unknown_options)
436     if retall:
437         allvecs = [sim[0]]
--> 438     fsim[0] = func(x0)
439     nonzdelt = 0.05
440     zdelt = 0.00025

C:\Users\spinchip\AppData\Local\Continuum\Anaconda\lib\site-  packages\scipy\optimize\optimize.pyc in function_wrapper(*wrapper_args)
279     def function_wrapper(*wrapper_args):
280         ncalls[0] += 1
--> 281         return function(*(wrapper_args + args))
282 
283     return ncalls, function_wrapper

TypeError: fMin() takes exactly 3 arguments (2 given)code here

所以问题在于调用方法时无法识别的附加参数。

提前感谢您的任何建议,

格雷戈里

【问题讨论】:

  • 是的,self.f。你试过了吗?
  • 您好,感谢您的评论。使用你所说的似乎使方法试图做某事,但它没有认识到我有额外的参数要传递给优化。我用代码和错误消息编辑我的问题。

标签: python class optimization scipy


【解决方案1】:

传递args = (elements) 等价于args = elements,即不创建元组。

要传递 1 元素元组,请执行 args = (elements,)args = tuple([elements])

【讨论】:

  • 好的。感谢那份工作。我用现在似乎可以工作的东西再次编辑代码。如果这对某人来说很有趣,那么 scipy.optim.newton 是在这个特定问题中使用的正确方法,因为该函数没有最小值,但只能通过零。
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
相关资源
最近更新 更多