2012-01-06 17 views
12

Vấn đề Tóm tắt: Khi cố gắng để sử dụng scipy.optimize.fmin_bfgs giảm thiểu (tối ưu hóa) chức năng, chức năng ném một lỗima trận không phải là aligned Lỗi: Python scipy fmin_bfgs

derphi0 = np.dot(gfk, pk) ValueError: matrices are not aligned

. Theo kiểm tra lỗi của tôi, điều này xảy ra ở cuối của lần lặp đầu tiên thông qua fmin_bfgs - ngay trước khi bất kỳ giá trị nào được trả lại hoặc bất kỳ cuộc gọi nào để gọi lại.

Cấu hình: Windows Vista Python 3.2.2 scipy 0.10 IDE = Eclipse với PyDev

Mô tả chi tiết: Tôi đang sử dụng scipy.optimize.fmin_bfgs để giảm thiểu chi phí của một thực hiện hồi quy logistic đơn giản (chuyển đổi từ Octave sang Python/SciPy). Về cơ bản, hàm chi phí được đặt tên hàm cost_arr và gốc gradient là trong hàm gradient_descent_arr.

Tôi đã kiểm tra và xác minh đầy đủ rằng * cost_arr * và * gradient_descent_arr * hoạt động đúng và trả về tất cả các giá trị đúng cách. Tôi cũng đã thử nghiệm để xác minh rằng các thông số thích hợp được chuyển tới hàm * fmin_bfgs *. Tuy nhiên, khi chạy, tôi nhận được ValueError: ma trận không được căn chỉnh. Theo đánh giá nguồn, lỗi chính xác xảy ra trong

def line_search_wolfe1 function in # Minpack's Wolfe line and scalar searches as supplied by the scipy packages.

Đáng chú ý là, nếu tôi sử dụng scipy.optimize.fmin thay vào đó, các fmin chức năng chạy đến khi kết thúc.

Lỗi chính xác:

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

tôi gọi là chức năng tối ưu hóa với: 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)

Tôi đã dành vài ngày để sửa lỗi này và dường như không thể xác định nguyên nhân gây ra ma trận không được liên kết lỗi.

BỔ SUNG: 2012-01-08 Tôi đã làm việc với điều này nhiều hơn và dường như đã thu hẹp các vấn đề (nhưng tôi không hiểu cách khắc phục chúng). Đầu tiên, fmin (chỉ sử dụng fmin) hoạt động bằng cách sử dụng các hàm này - chi phí, độ dốc. Thứ hai, các hàm chi phí và hàm gradient đều trả về chính xác các giá trị mong đợi khi được thử nghiệm trong một lần lặp đơn lẻ trong quá trình thực hiện thủ công (KHÔNG sử dụng fmin_bfgs). Thứ ba, tôi đã thêm mã lỗi để tối ưu hóa.linsearch và lỗi dường như được ném tại def line_search_wolfe1 trong dòng: derphi0 = np.dot (gfk, pk). Ở đây, theo thử nghiệm của tôi, scipy.optimize.optimize pk = [[12.00921659] [11.26284221]] pk type = và scipy.optimize.optimizegfk = [[-12.00921659] [-11.26284221]] gfk type = Lưu ý: theo các thử nghiệm của tôi, lỗi được ném vào lần lặp đầu tiên thông qua fmin_bfgs (tức là, fmin_bfgs thậm chí không bao giờ hoàn thành một lần lặp hoặc cập nhật đơn lẻ).

Tôi đánh giá cao BẤT CỨ hướng dẫn hoặc thông tin chi tiết.

Mã My Dưới (khai thác gỗ, tài liệu bị loại bỏ): Giả theta = 2x1 ndarray (Thực tế: theta Thông tin Kích thước = (2, 1) Gõ =) Giả sử X = 100x2 ndarray (Thực tế: X Thông tin Kích thước = (2 , 100) Gõ =) Giả sử y = 100x1 ndarray (thực tế: y Thông tin Kích thước = (100, 1) Gõ =)

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

Bạn có thể đăng một trường hợp đơn giản, súc tích mà người khác có thể chạy để tái tạo lỗi không? Có thể là một đối số bạn đang cung cấp ở dạng không chính xác, nhưng không nhìn thấy mã của bạn là gì, nó sẽ không thể giúp được. – talonmies

+0

'def gradient_descent_arr (tự, theta, X, y): theta = scipy.resize (theta, (2,1)) # Cung cấp các kích thước Octave của ma trận m = scipy.shape (X) m = 1/m [1] # Sử dụng m [1] vì đây là độ dài của X x = scipy.dot (theta.T, X) # Phải chuyển đổi vectơ theta sig = self.sigmoid (x) sig = sig.T - y grad = scipy.dot (x, sig) grad = m * grad trở lại grad' – SaB

+0

talonmies - Cảm ơn bạn. Tôi đã thêm mã vào bài đăng gốc. Mọi thông tin chi tiết sẽ được đánh giá cao. – SaB

Trả lời

16

Trong trường hợp bất cứ ai chạm trán khác vấn đề này ....

1) L ERI 1: Như đã lưu ý trong các chú thích, tôi đã trả về giá trị từ gradient của tôi một cách không chính xác như một mảng đa chiều (m, n) hoặc (m, 1). fmin_bfgs dường như yêu cầu một mảng đầu ra 1d từ gradient (nghĩa là, bạn phải trả về mảng (m,) và không phải là mảng (m, 1). Sử dụng scipy.shape (myarray) để kiểm tra kích thước nếu bạn không chắc chắn về fmin_bfgs

grad = numpy.ndarray.flatten(grad) 

ngay trước khi trở về gradient từ chức năng gradient này "flattens" mảng từ (m, 1) đến (m,) có thể: giá trị trả về

việc sửa chữa tham gia thêm...

2) LRI 2: Hãy nhớ rằng, các fmin_bfgs dường như làm việc với các hàm NON tuyến tính. Trong trường hợp của tôi, mẫu mà tôi đã làm việc ban đầu là một hàm LINEAR. Điều này dường như giải thích một số kết quả bất thường ngay cả sau khi sửa chữa phẳng nêu trên. Đối với các hàm LINEAR, fmin, thay vì fmin_bfgs, có thể hoạt động tốt hơn.

QED

+0

Có vẻ như 'fmin_ncg' cũng cần trả về gradient phẳng, (m, 1) cần phải được thay đổi thành (m,) – dashesy

0

Kể từ phiên bản scipy hiện tại bạn không cần vượt qua đối số fprime. Nó sẽ tính toán gradient cho bạn mà không có bất kỳ vấn đề. Bạn cũng có thể sử dụng 'minim' fn và pass method như 'bfgs' thay vì không cung cấp gradient làm đối số.