【问题标题】:Optimization in scipy from sympy来自 sympy 的 scipy 优化
【发布时间】:2017-01-28 05:52:26
【问题描述】:

我有四个用 Sympy 符号计算的函数,然后进行 lamdified:

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)

但是,当我尝试优化它时:

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 单独不会引发任何错误。

【问题讨论】:

    标签: python numpy scipy sympy


    【解决方案1】:

    解决方案是,我不知道为什么,将输入转换为 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函数是个好主意。这将在下一个 SymPy 版本中自动完成(请参阅github.com/sympy/sympy/pull/11312)。
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2012-10-08
    • 2022-01-11
    • 2020-08-25
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多