code: def numerical_gradient(X, Y, kernel, step_size=1e-4):
      grad = []
      for y in Y:
          num_grad = optimize.approx_fprime(
              X, kernel_X_Y, step_size, y, kernel
          )
          grad.append(num_grad)
      return np.asarray(grad)
  
imports: import numpy
  from scipy import optimize
  from scipy.spatial.distance import pdist, squareform
  from numpy.testing import assert_array_almost_equal
  from numpy.testing import assert_array_equal
  import pytest
  from skopt.learning.gaussian_process import GaussianProcessRegressor
  from skopt.learning.gaussian_process.kernels import ConstantKernel
  from skopt.learning.gaussian_process.kernels import DotProduct
  from skopt.learning.gaussian_process.kernels import ExpSineSquared
  from skopt.learning.gaussian_process.kernels import HammingKernel
  from skopt.learning.gaussian_process.kernels import Matern
  from skopt.learning.gaussian_process.kernels import RationalQuadratic
  from skopt.learning.gaussian_process.kernels import RBF
  from skopt.learning.gaussian_process.kernels import WhiteKernel
label_desc: Use image node_id 3 for calling a global function with example usage: numerical_gradient(X, Y, kernel, step_size) and returns: np