【问题标题】:What size arguments does the minimize function in SciPy (Python) accept?SciPy (Python) 中的最小化函数接受什么大小的参数?
【发布时间】:2017-01-05 03:17:23
【问题描述】:

我正在阅读 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 函数似乎为第一个变量采用大小为 4 的数组,为第二个变量采用大小为 4 的数组。这是因为 x[1:] 和 x[:-1] 一样被使用。

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

另外,将两个变量的值存储在两个不同的数组中不是更有意义吗?

抱歉,如果我遗漏了一些非常明显的内容,请提前致谢。

V

【问题讨论】:

  • “第一个变量”和“第二个变量”是什么意思?只有一个参数被传递给rosen。它对这个论点的作用是它自己的事。

标签: python numpy optimization scipy


【解决方案1】:

rosen 以接受几乎任何长度的x 的方式编写,并返回单个值sum。像x[1:]-x[:-1] 这样的表达式只是取连续项之间的差异。

minimize 本身采用x0,一个一维数组,这里有 5 个元素长。它会改变所有元素,直到 rosen 和最小化。所以它最小化了一个向量或一维数组。在我看来,x0 的长度可能与 (2,) 不同。

【讨论】:

    【解决方案2】:

    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.])
    

    一次评估多个输入向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2021-10-25
      • 2022-11-26
      • 2016-05-27
      • 2018-01-30
      • 2015-02-18
      相关资源
      最近更新 更多