python - 将附加参数传递给 numdifftools Hessian
问题描述
我想获得以下函数的Hessian:
def llik_scalars(param_vector, *args):
Fsc = param_vector[0]
Qsc = param_vector[1]
Rsc = param_vector[2]
y = args[0]
burnin = args[1]
F = np.matrix(Fsc)
Q = np.matrix(Qsc)
R = np.matrix(Rsc)
predstate, predp, _, _ = kalmanfilter(F=F, Q=Q, R=R, y=y, plot = False)
T = len(predp)
predstate = np.array([predstate[t].item() for t in range(len(predstate))])
predp = np.array([predp[t].item() for t in range(len(predp))])
Sigmat = predp + Rsc
Mut = predstate
LL = 0
for t in range(burnin, T):
exponent = -0.5 * (y[t]-Mut[t])**2 / Sigmat[t]
cc = 1 / math.sqrt(2*math.pi*Sigmat[t])
LL -= math.log(cc*math.exp(exponent))
return LL
我正在尝试使用 numdifftools 包的 Hessian 函数来做到这一点。在文档中,我找到了以下信息。例如,如果您想要定义为 Rosen 的 Rosenbrock 函数的 hessian,则 hessian 的计算方式如下:
> H = nd.Hessian(rosen)([1, 1])
在点 [1,1] 计算 Hessian 的地方
按照文档,应该可以为 Hessian 函数提供参数:
class Hessian(f, step=None, method=’central’, order=2, full_output=False, **step_options)
Parameters
fun [function] function of one array fun(x, *args, **kwds)
我通过以下方式进行了尝试:
hess = nd.Hessian(kf.llik_scalars(themin.x, (y,burnin)))(themin.x)
themin.x 是我要评估 Hessian 的点。
themin.x
Out[49]: array([0.67605231, 0.7457089 , 0.72205726])
运行上述代码时出现的错误:
burnin = args[1]
IndexError: tuple index out of range
我不明白元组如何超出范围
解决方案
如果没有完整的函数和参数,调试你的调用有点困难,这就是为什么我只是用这个rosen
函数做了一个简单的例子。
我添加了两个伪造的附加参数并命名了新函数rosen_ext
。
将 numdifftools 导入为 nd 将 numpy 导入为 np
def rosen(x):
return (1-x[0])**2 + 105.*(x[1]-x[0]**2)**2
def rosen_ext(x, *args):
y = args[0]
burnin = args[1]
print(y)
print(burnin)
return (1-x[0])**2 + 105.*(x[1]-x[0]**2)**2
以您的方式调用Hessian
for时,我可以重现您的错误rosen_ext
。
x = [2, 2] 中的Hessian
forrosen
应该是
[[4202. -840.]
[-840. 210.]]
要获得此结果,rosen_ext
您需要像这样调用它:
# call of the Hessian for the modified rosen in some point X = [2, 2]
H = nd.Hessian(rosen_ext)([2, 2], 2, 3)
print(H)
它返回一堆 2 和 3(有助于查看附加参数是否以正确的方式放置)和正确答案。
2
3
...
2
3
2
3
2
3
[[4202. -840.]
[-840. 210.]]
使用这种方法我会假设你的电话应该是这样的:
hess = nd.Hessian(kf.llik_scalars)(themin.x, y, burnin)
我无法调试它,所以请您检查它是否有效?
推荐阅读
- java - 我想调整位图大小而不在我的设备上创建新图像
- google-apps-script - 制止来自我们领导团队的虚假电子邮件......我如何部署我的脚本?
- jquery - 在 jQuery 悬停中访问相同的元素
- python-3.x - 使用 django 在下拉列表中填充字典值
- mysql - 在 Django 中的两个字段上指定 UniqueConstraint 是否很昂贵?
- python - 在 10*10 矩阵中生成随机字母
- javascript - 如何使用 onchange 更改使用 jquery 显示(显示/隐藏)的列表?
- multithreading - 将变量的引用发送到线程 C++
- python - Selenium 单击下一步按钮会产生 selenium.common.exceptions.ElementClickInterceptedException
- python - 初学python3关于elif语句语法和print_function使用的问题