問題梗概: 當嘗試使用scipy.optimize.fmin_bfgs最小化(優化)函數,該函數將引發矩陣不對準錯誤:Python的SciPy的fmin_bfgs
derphi0 = np.dot(gfk, pk) ValueError: matrices are not aligned
錯誤。根據我的錯誤檢查,這發生在通過fmin_bfgs的第一次迭代的最後 - 即在返回任何值或調用回調函數之前。
配置: Windows Vista中 的Python 3.2.2 SciPy的0.10 IDE Eclipse的=與PyDev的
詳細說明: 我使用scipy.optimize.fmin_bfgs減少的成本簡單的邏輯迴歸實現(從Octave轉換到Python/SciPy)。基本上,成本函數被命名爲cost_arr函數,梯度下降在gradient_descent_arr函數中。
我已手動測試並充分驗證* cost_arr *和* gradient_descent_arr *正常工作並正確返回所有值。我也進行了測試,以驗證是否將正確的參數傳遞給了* fmin_bfgs *函數。不過,當運行時,我得到ValueError:矩陣不對齊。據有關人士回顧,在
def line_search_wolfe1 function in # Minpack's Wolfe line and scalar searches as supplied by the scipy packages.
出現確切的錯誤值得注意的是,如果我使用scipy.optimize.fmin相反,FMIN功能運行至完成。
確切的錯誤:
File "D:\Users\Shannon\Programming\Eclipse\workspace\SBML\sbml\LogisticRegression.py", line 395, in 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)
File "C:\Python32x32\lib\site-packages\scipy\optimize\optimize.py", line 533, in fmin_bfgs old_fval,old_old_fval)
File "C:\Python32x32\lib\site-packages\scipy\optimize\linesearch.py", line 76, in line_search_wolfe1 derphi0 = np.dot(gfk, pk) ValueError: matrices are not aligned
我打電話與優化功能: 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)使用這些函數 - 成本,漸變。其次,在手動實現(不使用fmin_bfgs)的單次迭代中測試時,成本函數和梯度函數都準確返回期望值。第三,我添加了錯誤代碼來優化.linsearch,並且錯誤似乎是在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 = 2×1 ndarray(實際:THETA信息大小=(2,1)類型=) 假設X = 100X2 ndarray(實際:X信息大小=(2 ,100)類型=) 假設Y = 100X1 ndarray(實際爲:y信息大小=(100,1)類型=)
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
你可以發佈一個簡單的,簡潔的案例,別人可以運行,重現錯誤?您提供的參數很可能是不正確的形式,但是沒有看到您的代碼做了什麼,將無法提供幫助。 – talonmies 2012-01-06 04:27:16
'DEF gradient_descent_arr(個體,θ,X,Y): THETA = scipy.resize(THETA,(2,1)) #給人的矩陣的八度大小 米= scipy.shape(X) m = 1/m [1]#使用m [1],因爲這是X的長度 x = scipy.dot(theT.T,X) x)的 SIG = sig.T - ý 研究所= scipy.dot(X,SIG) 研究所= M *畢業 return grad' – SaB 2012-01-08 20:59:56
talonmies - 謝謝。我將代碼添加到原始帖子中。任何見解,將不勝感激。 – SaB 2012-01-08 21:17:57