如何在优化函数(scipy,Python)中更改x数组?

时间:2016-05-11 13:18:48

标签: python optimization scipy minimize

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

示例:

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。, - 。。]):

.........................  
.........................  
[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

1 个答案:

答案 0 :(得分: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 > 0计算一个布尔数组,其形状与x相同,True中每个元素的x大于0,False 1}}否则。例如:

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

    >>> x[x > 0]
    array([1, 2, 3])
    
  3. x[x > 0] ** 3x元素的多维数据集数组,大于零:

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

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