3

x_data に 3x2000 numpy 配列があり、y_data に 1x2000 numpy 配列があり、これをこの関数 regress に渡して回帰直線を取得します。それは正常に動作します。問題は、私がいくつかのバックテストを実行しようとしていて、1000 回回帰する必要がある 1000 の状況をテストしようとしているということです。これを実行するには約 5 分かかります。

変数を標準化しようとしましたが、高速化されていないようです。

fmin_powell と fmin_bfgs も簡単に試してみましたが、それが壊れたようです。

何か案は?ありがとう!

def regress(x_data, y_data, fg_spread, fg_line):

    theta = np.matrix(np.ones((1,x_data.shape[0]))*.11)
    hyp = lambda theta, x: 1 / (1 + np.exp(-(theta*x)))
    cost_hyp = lambda theta, x, y: ((np.multiply(-y,np.log10(hyp(theta,x)))) - \
                            (np.multiply((1-y),(np.log10(1-hyp(theta, x)))))).sum()

    theta = scipy.optimize.fmin(cost_hyp, theta, args=(x_data,y_data), xtol=.00001, disp=0)

    return hyp(np.matrix(theta),np.matrix([1,fg_spread, fg_line]).reshape(3,1))
4

1 に答える 1

2

numexprを使用して hyp と cost_hyp の計算を行い、評価を高速化します。関数の fmin ファミリは、さまざまなエントリに対してこれらの関数を何度も計算します。したがって、これらの関数のゲインは、最小化で直接報告されます。

たとえば、次のように置き換えます。

hyp = lambda theta, x: 1 / (1 + np.exp(-(theta*x)))

に:

hyp = lambda theta, x: numexpr.evaluate("1 / (1 + exp(-(theta*x)))")

Numexpr は、numpy 配列で動作することを意図しています。

于 2012-09-05T08:18:25.763 に答える