2017-12-09 15 views
0

this postに基づいて私はARIMAモデルでグリッドセーチを行うためにbruteを使用しようとしていますが、実行することはできません。私はこの原則の証拠を守っていますが、私は議論に間違っていますか?scipy.optimize.bruteを使用する

y = pd.DataFrame([0,1,4,9,16]) + 3 
def objfunc(coeffs, endog): 
    exp = coeffs[0] 
    const = coeffs[1] 
    print(exp, const, endog) 
    out = 0 
    for i in range(4): 
     out += i**exp + const 
    return out 

from scipy.optimize import brute 
grid = (slice(0, 2, 1), slice(3, 4, 1)) 
brute(objfunc, ranges=grid, args=y) 

(0, 3, 0) 
(0, 3, 0) 
(1, 3, 0) 
... 
TypeError: objfunc() takes exactly 2 arguments (1 given) 

私はこの問題を解決したら、私の目的は、それぞれ、(_、_、_)。このようなタプルいるためとseasonal_orderでこの機能を最適化するために、実際には、これ(_、_、_、12)。

def objfunc(coeffs, endog): 
    order = coeffs[0] 
    seasonal = coeffs[1] 
    fit = sm.tsa.statespace.SARIMAX(endog, trend='n', order=order, seasonal_order=seasonal).fit() 
    return fit.aic() 

EDIT:このコードは動作します(@sashaのおかげで)、変数名は、より明確であり、そして(私はエラー時に関数を最小化)、より理にかなっています。

import pandas as pd  
y = np.array([0,1,4,9,16]) + 3 #polynomial x^2+3 with x=0:4 
def objfunc(coeffs, *args): 
    arr = args[0]      # access first element of tuple: y 
    exp = coeffs[0]      #  assuming y should become endog 
    const = coeffs[1] 
    pol = [i**exp + const for i in range(len(y))] 
    print coeffs 
    return abs(sum(pol) - sum(arr)) 

from scipy.optimize import brute 
grid = (slice(1, 3, 1), slice(2, 5, 1)) 
resbrute = brute(objfunc, ranges=grid, args=(y,), full_output=True, finish=None) 
print("Best coeffs: {}".format(resbrute[0])) 
print("Score with best coeffs: {}".format(resbrute[1])) 
print("Grid: {}".format(resbrute[2].tolist())) 
print("Scores for grid: {}".format(resbrute[3].tolist())) 

答えて

1

コードは、すべての変数名で少し奇妙に見えます。 endog、y; yはエンドッグになる?タプル、オプションの

完全に機能を指定するために必要な任意の追加固定パラメータ:

しかし、次はおそらく正確にdocumentation

引数を次のアプローチ、です。

コード:

import pandas as pd 

y = pd.DataFrame([0,1,4,9,16]) + 3 
def objfunc(coeffs, *args): 
    endog = args[0]      # access first element of tuple: y 
    exp = coeffs[0]      #  assuming y should become endog 
    const = coeffs[1] 
    print(exp, const, endog) 
    out = 0 
    for i in range(4): 
     out += i**exp + const 
    return out 

from scipy.optimize import brute 
grid = (slice(0, 2, 1), slice(3, 4, 1)) 
brute(objfunc, ranges=grid, args=(y,)) # in general a tuple; first pos: y 
+1

は、あなたは正しい変数名です。私は自分の質問を編集し、あなたの答えを含めました。私はSARIMAXの仕事で私の最適化をすることができたと私はおそらくそれを投稿します。ありがとうございました – aless80

関連する問題