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.

我们如何解决这个问题?

docs for fmin_cg 说:

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 也没有什么坏处。它也比嵌套列表更容易重塑。