Я пытаюсь минимизировать функциональную часть одного из моих классов, и я продолжаю получать эту ошибку.
Expected 2D array, got 1D array instead:
array=[0.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
Вот мой код:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 28 10:05:24 2020
@author: nathan
"""
import numpy as np
from scipy.stats import norm
from scipy.optimize import minimize
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import ExpSineSquared
# BO on a hypersquare of R^d
class BO:
def __init__(self, f, noise_model = None,
acquisition = "ei", stop_criteria = 100, gpr = None, ):
self.funct_to_opt = f
if gpr == None : #default gaussian process initialisation
gp_kernel = ExpSineSquared(1.0, 5.0, periodicity_bounds=(1e-2, 1e1))
gpr = GaussianProcessRegressor(kernel=gp_kernel)
self.gpr = gpr
self.acquisition = acquisition
self.X = []
self.y = []
self.noise_model = noise_model
self.stop_criteria = stop_criteria
def __query(self, x) :
return self.funct_to_opt(x) #TODO
def __acquisition_EI(self, x):
tau = np.max(self.y)
mu, sig = self.gpr.predict(x, return_std = True) #std or cov ??
return (mu - tau)*norm.cdf((mu - tau)/sig) + sig*norm.pdf((mu - tau)/sig)
def __maximise_acquisition(self, x0) :
opt_res = minimize(fun = self.__acquisition_EI, x0 = x0)
return opt_res.x
def opt(self, x0):
#if prior mean is fixed, using a gaussian process,
#the first point can just be sampled uniformly randomly.
self.X.append(x0)
y0 = self.funct_to_opt(x0)
self.y.append(y0)
for i in range(self.stop_criteria):
self.gpr.fit(self.X,self.y)
x = self.__maximise_acquisition(x0)
self.X.append(x)
return 0 #TODO
bo = BO(np.sin)
bo.opt([0])
конкретно, эта строка вызывает проблему:
opt_res = minimize(fun = self.__acquisition_EI, x0 = x0)
Я думаю, это будет работать, потому что без класса вы можете использовать минимизацию со скалярными значениями, как в этом очень простом коде:
from scipy.optimize import minimize
def f(x):
return (x - 2) * x * (x + 2)**2
res = minimize(f,0)
Можете ли вы сказать мне, что идти с использованием минимизации с методами?