我正在使用包numddifftools来计算多维函数的hessians(从R ^ n到R ^ n)。在更改代码以使用numpy数组而不是列表时,我发现这样做会破坏代码。具体做法是:
import numpy as np
import numdifftools as nd
def function(x):
out = np.zeros(2)
out[0] = x[0] - x[1]**2/2.0
return float(out[0])
tempHessian = nd.Hessian(function, method='complex')
tempHessian([0.4,0.4])
产生错误: ... \ Continuum \ Anaconda3 \ lib \ site-packages \ ipykernel_launcher.py:8:ComplexWarning:将复杂值转换为实际丢弃虚部
并给出零粗麻布。
然而,这个工作正常:
import numpy as np
import numdifftools as nd
def function(x):
return x[0] - x[1]**2/2.0
tempHessian = nd.Hessian(function, method='complex')
tempHessian([0.4,0.4])
任何想法可能是什么问题?谢谢!
答案 0 :(得分:0)
创建out
时如下:
out = np.zeros(2)
它的类型为numpy.float64
。您无法为此类数组指定复杂值。根据您使用的numpy版本,您将收到警告或错误。
用于数值微分的complex step method要求您的函数使用复杂值。强制out
为numpy.float64
会破坏该方法。使用float(out[0])
将返回值转换为浮点值也会破坏方法。
您可以尝试这样的事情:
def function(x):
out = np.zeros(2, dtype=x.dtype)
out[0] = x[0] - x[1]**2/2.0
return out[0]
这会创建out
,其数据类型与x
相同。因此,如果x
很复杂,则返回值也很复杂,正如复杂步骤方法所要求的那样。
(当然,当我们只使用第一个元素时,我们不知道为什么你创建out
大小为2。大概这是你正在使用的实际代码的简化。)< / p>