Я хотел бы написать ядро RBF, которое работает только в определенном диапазоне по оси X. Я попытался написать класс, содержащий ядро RBF, для проверки кода
class RangeLimitedRBFTest(Kernel):
def __init__(self, length_scale=1.0, length_scale_bounds=(1e-5, 1e5), x_min = 0., x_max = 1.):
self.length_scale = length_scale
self.length_scale_bounds = length_scale_bounds
self.rbf_kernel = RBF(length_scale, length_scale_bounds)
self.x_min = x_min
self.x_max = x_max
def __call__(self, X, Y=None, eval_gradient=False):
if eval_gradient and Y is not None:
raise ValueError("Gradient can only be evaluated when Y is None.")
X = np.atleast_2d(X)
if Y is not None:
Y = np.atleast_2d(Y)
print(f"X shape: {X.shape}")
if Y is not None:
print(f"Y shape: {Y.shape}")
else:
print("Y shape: None")
K_rbf = self.rbf_kernel(X, Y, eval_gradient=eval_gradient)
if eval_gradient:
K, K_grad = K_rbf
print(f"Kernel matrix shape (K): {K.shape}")
print(f"Kernel gradient matrix shape (K_grad): {K_grad.shape}")
return K, K_grad
else:
K = K_rbf
return K
def diag(self, X):
return self.rbf_kernel.diag(X)
def is_stationary(self):
return self.rbf_kernel.is_stationary()
X shape: (6248, 1)
Y shape: None
Kernel matrix shape (K): (6248, 6248)
Kernel gradient matrix shape (K_grad): (6248, 6248, 1)
ValueError: 0-th dimension must be fixed to 2 but got 3
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/tdaq/cremonini/pt100_probe/read_temperatures.py", line 97, in
gaussian_process.fit(X, T_PMT)
File "/home/tdaq/.local/lib/python3.10/site-packages/sklearn/base.py", line 1389, in wrapper
return fit_method(estimator, *args, **kwargs)
File "/home/tdaq/.local/lib/python3.10/site-packages/sklearn/gaussian_process/_gpr.py", line 308, in fit
self._constrained_optimization(
File "/home/tdaq/.local/lib/python3.10/site-packages/sklearn/gaussian_process/_gpr.py", line 653, in _constrained_optimization
opt_res = scipy.optimize.minimize(
File "/cvmfs/atlas.cern.ch/repo/sw/software/0.3/StatAnalysis/0.3.1/InstallArea/x86_64-el9-gcc13-opt/lib/python3.10/site-packages/scipy/optimize/_minimize.py", line 713, in minimize
res = _minimize_lbfgsb(fun, x0, args, jac, bounds,
File "/cvmfs/atlas.cern.ch/repo/sw/software/0.3/StatAnalysis/0.3.1/InstallArea/x86_64-el9-gcc13-opt/lib/python3.10/site-packages/scipy/optimize/_lbfgsb_py.py", line 360, in _minimize_lbfgsb
_lbfgsb.setulb(m, x, low_bnd, upper_bnd, nbd, f, g, factr,
ValueError: failed in converting 7th argument `g' of _lbfgsb.setulb to C/Fortran array
Если я попытаюсь использовать обычное ядро RBF, код будет работать без проблем. Я также попытался отключить оптимизаторOptimer=None, и код работает, но я получаю очень большую ошибку.
Я хотел бы написать ядро RBF, которое работает только в определенном диапазоне по оси X. Я попытался написать класс, содержащий ядро RBF, для проверки кода [code]class RangeLimitedRBFTest(Kernel): def __init__(self, length_scale=1.0, length_scale_bounds=(1e-5, 1e5), x_min = 0., x_max = 1.): self.length_scale = length_scale self.length_scale_bounds = length_scale_bounds self.rbf_kernel = RBF(length_scale, length_scale_bounds) self.x_min = x_min self.x_max = x_max
def __call__(self, X, Y=None, eval_gradient=False): if eval_gradient and Y is not None: raise ValueError("Gradient can only be evaluated when Y is None.")
X = np.atleast_2d(X) if Y is not None: Y = np.atleast_2d(Y)
print(f"X shape: {X.shape}") if Y is not None: print(f"Y shape: {Y.shape}") else: print("Y shape: None")
K_rbf = self.rbf_kernel(X, Y, eval_gradient=eval_gradient)
if eval_gradient: K, K_grad = K_rbf print(f"Kernel matrix shape (K): {K.shape}") print(f"Kernel gradient matrix shape (K_grad): {K_grad.shape}") return K, K_grad else: K = K_rbf return K
def diag(self, X): return self.rbf_kernel.diag(X)
def is_stationary(self): return self.rbf_kernel.is_stationary() [/code] Реализация и установка такая [code]kernel = 1.0 * RangeLimitedRBFTest(length_scale=0.1, length_scale_bounds=(8e-2, 8e-1), x_min=0., x_max=2.5) + WhiteKernel(noise_level=0.5, noise_level_bounds=(1e-2, 1e1)) gaussian_process = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=1, alpha=1e-5, optimizer='fmin_l_bfgs_b') gaussian_process.optimizer_kwargs = {"max_iter": 10000} gaussian_process.fit(X, T_PMT) [/code] Если я запущу код, я получу следующий результат [code]X shape: (6248, 1) Y shape: None Kernel matrix shape (K): (6248, 6248) Kernel gradient matrix shape (K_grad): (6248, 6248, 1) ValueError: 0-th dimension must be fixed to 2 but got 3
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File "/home/tdaq/cremonini/pt100_probe/read_temperatures.py", line 97, in gaussian_process.fit(X, T_PMT) File "/home/tdaq/.local/lib/python3.10/site-packages/sklearn/base.py", line 1389, in wrapper return fit_method(estimator, *args, **kwargs) File "/home/tdaq/.local/lib/python3.10/site-packages/sklearn/gaussian_process/_gpr.py", line 308, in fit self._constrained_optimization( File "/home/tdaq/.local/lib/python3.10/site-packages/sklearn/gaussian_process/_gpr.py", line 653, in _constrained_optimization opt_res = scipy.optimize.minimize( File "/cvmfs/atlas.cern.ch/repo/sw/software/0.3/StatAnalysis/0.3.1/InstallArea/x86_64-el9-gcc13-opt/lib/python3.10/site-packages/scipy/optimize/_minimize.py", line 713, in minimize res = _minimize_lbfgsb(fun, x0, args, jac, bounds, File "/cvmfs/atlas.cern.ch/repo/sw/software/0.3/StatAnalysis/0.3.1/InstallArea/x86_64-el9-gcc13-opt/lib/python3.10/site-packages/scipy/optimize/_lbfgsb_py.py", line 360, in _minimize_lbfgsb _lbfgsb.setulb(m, x, low_bnd, upper_bnd, nbd, f, g, factr, ValueError: failed in converting 7th argument `g' of _lbfgsb.setulb to C/Fortran array [/code] Если я попытаюсь использовать обычное ядро RBF, код будет работать без проблем. Я также попытался отключить оптимизаторOptimer=None, и код работает, но я получаю очень большую ошибку.