在 Python 中最小化目标函数

问题描述 投票:0回答:1

我面临着特定目标函数最小化的问题。

让我们考虑以下场景:我们有一个长度为 600 的向量 (

V
)。

我们的目标是最小化涉及两个未知参数的函数。我们的目标是以最小化目标函数值的方式找到这些参数。

这是我一直在使用的代码:

我尝试过各种优化方法,例如

trust-constr
Nelder-Mead
SLSQP
等等。然而,所有这些方法的性能似乎都很相似,我担心它们可能没有正确优化函数。

例如,我发现了一些有希望的参数值,当用作初始猜测时,应该会产生最佳结果。尽管提供这些值作为初始猜测,但从优化过程中获得的优化参数值似乎并未像我预期的那样收敛到这些有希望的值。

进一步阐述,主要目标是识别导致目标函数的最低可能值的未知参数。而且目标是找到这些参数,无论使用什么方法。


import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt


# Load actual data

batch_size = 100
horizontalsteps = np.arange(1, 60000, batch_size)

import numpy as np
from scipy.optimize import minimize

def objective(x):
  sum_val = 0
  for i in range(len(horizontalsteps)):
      sum_val += (V[i] - (x[0] + x[1] / np.sqrt(horizontalsteps[i]))) ** 2
  return sum_val

# Initial guess for the parameters
initial_guess = [0.003, 6]

# Define parameter bounds
param_bounds = [(-10000, 10000), (-10000, 10000)]



# Use trust-constr algorithm for optimization
result = minimize(objective, initial_guess, method='trust-constr', bounds=param_bounds)

optimized_params = result.x
print("Optimized Parameters:", optimized_params)
python optimization minimization scipy-optimize-minimize
1个回答
0
投票

我不知道这是否是您正在寻找的,但这个程序确实找到了局部最小值:

import numpy as np
import random

batch_size = 100
horizontalsteps = np.arange(1, 60000, batch_size)
V = [random.randint(1, 100) for i in range(600)]
print(V)

def objective(x):
    sum_val = 0
    for i in range(len(horizontalsteps)):
        sum_val += (V[i] - (x[0] + x[1] / np.sqrt(horizontalsteps[i]))) ** 2
    return sum_val


# Initial guess for the parameters
initial_guess = [0.003, 6]
step = 1.0
value = objective(initial_guess)
while step > 2**-10:
    x, y = 0, 0
    for k in [-step, 0, step]:
        for j in [-step, 0, step]:
            new_value = objective([initial_guess[0] + k, initial_guess[1] + j])
            if new_value < value:
                x, y, value = k, j, new_value
    initial_guess = [initial_guess[0] + x, initial_guess[1] + y]
    if x == 0 and y == 0:
        step /= 2.0
    elif x != 0 and y != 0:
        step *= 2
    print(value, initial_guess, step)

它基本上是一个简单的梯度下降方法。如果您正在寻找其他内容,请更具体地说明您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.