ошибка с scipy свести к минимуму, ожидать 2d массив - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь минимизировать функциональную часть одного из моих классов, и я продолжаю получать эту ошибку.

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)

Можете ли вы сказать мне, что идти с использованием минимизации с методами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...