最小化多变量函数 Python SciPy

3

我正在尝试最小化一个带有参数 S1S2S3n1n2n3 的函数。还有权重:w1w2w3

这是该函数:

f = (w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2) / (w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3)

我希望知道在给定 S1S2S3n1n2n3 的情况下,如何使 w1w2w3 最小化函数 f
以下是我的代码:
def opt(S1, S2, S3, n1, n2, n3):
    xo = np.array([0,1,.01])
    from scipy.optimize import minimize
    signoise = lambda w1,w2,w3: (w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2) / (w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3)
    w1min, w2min, w3min = scipy.optimize.minimize(signoise, (.4, .2, .4))
    return w1min, w2min, w3min

scipy.optimize.minimize接受两个参数,一个是函数,另一个是初始猜测值。我不知道它是否适用于多变量函数,因为我遇到了

error : <lambda>() takes exactly 3 arguments (1 given)

好的,我按照CodyKramer的建议进行了操作。当我使用S1、S2、S3、n1、n2、n3的任意值进行测试时,我得到了以下答案:状态:0 成功:True njev: 1 nfev: 5 hess_inv: array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) fun: 5.1874999894628917e-18 x: array([ 0.4, 0.2, 0.4]) message: '优化成功终止。' jac: array([ -1.81249989e-17, -4.62499946e-17, 1.53125002e-17]) 那么最后一行的“jac”是我要找的三个数字吗?


答案是你输出的数组 xjac雅可比矩阵,它基本上是 x 的一阶导数,而 hess海森矩阵,它基本上是 x 的二阶导数。 - Cory Kramer
1个回答

3
问题在于,按照你编写的方式,lambda 接受了 3 个参数,而不是一个包含 3 个元素的序列。我建议将目标函数提取为独立的函数。
def signoise(w):
    w1, w2, w3 = w  # unpack your tuple into each variable
    # populate your S and n coefficients
    return w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2) / (w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3

然后您可以修改您的函数为:
def opt(S1, S2, S3, n1, n2, n3):
    xo = np.array([0,1,.01])
    from scipy.optimize import minimize
    return scipy.optimize.minimize(signoise, (.4, .2, .4))

好的,我按照你的建议进行了测试,当我使用S1、S2、S3、n1、n2、n3的任意值进行测试时,我得到了以下答案:status: 0 success: True njev: 1 nfev: 5 hess_inv: array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) fun: 5.1874999894628917e-18 x: array([ 0.4, 0.2, 0.4]) message: '优化成功终止。' jac: array([ -1.81249989e-17, -4.62499946e-17, 1.53125002e-17]) 最后一行的'jac'是我正在寻找的三个数字吗? - hazel
你能否编辑你的问题并包含这个内容?不幸的是,在评论区域中所有格式都会丢失,因此很难通过视觉解析输出。 - Cory Kramer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接