2012-03-20 23 views
10

Khi sử dụng scipy.optimize 's fmin Tôi nhận được một lỗi tôi không hiểu:scipy tối ưu hóa fmin ValueError: thiết lập một phần tử mảng với một chuỗi

ValueError: setting an array element with a sequence. 

Dưới đây là một đơn giản squared ví dụ để chứng minh lỗi:

import numpy as np 
from scipy.optimize import fmin 

def cost_function(theta, X, y):  
    m = X.shape[0] 
    error = X.dot(theta) - y 
    J = 1/(2*m) * error.T.dot(error) 
    return J 

X = np.array([[1., 1.], 
       [1., 2.], 
       [1., 3.], 
       [1., 4.]]) 

y = np.array([[2],[4],[6],[8]]) 
initial_theta = np.ones((X.shape[1], 1)) * 0.01 

# test cost_function 
print cost_function(initial_theta, X, y) 
# [[ 14.800675]] seems okay... 

# but then error here... 
theta = fmin(cost_function, initial_theta, args=(X, y)) 

#Traceback (most recent call last): 
# File "C:\Users\me\test.py", line 21, in <module> 
# theta = fmin(cost_function, initial_theta, args=(X, y)) 
# File "C:\Python27\lib\site-packages\scipy\optimize\optimize.py", line 278, in fmin 
# fsim[0] = func(x0) 
#ValueError: setting an array element with a sequence. 

Tôi rất biết ơn vì bất kỳ trợ giúp nào để giải thích nơi tôi sai.

+3

Bạn đang trả về một mảng cho hàm chi phí và 'fmin' dự kiến ​​một giá trị duy nhất. Hoặc trả về 'J [0,0]' hoặc viết lại hàm chi phí của bạn là 'J = 1/(2 * m) * np.sum (lỗi ** 2)' –

Trả lời

5

Lý do là điểm bắt đầu (initial_theta) mà bạn đã cung cấp cho fmin không phải là mảng 1D mà là mảng 2D. Vì vậy, trên một giây thứ hai fmin đi qua một mảng 1D (đó là cách nó phải làm việc) và kết quả trở thành phi vô hướng.

Vì vậy, bạn nên cấu trúc lại hàm chi phí của mình để chấp nhận mảng 1d làm đối số đầu tiên.

Thay đổi đơn giản nhất là làm cho mã hoạt động là làm phẳng initial_theta trước khi chuyển đến fmin và định hình lại theta bên trong cost_function thành (X.shape [1], 1) nếu bạn muốn.

+0

Cảm ơn lời giải thích. Vâng, số lượng kích thước đã gây nhầm lẫn cho tôi. Vì vậy, bây giờ tôi đã thiết lập ban đầu cả theta và y thành một mờ, và giá trị trả về hàm chi phí hoạt động như một vô hướng mà không cần điều chỉnh thêm. Chúc mừng. – Kim

2

cost_function phải trả lại vô hướng, nhưng giá trị trả về của bạn J là một mảng thuộc loại nào đó.

Các vấn đề liên quan