scipy 如何在Python中优化一个多变量标量函数(涉及trace和矩阵)?

nle07wnf  于 2022-11-10  发布在  Python
关注(0)|答案(1)|浏览(245)

我目前正在尝试优化表单的一个函数:

其中σ和x是优化变量,我们说x是一个向量(形式为[x_1,x_2]),它的系数为X_2 = x_1^2 * A + x_2^2 * B,其中A和B是正矩阵。
我尝试过使用scipy.optimize,但它不起作用。我确信这与优化变量是标量/矩阵有关。我在下面附上了我的代码:

from scipy.optimize import minimize
import numpy as np

def objective(x):

    x_array = x[0]
    sigma = x[1]

    fun = np.trace((np.kron(np.diag(np.square(x_array)), rho.T)) @ sigma)

    return fun

x0 = np.array([np.array([1 ,1]), np.eye(4)])

res = minimize(objective, x0, method = 'Nelder-Mead')

我收到一个错误消息,内容是
ValueError:设置带有序列的数组元素。
如何用Python解决这个优化问题呢?

qacovj5a

qacovj5a1#

在scipy.optimize中,x向量应该是长度为NUMVAR的一维向量。您传递的是更复杂的内容。您应该执行以下操作:

from scipy.optimize import minimize
import numpy as np

n1 = 2  # number of variables in user x array
n2 = 4  # number of variables in sigma
n = n1 + n2  # number of variables in scipy.optimize x array

def objective(x):

    #x_array = x[0]
    #sigma = x[1]
    x_array = x[0:n1]
    sigma = np.diag(x[n1:n])

    fun = np.trace((np.kron(np.diag(np.square(x_array)), rho.T)) @ sigma)

    return fun

# x0 = np.array([np.array([1 ,1]), np.eye(4)])

# this is a very strange beast. How does one come up with this?

# even numpy thinks this is just bonkers:

# VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences

# (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated.

# If you meant to do this, you must specify 'dtype=object' when creating the ndarray.

# let's bring some sanity back and just use a vector of length n=n1+n2

x0 = np.ones((n,))

res = minimize(objective, x0, method = 'Nelder-Mead')

这不能运行,因为我们没有一个合适的运行最小的例子。下次,请看一下:https://stackoverflow.com/help/minimal-reproducible-example
请注意,我假设我们有2个变量x和4个变量sigma,并且sigma是一个对角矩阵。如果sigma是一个完整的矩阵,它将有16个变量。不清楚用户的意图。这是一个很好的例子,在这里,首先用清晰的数学来说明问题总是一个好主意。我在代码中没有看到任何A和B矩阵,在数学模型中,所以描述看起来不同步。当然,我们也缺少任何约束。同样,描述和数学不一样,数学和代码不一样。

相关问题