今天我想问你下一个问题 - 如何在优化函数中更改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
答案 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
如何工作的详细说明:
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)
x[x > 0]
使用Boolean indexing选择大于零的x
元素:
>>> x[x > 0]
array([1, 2, 3])
x[x > 0] ** 3
是x
元素的多维数据集数组,大于零:
>>> x[x > 0] ** 3
array([ 1, 8, 27])
数组上的sum
方法会添加所有元素:
>>> (x[x > 0] ** 3).sum()
36