SciPy(Python)中的最小化函数接受什么大小的参数?

时间:2017-01-05 03:17:24

标签: python numpy optimization scipy

我正在阅读SciPy文档并使用Python来了解我是否可以实现他们所谈论的内容。但是,我似乎无法弄清楚下面的代码中发生了什么。

来自https://docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/optimize.html

>>> def rosen(x):
...     """The Rosenbrock function"""
...     return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)

>>> x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])

>>> res = minimize(rosen, x0, method='nelder-mead',
...                options={'xtol': 1e-8, 'disp': True})
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 339
         Function evaluations: 571

>>> print(res.x)
[ 1.  1.  1.  1.  1.]

在这种情况下,似乎Rosenbrock函数为第一个变量采用size-4数组,为第二个变量采用size-4数组。这是因为x [1:]和x [: - 1]一样使用。

这最终如何最终给出五个结果的数组?当然,最小化函数只运行四次,每次都有一对值(分别取自x [1:]和x [: - 1])?

将两个变量的值存储在两个不同的数组中也没有意义吗?

很抱歉,如果我错过了一些非常明显的事情并提前感谢。

V

2 个答案:

答案 0 :(得分:3)

rosen的编写方式接受几乎任意长度的x,并返回单个值sum。像x[1:]-x[:-1]这样的表达式只是区分连续的术语。

minimize本身需要x0,一个1d数组,这里有5个元素长。它会在rosen总和最小化之前改变所有元素。所以它最小化了矢量或1d数组。从x0开始,我认为(2,)可能有不同的长度。

答案 1 :(得分:0)

SciPy实现的Rosenberg功能不是常用功能

formula

但似乎更像是generalized Rosenberg function

another

更高的尺寸。因此x[1:]x[:-1]没有索引两个维度(x,y),但是以一种方便的方式实现了上述功能。

关于hpaulj的答案的说明:它不一定会输出单个值,因为人们可以做到

from scipy.optimize import rosen
points = np.array([[1, 1, 1, 1], [1, 2, 3, 4]]).T
rosen(points)

--> array([    0.,  2705.])

一次评估多个输入向量。