我正在阅读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
答案 0 :(得分:3)
rosen
的编写方式接受几乎任意长度的x
,并返回单个值sum
。像x[1:]-x[:-1]
这样的表达式只是区分连续的术语。
minimize
本身需要x0
,一个1d数组,这里有5个元素长。它会在rosen
总和最小化之前改变所有元素。所以它最小化了矢量或1d数组。从x0
开始,我认为(2,)
可能有不同的长度。
答案 1 :(得分:0)
SciPy实现的Rosenberg功能不是常用功能
但似乎更像是generalized Rosenberg function
更高的尺寸。因此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.])
一次评估多个输入向量。