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
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
'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
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