问题
The code below uses double integration with scipy.integrate.dblquad
to calculate the differential entropy, c*np.log(c)
, of a copula density function c
, which has one dependence parameter, theta
, usually positive. Formula can be found here.
import numpy as np
from scipy import integrate
def copula_entropy(theta):
c = lambda v, u: ((1+theta)*(u*v)**(-1-theta)) * (u**(-theta)
+ v**(-theta) -1)**(-1/theta-2)
return -integrate.dblquad(c*np.log(c), 0, 1, lambda u: 0, lambda u: 1)[0]
Calling the function with
copula_entropy(1)
returns the error
TypeError: loop of ufunc does not support argument 0 of type function which has no callable log method
How can the function be made to work?
回答1:
The first argument must be a callable, so just wrap it in a lambda
itself:
import numpy as np
from scipy import integrate
def copula_entropy(theta):
c = lambda v, u: ((1+theta)*(u*v)**(-1-theta)) * (u**(-theta)+v**(-theta)-1)**(-1/theta-2)
return -integrate.dblquad(lambda u,v: c(v,u)*np.log(c(v,u)), 0, 1, lambda u: 0, lambda u: 1)[0]
(Please note that I also changed the expression for c
according to the formula you gave).
来源:https://stackoverflow.com/questions/65661541/double-integration-of-xnp-logx-in-python-using-scipy-integrate-dblquad