Python sympy在scipy中的优化
我有四个函数,用symphy符号计算,然后进行lambdified:Python sympy在scipy中的优化,python,numpy,scipy,sympy,Python,Numpy,Scipy,Sympy,我有四个函数,用symphy符号计算,然后进行lambdified: 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
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\u功能
按预期工作:
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)
但是,当我尝试优化它时:
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\u函数本身不会产生任何错误。解决方案是,我不知道为什么,将输入转换为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)
一般来说,将numpy数组传递给lambdified函数是一个好主意。这将在下一个Symphy版本中自动完成(请参阅)。