Python涉及二维列表的最小化
Python Minimization involving 2D List
我正在尝试执行函数的最小化 f(x)
periods = range(1,11+1)
friends = range(0,7)
i = 0.05
def f(x):
sum = 0
for period in periods:
sum += x[period-1] * (1+i)**(11-period)
return -sum
optimize.fmin_cg(f, [2,2,2,2,2,2,2,2,2,2,2])
上面是针对单个朋友的,但是现在我们想为11个朋友做,通过在列表中添加另一个维度x
得到x[friend][period-1]
并添加一个新的循环for friend in friends
.
def g(x):
sum = 0
for period in periods:
for friend in friends:
sum += x[friend][period-1] * (1+i)**(11-period)
return -sum
optimize.fmin_cg(g, [[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2]])
但是我们现在得到错误:
IndexError: invalid index to scalar variable.
我们如何解决这个问题?
x0 : ndarray
A user-supplied initial estimate of xopt, the optimal value of x. It must be a 1-D array of values.
由于优化器并不真正关心数组的形状,您可以在将 x0
传递给 fmin_cg
之前将其展平并在 [=14= 中将其重新整形为所需的形状],像这样:
def g(x):
sum = 0
x = x.reshape(11, 11)
for period in periods:
for friend in friends:
sum += x[friend, period-1] * (1+i)**(11-period)
return -sum
x0 = numpy.array([[2,2,2,2,2,2,2,2,2,2,2], ...])
optimize.fmin_cg(g, x0.flatten())
请注意,我在这里使用了 numpy
数组而不是嵌套列表。如果您无论如何都在使用 scipy
,那么学习一点 numpy
也没有什么坏处。它也比嵌套列表更容易重塑。
我正在尝试执行函数的最小化 f(x)
periods = range(1,11+1)
friends = range(0,7)
i = 0.05
def f(x):
sum = 0
for period in periods:
sum += x[period-1] * (1+i)**(11-period)
return -sum
optimize.fmin_cg(f, [2,2,2,2,2,2,2,2,2,2,2])
上面是针对单个朋友的,但是现在我们想为11个朋友做,通过在列表中添加另一个维度x
得到x[friend][period-1]
并添加一个新的循环for friend in friends
.
def g(x):
sum = 0
for period in periods:
for friend in friends:
sum += x[friend][period-1] * (1+i)**(11-period)
return -sum
optimize.fmin_cg(g, [[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2]])
但是我们现在得到错误:
IndexError: invalid index to scalar variable.
我们如何解决这个问题?
x0 : ndarray
A user-supplied initial estimate of xopt, the optimal value of x. It must be a 1-D array of values.
由于优化器并不真正关心数组的形状,您可以在将 x0
传递给 fmin_cg
之前将其展平并在 [=14= 中将其重新整形为所需的形状],像这样:
def g(x):
sum = 0
x = x.reshape(11, 11)
for period in periods:
for friend in friends:
sum += x[friend, period-1] * (1+i)**(11-period)
return -sum
x0 = numpy.array([[2,2,2,2,2,2,2,2,2,2,2], ...])
optimize.fmin_cg(g, x0.flatten())
请注意,我在这里使用了 numpy
数组而不是嵌套列表。如果您无论如何都在使用 scipy
,那么学习一点 numpy
也没有什么坏处。它也比嵌套列表更容易重塑。