【问题标题】:Can scipy.optimize minimize functions of complex variables at all and how?scipy.optimize 可以完全最小化复杂变量的函数吗?如何最小化?
【发布时间】:2018-12-15 02:26:28
【问题描述】:

我正在尝试使用scipy.optimize 最小化复杂(向量)变量的函数。到目前为止,我的结果表明这可能是不可能的。为了研究这个问题,我实现了一个简单的例子 - 最小化具有偏移量的复向量的 2-范数:

import numpy as np
from scipy.optimize import fmin

def fun(x):
    return np.linalg.norm(x - 1j * np.ones(2), 2)

sol = fmin(fun, x0=np.ones(2) + 0j)

输出是

Optimization terminated successfully.
         Current function value: 2.000000
         Iterations: 38
         Function evaluations: 69

>>> sol
array([-2.10235293e-05,  2.54845649e-05])

显然,解决方案应该是

array([0.+1.j, 0.+1.j])

对这个结果很失望,我也试过scipy.optimize.minimize

from scipy.optimize import minimize

def fun(x):
    return np.linalg.norm(x - 1j * np.ones(2), 1)

sol = minimize(fun, x0=np.ones(2) + 0j)

输出是

>>> sol
      fun: 2.0
 hess_inv: array([[ 9.99997339e-01, -2.66135332e-06],
       [-2.66135332e-06,  9.99997339e-01]])
      jac: array([0., 0.])
  message: 'Optimization terminated successfully.'
     nfev: 24
      nit: 5
     njev: 6
   status: 0
  success: True
        x: array([6.18479071e-09+0.j, 6.18479071e-09+0.j])

也不好。我已经尝试为minimize 指定所有可能的方法(根据需要提供雅可比和黑森),但它们都没有达到正确的结果。多数导致ComplexWarning: Casting complex values to real discards the imaginary part,说明无法正确处理复数。

这可能使用scipy.optimize吗?

如果是这样,如果有人能告诉我我做错了什么,我将非常感激。

如果没有,您是否对允许这样做的替代优化工具(用于 Python)有建议?

【问题讨论】:

    标签: python scipy mathematical-optimization


    【解决方案1】:

    SciPy 的最小化方法仅适用于实际参数。但是在复数空间 Cn 上的最小化等于在 R2n 上的最小化,复数的代数从不考虑。因此,添加两个包装器用于从 Cn 到 R2n 的转换并返回,您可以优化复数。

    def real_to_complex(z):      # real vector of length 2n -> complex of length n
        return z[:len(z)//2] + 1j * z[len(z)//2:]
    
    def complex_to_real(z):      # complex vector of length n -> real of length 2n
        return np.concatenate((np.real(z), np.imag(z)))
    
    sol = minimize(lambda z: fun(real_to_complex(z)), x0=complex_to_real(np.ones(2) + 0j))
    print(real_to_complex(sol.x))   # [-7.40376620e-09+1.j -8.77719406e-09+1.j]
    

    您提到 Jacobian 和 Hessian ......但最小化只对实值函数有意义,并且这些函数对于复变量永远不可微。无论如何,雅可比矩阵和黑森矩阵都必须在 R2n 上计算,将实部和虚部视为单独​​的变量。

    【讨论】:

    • 我不确定我是否完全理解:你是说如果 $x$ 和/或 $c$ 很复杂,我不能最小化 $\|x - c\|_2$?复向量的范数对我来说似乎很有意义,因此这个小例子的最小化器是 $x = c$。
    • 我不是这么说的。我是说被最小化的函数是 f(x) = ||x-c||,它是实值,因此在复数意义上不可微。
    • 您可能想要查找 Wirtingel 导数。在mediatum.ub.tum.de/doc/631019/631019.pdf 中,作者解释说,“由于非平凡实值函数不是解析的,因此无法通过搜索导数 f 的点 z 来获得实值 f(z) 的驻点。 '(z) 为零。但是,我们可以通过消失微分 df 检测 f(z) 的静止点 z。至于复变量中的优化算法,可以看这篇文章:epubs.siam.org/doi/abs/10.1137/110832124?mobileUi=0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2021-04-08
    相关资源
    最近更新 更多