【问题标题】:How to change x array in optimized function (scipy, Python)?如何在优化函数(scipy、Python)中更改 x 数组?
【发布时间】:2016-05-12 01:11:41
【问题描述】:

今天我想问你下一个问题——如何在优化函数(scipy、Python)中改变x数组?

例子:

from scipy.optimize import minimize  

def function(x):
    for i in range(len(x)):
        if x[i]<0:
            x[i]=0
    F = 0.0
    print list(x)
    for i in x:
        F += i**3
return F

n = 5
x0=[]
for i in range(n):
    x0.append(-1.0)
res = minimize(function, x0, method='Nelder-Mead')

print res

但是结果是数组([-1., -1., -1., -1., -1.]):

.........................  
.........................  
[0.0, 0.0, 0.0, 0.0, 0.0]  
[0.0, 0.0, 0.0, 0.0, 0.0]  
[0.0, 0.0, 0.0, 0.0, 0.0]  
[0.0, 0.0, 0.0, 0.0, 0.0]  
[0.0, 0.0, 0.0, 0.0, 0.0]  
[0.0, 0.0, 0.0, 0.0, 0.0]  
  status: 1  
    nfev: 1006  
 success: False  
     fun: 0.0  
       x: array([-1., -1., -1., -1., -1.])  
 message: 'Maximum number of function evaluations has been exceeded.'  
     nit: 148

【问题讨论】:

    标签: python optimization scipy minimize


    【解决方案1】:

    不要更改数组!而是以其他方式计算结果。例如,不要写帖子中的代码,而是写:

    def f(x):
        return (x[x > 0] ** 3).sum()
    

    然后:

    >>> x0 = np.full((5,), -1)
    >>> print(minimize(f, x0, method='Nelder-Mead'))
    final_simplex: (array([[-1.      , -1.      , -1.      , -1.      , -1.      ],
                           [-1.000098, -1.      , -1.      , -1.      , -1.      ],
                           [-1.      , -1.000098, -1.      , -1.      , -1.      ],
                           [-1.      , -1.      , -1.000098, -1.      , -1.      ],
                           [-1.      , -1.      , -1.      , -1.000098, -1.      ],
                           [-1.      , -1.      , -1.      , -1.      , -1.000098]]),
                    array([ 0.,  0.,  0.,  0.,  0.,  0.]))
               fun: 0.0
           message: 'Optimization terminated successfully.'
              nfev: 69
               nit: 10
            status: 0
           success: True
                 x: array([-1., -1., -1., -1., -1.])
    

    这里详细解释了我的函数f 的工作原理:

    1. x &gt; 0 计算一个与x 具有相同形状的布尔数组,对于x 中大于0 的每个元素具有True,否则False。例如:

      >>> x = np.array([-1, 0, 1, 2, 3])
      >>> x > 0
      array([False, False,  True,  True,  True], dtype=bool)
      
    2. x[x &gt; 0] 使用Boolean indexing 选择x 中大于零的元素:

      >>> x[x > 0]
      array([1, 2, 3])
      
    3. x[x &gt; 0] ** 3 是一个由大于零的x 元素组成的立方体数组:

      >>> x[x > 0] ** 3
      array([ 1,  8, 27])
      
    4. 数组上的sum 方法将所有元素相加:

      >>> (x[x > 0] ** 3).sum()
      36
      

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 2019-03-15
      • 2013-09-26
      • 2022-01-08
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      相关资源
      最近更新 更多