問題の概要: 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