Как использовать scipy.optimize с функцией массива? - PullRequest
0 голосов
/ 18 февраля 2019

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

Если я оптимизирую функцию только один раз, серия работает .

import numpy as np
from scipy.optimize import basinhopping
d = [1,2,3,4]   
cols = len(d) 
def simple_exp_smooth(inputs):
    ini,alpha = inputs
    f = np.full(cols,np.nan) 
    f[0] = ini
    for t in range(1,cols):
        f[t] = alpha*d[t-1]+(1-alpha)*f[t-1]           
    error = sum(abs(f[1:] - d[1:]))
    return error
func = simple_exp_smooth
bounds = np.array([(0,4),(0.0, 1.0)])
x0 = (1,0.1)
res = basinhopping(func, x0, minimizer_kwargs={'bounds': bounds},stepsize=0.1,niter=45)

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

def simple(inputs):
    a0,alpha  = inputs
    a = np.full([rows,cols],np.nan)
    a[:,0] = a0
    for t in range(1,cols):
        a[:,t] = alpha*d[:,t]+(1-alpha)*a[:,t-1]
    MAE = abs(d - a).mean(axis=1)/d.mean(axis=1)
    return sum(MAE)

d = np.array([[1,2,3,4],
              [10,20,30,40]])
rows, cols = d.shape

a0_bound = np.vstack((d.min(axis=1),d.max(axis=1))).T
a0_ini = d.mean(axis=1)
bounds = ([a0_bound,(0.0, 1.0)])
x0 = (a0_ini,0.2)
res = basinhopping(simple, x0, minimizer_kwargs={'bounds': bounds},stepsize=0.1)

Но теперь, показание по бассейну дает мне эту ошибку:

bounds = [(None if l == -np.inf else l, None if u == np.inf else u) for l, u in bounds]

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Есть ли какой-то способ для меня, чтобы использовать переход по бассейну, чтобы оптимизировать весь мой массив сразу вместо каждой строки по одномуодин

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