Python 使用scipy.optimize最小化函数

Python 使用scipy.optimize最小化函数,python,optimization,scipy,Python,Optimization,Scipy,我需要使用scipy最小化上述函数 我的输入数据 np.random.seed(1234) m = 500 #500 n = 100 #100 A = np.asmatrix(np.random.randint(low=-10,high=1,size=(n,m))) b = np.asmatrix(np.random.randint(low=500,high=1000,size=(m,1))) c = np.asmatrix(np.random.randint(low=

我需要使用scipy最小化上述函数

我的输入数据

np.random.seed(1234)
m = 500    #500
n = 100    #100
A = np.asmatrix(np.random.randint(low=-10,high=1,size=(n,m)))     
b = np.asmatrix(np.random.randint(low=500,high=1000,size=(m,1)))  
c = np.asmatrix(np.random.randint(low=0.1,high=2,size=(n,1)))
x = np.asmatrix(np.random.randint(low=1,high=10,size=(n,1)))

我的功能和梯度:

def func(x, A, b, c):
    fx = np.dot(c.T, x) - np.sum(np.log10((b - np.dot(A.T, x))))
    return fx

def grad(x, A, b, c):
    gradient = A * (1.0/(b - A.transpose()*x)) + c
    return gradient
这就是我一直试图运行的

scipy.optimize.fmin_cg(func(x + t*grad(x, A, b, c),A, b, c), x, args=(A,b,c,x))

我不知道你想干什么

func(x + t*grad(x, A, b, c), A, b, c)
什么是
t

无论如何,您对fmin\U cg的呼叫是不正确的-的签名是

第一个参数需要是您的目标函数,
func
,第二个参数需要是您对
x
的初始猜测,第三个(可选)参数是您的梯度函数,
grad
,第四个参数是
f
fprime
的附加参数集(不包括
x

该调用应该如下所示:

scipy.optimize.fmin_cg(func, x, fprime=grad, args=(A, b, c))

但是,由于您的数组维度存在问题,这仍然不起作用:

<ipython-input-49-bf5fa71345fe> in grad(x, A, b, c)
      1 def grad(x, A, b, c):
----> 2         gradient = A * (1.0/(b - A.transpose()*x)) + c
      3         return gradient
      4 

/home/alistair/.venvs/core/local/lib/python2.7/site-packages/numpy/matrixlib/defmatrix.pyc in __mul__(self, other)
    341         if isinstance(other, (N.ndarray, list, tuple)) :
    342             # This promotes 1-D vectors to row vectors
--> 343             return N.dot(self, asmatrix(other))
    344         if isscalar(other) or not hasattr(other, '__rmul__') :
    345             return N.dot(self, other)

ValueError: shapes (500,100) and (1,100) not aligned: 100 (dim 1) != 1 (dim 0)
在第一次调用
grad
时,我们看到:

(Pdb) type(x)
<type 'numpy.ndarray'>
(Pdb) !x.shape
(100,)
。。。你最初的论点是:

np.random.seed(1234)
m = 500    #500
n = 100    #100
A = np.random.randint(low=-10, high=1, size=(n, m))
b = np.random.randint(low=500, high=1000, size=m) 
c = np.random.randint(low=0.1, high=2, size=n)
x = np.random.randint(low=1, high=10, size=n)
。。。现在,您对
fmin\u cg
的呼叫应该可以工作了:

res = scipy.optimize.fmin_cg(func, x, fprime=grad, args=(A, b, c))

由于您在函数中使用的是
np.dot
,因此不要使用
np.asmatrix
使事情复杂化。坚持使用正则数组。如果需要,添加尺寸标注(使用
newaxis
重塑
至少\u 2d
)。
def grad(x, A, b, c):
    gradient = A.dot(1.0/(b - A.T.dot(x))) + c
    return gradient
np.random.seed(1234)
m = 500    #500
n = 100    #100
A = np.random.randint(low=-10, high=1, size=(n, m))
b = np.random.randint(low=500, high=1000, size=m) 
c = np.random.randint(low=0.1, high=2, size=n)
x = np.random.randint(low=1, high=10, size=n)
res = scipy.optimize.fmin_cg(func, x, fprime=grad, args=(A, b, c))