2014-03-14 47 views
1

是否有可能在SciPy中使用實例方法作爲可調用函數,例如scipy.optimize.minimize?是否可以使用實例方法作爲scipy的可調用對象?

我有幾個變體的狀態空間模型定義在不同的類中,都是從父類「KalmanFilterModel」類派生的。每個子類都定義了自己的filter()實例方法(KalmanFilterModel,但在此處未顯示)。

我想要做的是編寫一個實例方法,通過最大似然估計模型的參數。

下面是代碼我有一個片段:

class KalmanFilterModel: 
    def estimate_parameters(self, obs, x0=None): 

     self._obs = obs 

     if x0 is None: 
      x0 = np.array([0.5, 0.7, 1.0]) 

     result = minimize(fun=self._minimization, x0=x0, 
          options={'maxiter': 300}) 

     return result 

    def _minimization(self, x): 
     # Function to minimize when estimating parameters. 
     self.eta = x[0] 
     self.mu = x[1] 
     self.inverse_beta = x[2] 


     return -self.filter(self._obs) 

然而,當我嘗試運行它,我得到以下錯誤:

TypeError: unsupported operand type(s) for /: 'set' and 'float' 

是否有可能在所有使用這種情況下的實例方法,如果是這樣的話,最好的方法是什麼?

+4

它應該工作得很好。你可能有一些其他的錯誤。確保所有函數簽名匹配他們應該的內容,然後查找您想要用浮點數分隔集合的部分。 – user2357112

+0

你說得對,當我將'filter'函數的返回類型從dict改爲float時,我的部分是一個愚蠢的錯字我離開了'{}'圍繞着float變量。 – vgregoire

回答

0

是的。

In [4]: class F(object): 
    ...:  def meth(self, x): 
    ...:   return (x-1.)**2 
    ...:  

In [5]: ff = F() 

In [6]: minimize(ff.meth, 2.) 
Out[6]: 
    status: 0 
    success: True 
    njev: 3 
    nfev: 9 
hess_inv: array([[1]]) 
     fun: 1.3877787807814457e-17 
     x: array([ 1.]) 
    message: 'Optimization terminated successfully.' 
     jac: array([ 2.23517418e-08]) 
相關問題