2016-09-20 81 views
4

SciPy的我有四個功能,象徵性地與Sympy計算,然後lambdified:優化從sympy

deriv_log_s_1 = sym.lambdify((z, m_1, m_2, s_1, s_2), deriv_log_sym_s_1, modules=['numpy', 'sympy']) 
deriv_log_s_2 = sym.lambdify((z, m_1, m_2, s_1, s_2), deriv_log_sym_s_2, modules=['numpy', 'sympy']) 
deriv_log_m_1 = sym.lambdify((z, m_1, m_2, s_1, s_2), deriv_log_sym_m_1, modules=['numpy', 'sympy']) 
deriv_log_m_2 = sym.lambdify((z, m_1, m_2, s_1, s_2), deriv_log_sym_m_2, modules=['numpy', 'sympy']) 

從這些功能,我定義了一個成本函數進行優化:

def cost_function(x, *args): 

    m_1, m_2, s_1, s_2 = x  

    print(args[0])  

    T1 = np.sum([deriv_log_m_1(y, m_1, m_2, s_1, s_2) for y in args[0]]) 
    T2 = np.sum([deriv_log_m_2(y, m_1, m_2, s_1, s_2) for y in args[0]]) 


    T3 = np.sum([deriv_log_m_1(y, m_1, m_2, s_1, s_2) for y in args[0]]) 
    T4 = np.sum([deriv_log_m_1(y, m_1, m_2, s_1, s_2) for y in args[0]]) 

    return T1 + T2 + T3 + T4 

我的功能cost_function作品如預期的那樣:

a = 48.7161 
b = 16.3156 
c = 17.0882 
d = 7.0556 
z = [0.5, 1, 2, 1.2, 3] 

test = cost_function(np.array([a, b, c, d]).astype(np.float32), z) 

但是,當我嘗試優化我T:

from scipy.optimize import fmin_powell 

res = fmin_powell(cost_function, x0=np.array([a, b, c, d], dtype=np.float32), args=(z,)) 

它提出了以下錯誤:

AttributeError: 'Float' object has no attribute 'sqrt' 

我不明白爲什麼這樣的錯誤單獨出現作爲我cost_function不會引發任何錯誤。

回答

2

的解決方案是,我不知道爲什麼,投投入numpy.float:

m_1 = np.float32(m_1) 
m_2 = np.float32(m_2) 
s_1 = np.float32(s_1) 
s_2 = np.float32(s_2) 
+0

一般情況下,它是通過numpy的陣列lambdified功能是一個好主意。這將在下一個SymPy版本中自動完成(請參閱https://github.com/sympy/sympy/pull/11312)。 – asmeurer