2012-01-06 45 views
12

問題梗概: 當嘗試使用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 
+0

你可以發佈一個簡單的,簡潔的案例,別人可以運行,重現錯誤?您提供的參數很可能是不正確的形式,但是沒有看到您的代碼做了什麼,將無法提供幫助。 – talonmies 2012-01-06 04:27:16

+0

'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

+0

talonmies - 謝謝。我將代碼添加到原始帖子中。任何見解,將不勝感激。 – SaB 2012-01-08 21:17:57

回答

16

如果任何人遇到這個問題....

1 )錯誤1:如註釋中所述,我錯誤地將我的漸變中的值作爲多維數組(m,n)或(m,1)返回。 fmin_bfgs似乎需要梯度的1d數組輸出(也就是說,您必須返回一個(m,)數組而不是(m,1)數組。使用scipy.shape(myarray)檢查維度,如果您不確定返回值

的修復涉及添加:。

grad = numpy.ndarray.flatten(grad) 

只是從你的梯度函數返回梯度之前,此 「變平」,從(M,1)至(m)陣列fmin_bfgs可以以此作爲輸入

2)錯誤2:請記住,fmin_bfgs似乎與非線性函數一起工作。就我而言,我最初使用的樣本是LINEAR函數。這似乎解釋了一些異常結果,即使在上面提到的平坦修復之後。對於LINEAR函數,fmin而不是fmin_bfgs可能更好。

QED

+0

似乎'fmin_ncg'也需要平滑的漸變返回,(m,1)需要改爲(m,) – dashesy 2013-07-30 16:49:47

0

截至目前SciPy的版本中,你不需要通過fprime說法。它會毫無問題地爲你計算梯度。您也可以使用'最小化'fn並將方法傳遞爲'bfgs',而不提供漸變作爲參數。