2012-03-20 79 views
10

当使用scipy.optimizefmin我得到一个错误,我不明白:SciPy的优化FMIN ValueError异常:设置一个数组元素与序列

ValueError: setting an array element with a sequence. 

这里有一个简单的误差平方的例子来演示:

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. 

我会很感激任何帮助来解释我哪里出错了。

+3

您正在为成本函数返回一个数组,而'fmin'只需要一个值。返回'J [0,0]'或者重写成本函数为'J = 1 /(2 * m)* np.sum(error ** 2)' – 2012-03-20 00:43:23

回答

5

原因是您给fmin的起点(initial_theta)不是一维数组,而是二维数组。因此,在第二次迭代中,fmin传递一维数组(这是它应该如何工作的),结果变成非标量。

所以你应该重构你的成本函数来接受1d数组作为第一个参数。

最简单的变化就是让代码工作在传递给fmin之前将initial_theta弄平,并在cost_function中将theta重构为(X.shape [1],1)如果你喜欢的话。

+0

感谢您的解释。是的,维度的数量令我感到困惑。所以,我现在最初将theta和y都设置为一个暗淡,并且成本函数返回值作为标量运行,而无需进一步调整。干杯。 – Kim 2012-03-21 17:53:42

2

cost_function应该返回一个标量,但是您的返回值J是某种数组。

相关问题