15

問題の概要: scipy.optimize.fmin_bfgs 最小化 (最適化) 関数を使用しようとすると、関数は

derphi0 = np.dot(gfk, pk) ValueError:行列が整列していません

エラー。私のエラー チェックによると、これは fmin_bfgs を介した最初の反復の最後 (値が返されるか、コールバックへの呼び出しの直前) で発生します。

構成: Windows Vista Python 3.2.2 SciPy 0.10 IDE = PyDev を使用した Eclipse

詳細な説明: 単純なロジスティック回帰の実装 (Octave から Python/SciPy への変換) のコストを最小限に抑えるために、scipy.optimize.fmin_bfgs を使用しています。基本的に、コスト関数はcost_arr関数と名付けられ、勾配降下はgradient_descent_arr関数にあります。

*cost_arr* と *gradient_descent_arr* が適切に機能し、すべての値が適切に返されることを手動でテストし、完全に確認しました。また、適切なパラメーターが *fmin_bfgs* 関数に渡されることを確認するテストも行いました。それにもかかわらず、実行すると ValueError: matrixs are notaligned が発生します。ソースレビューによると、正確なエラーは

def line_search_wolfe1 # Minpack の Wolfe 行と scipy パッケージで提供されるスカラー検索の関数。

特に、代わりにscipy.optimize.fminを使用すると、 fmin関数が最後まで実行されます。

正確なエラー:

ファイル "D:\Users\Shannon\Programming\Eclipse\workspace\SBML\sbml\LogisticRegression.py"、395 行目、fminunc_opt 内

optcost = scipy.optimize.fmin_bfgs(self.cost_arr, initialtheta, fprime=self.gradient_descent_arr, args=myargs, maxiter=maxnumit, callback=self.callback_fmin_bfgs, retall=True)   

ファイル "C:\Python32x32\lib\site-packages\scipy\optimize\optimize.py"、533 行目、fmin_bfgs old_fval,old_old_fval 内)
ファイル "C:\Python32x32\lib\site-packages\scipy\optimize\linesearch. py"、76 行目、line_search_wolfe1 derphi0 = np.dot(gfk, pk) ValueError: 行列が整列していません

次のように最適化関数を呼び出します: optcost = scipy.optimize.fmin_bfgs(self.cost_arr, initialtheta, fprime=self.gradient_descent_arr, args=myargs, maxiter=maxnumit, callback=self.callback_fmin_bfgs, retall=True)

これを修正するために数日を費やしましたが、 マトリックスが整列していないエラーの原因を特定できないようです。

補遺: 2012-01-08 私はこれにもっと取り組み、問題を絞り込んだようです (しかし、それらを修正する方法に困惑しています)。まず、fmin (fmin のみを使用) は、これらの関数 (コスト、勾配) を使用して機能します。第 2 に、手動実装 (fmin_bfgs を使用しない) で 1 回の反復でテストすると、コスト関数と勾配関数の両方が期待値を正確に返します。3 つ目は、optimize.linsearch にエラー コードを追加したところ、次の行の def line_search_wolfe1 でエラーがスローされたようです: derphi0 = np.dot(gfk, pk)。ここで、私のテストによると、 scipy.optimize.optimize pk = [[ 12.00921659] [ 11.26284221]]pk type = および scipy.optimize.optimizegfk = [[-12.00921659] [-11.26284221]]gfk type = 注: 私によるとテストでは、fmin_bfgs を介した最初の反復でエラーがスローされます (つまり、fmin_bfgs は単一の反復または更新を完了することさえありません)。

ガイダンスや洞察に感謝します。

以下の私のコード (ロギング、ドキュメントは削除されました): theta = 2x1 ndarray を想定 (実際: theta Info Size=(2, 1) Type = ) X = 100x2 ndarray を想定 (実際: X Info Size=(2, 100) Type = ) y = 100x1 ndarray と仮定します (実際: y Info Size=(100, 1) Type = )

def cost_arr(self, theta, X, y):

    theta = scipy.resize(theta,(2,1))         

    m = scipy.shape(X)

    m = 1 / m[1] # Use m[1] because this is the length of X
    logging.info(__name__ + "cost_arr reports m = " + str(m))         

    z = scipy.dot(theta.T, X) # Must transpose the vector theta               

    hypthetax = self.sigmoid(z)

    yones = scipy.ones(scipy.shape(y))

    hypthetaxones = scipy.ones(scipy.shape(hypthetax))

    costright = scipy.dot((yones - y).T, ((scipy.log(hypthetaxones - hypthetax)).T))

    costleft = scipy.dot((-1 * y).T, ((scipy.log(hypthetax)).T))


def gradient_descent_arr(self, theta, X, y):

    theta = scipy.resize(theta,(2,1)) 

    m = scipy.shape(X)

    m = 1 / m[1] # Use m[1] because this is the length of X

    x = scipy.dot(theta.T, X) # Must transpose the vector theta

    sig = self.sigmoid(x)

    sig = sig.T - y

    grad = scipy.dot(X,sig)

    grad = m * grad

    return grad

def fminunc_opt_bfgs(self, initialtheta, X, y, maxnumit):
    myargs= (X,y)

    optcost = scipy.optimize.fmin_bfgs(self.cost_arr, initialtheta, fprime=self.gradient_descent_arr, args=myargs, maxiter=maxnumit, retall=True, full_output=True)

    return optcost
4

2 に答える 2

0

現在の scipy バージョンでは、fprime 引数を渡す必要はありません。問題なく勾配を計算します。'minimize' fn を使用して、勾配を引数として指定せずにメソッドを 'bfgs' として渡すこともできます。

于 2016-12-08T19:52:59.987 に答える