标签: scipy-optimize-minimize

如何为 scipy.optimize.minimize 选择正确的方法?

我想知道如何为 scipy.optimize.minimize 选择最佳的最小化方法以及结果可能有多大不同?

我试图最小化以下表达式(求解 g):

|a1.g.x + a2.g.x^3 - K|

minimization scipy-optimize scipy-optimize-minimize

15
推荐指数
1
解决办法
2万
查看次数

scipy.optimize.minimize(method ='trust-constr')不会在xtol条件下终止

我建立了一个具有线性等式约束的优化问题,如下所示

sol0 = minimize(objective, x0, args=mock_df, method='trust-constr',
                bounds=bnds, constraints=cons,
                options={'maxiter': 250, 'verbose': 3})
Run Code Online (Sandbox Code Playgroud)

objective是一个加权和功能,其系数/权重进行优化,使之最小化。由于我在系数和约束上都有边界,因此我使用内的trust-constr方法scipy.optimize.minimize

最小化可行,但是我不理解终止标准。根据trust-constr文档,它应该终止于xtol

该算法将在时终止tr_radius < xtol,其中,tr_radius是算法中使用的信任区域的半径。默认值为1e-8。

但是,verbose输出显示终止确实是由barrier_tol参数触发的,如下面的清单所示

| niter |f evals|CG iter|  obj func   |tr radius |   opt    |  c viol  | penalty  |barrier param|CG stop|
|-------|-------|-------|-------------|----------|----------|----------|----------|-------------|-------|
C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\projections.py:182: UserWarning: Singular Jacobian matrix. Using SVD decomposition to perform the factorizations.
  warn('Singular Jacobian matrix. Using SVD decomposition to ' +
|   1 …
Run Code Online (Sandbox Code Playgroud)

python optimization scipy scipy-optimize scipy-optimize-minimize

10
推荐指数
2
解决办法
222
查看次数

scipy optimize 中忽略终止容差

我有一个简单的优化问题,使用一些特定的数据,使scipy.optimize.minimize忽略tol参数。根据我的理解,从文档中,tol确定了“终止的容忍度”,即目标函数可接受的最大误差(我错了吗?)。然而,在下一个工作示例中,当tol设置为 0.1 或其他较小数字时,即使目标函数 > ,优化也会以“优化成功终止”消息结束tol。这是 Scipy 方法中的错误还是我在这里误解了什么?

var1优化问题:我需要对和进行线性组合var2,这是两个时间序列,通过参数Btd和 来缩放它们Bta。我需要线性组合的平均值近似于目标值Target,即标量。np.mean(Btd*var1 + Bta*var2)所以我只是最小化 和之间的绝对差异Target。约束条件是缩放系数必须 >0,并且均值之比np.mean(Btd*var1)/np.mean(Bta*var2)应近似于函数gi/(1-gi),其中gi是区间 [0,1] 中的标量。

可重现的代码:

import numpy as np
import scipy.optimize as opt

# The data that exactly reproduce the error:
time = np.arange(1979,2011)
var2=np.array([ 88.95705521,  74.5398773 ,  72.08588957,  65.64417178,
        50.        ,  72.39263804,  77.3006135 ,  72.08588957,
        64.41717791,  96.62576687, …
Run Code Online (Sandbox Code Playgroud)

optimization scipy python-3.x scipy-optimize-minimize

6
推荐指数
0
解决办法
4258
查看次数

scipy.optimize minus:目标函数中的两个输出变量?

我正在使用 scipyminimize函数来查找某些参数的最佳值,H并且Q. 我的目标函数kalman是根据变量 进行评估的log_likelihood。简而言之,我试图找到 的最佳值HQ最大化变量log_likelihood

为了做到这一点,scipy 的minimize函数要求这log_likelihood是 my function 的唯一输出kalman

H我的代码运行良好,我可以找到两个参数和的最佳值Q。然而,我想做的是使用最优值和值运行kalman最后一次(优化后) ,并返回另一个变量。HQkalmanA

我不能这样做,因为如果我设置

return log_likelihood, A
Run Code Online (Sandbox Code Playgroud)

在我的kalman函数中,该minimize函数不会运行,因为minimize只能处理目标函数的一个输出。

有什么想法吗?

这是我的代码:

import numpy as np
from scipy.optimize import minimize

def kalman(x0):

    #set parameters values
    H = x0[0]
    Q = x0[1]

    #Do some operations
    #use H …
Run Code Online (Sandbox Code Playgroud)

python optimization scipy scipy-optimize-minimize

5
推荐指数
0
解决办法
4538
查看次数

scipy.optimize 如何在最小化函数中将 x 值限制为整数?

我正在尝试使用scipy.optimize 中的最小化函数

从文档中我能够设置 x 的界限(例如:[0,12])。但是我无法弄清楚如何将它们设置为整数。

ans = minimize(lambda x: total_rsquared(training_size, x),
                   [0,1,2,3,4],
                   method='SLSQP',
                   constraints=cons,
                   bounds=([0, 12], [0, 12], [0, 12], [0, 12], [0, 12]))
Run Code Online (Sandbox Code Playgroud)

当我尝试使用上面的代码时,x 被设置为十进制值(例如:[1.0 11.1 5.4 6.9 3.4])。如何将 x 值设置为整数?谢谢!!

python optimization scipy scipy-optimize-minimize

5
推荐指数
0
解决办法
3798
查看次数

scipy.optimize.fmin 和 scipy.optimize.minimize 的区别

这些天我正在学习 python 来制作模型。我阅读了scipy.optimize.fmin. 它还推荐scipy.optimize.minimize. 这似乎scipy.optimize.minimize是一种更高级的方法。真的很想知道这两者之间有什么区别。

python optimization scipy scipy-optimize-minimize

5
推荐指数
1
解决办法
2031
查看次数

scipy.optimize 最小化不一致的结果

从 scipy optimize 运行最小化功能时,我得到了一些非常奇怪的结果。

这是代码

from scipy.optimize import minimize

def objective(x):
    return - (0.05 * x[0] ** 0.64 + 0.4 * x[1] ** 0.36)

def constraint(x):
    return x[0] + x[1] - 5000

cons = [{'type':'eq', 'fun': constraint}]
Run Code Online (Sandbox Code Playgroud)

跑步时

minimize(objective, [2500.0, 2500.0], method='SLSQP',  constraints=cons)
Run Code Online (Sandbox Code Playgroud)

我得到2500了 x 的每个元素的分配。和fun: -14.164036415985395

通过快速检查,此分配[3800, 1200]给出-14.9

它也对初始条件高度敏感。

关于我做错了什么的任何想法

绘制的两个函数

UPDATE 它实际上返回了初始条件。

如果我尝试这个

def objective(x):
    return - (x[0] ** 0.64 + x[1] ** 0.36)

def constraint(x):
    return x[0] + x[1] - …
Run Code Online (Sandbox Code Playgroud)

python scipy scipy-optimize scipy-optimize-minimize

5
推荐指数
0
解决办法
1130
查看次数

scipy.optimize.minimize 没有给出最小值,即使它看到该值

我正在使用 scipy.optimize.minimize 来查找目标函数的最佳参数。

我的代码:


import numpy as np
from scipy.optimize import minimize
from scipy.optimize import Bounds

bounds = Bounds([26,26,8,6,400,100,0,25,2],[36,38,28,28,1800,800,100,50,7])

energy_history = []
x_values = []

def objective(x):
    x_trail = x.reshape(1,-1)
    x_trail = sc_X.transform(x_trail)
    y_trail = regressorSVR.predict(x_trail)
    y_trail = y_trail.reshape(1,-1)
    y_trail = sc_Y.inverse_transform(y_trail)
    return y_trail[0]


def callback(x,y):
    fobj = objective(x)
    energy_history.append(fobj)
    x_values.append(x)

x0 = np.array([26,28,15,7,400,377,40,43,4.3])
res = minimize(objective, x0, method='trust-constr',
               options={'verbose': 1}, bounds=bounds,callback=callback)

optimal_values = res.x
energy = res.fun

Run Code Online (Sandbox Code Playgroud)

给定初始值后,我得到的最小化值(res.fun)是-7.1。我正在创建一个列表(energy_history)来查看它如何达到这个值。我在该列表中看到一些小于 -7.1 的值,但为什么 -7.1 被作为最小值返回。

图像

目标函数多次达到 -21 的值,但为什么仍然返回 -7 作为最小值?

python optimization scipy scipy-optimize scipy-optimize-minimize

5
推荐指数
1
解决办法
6569
查看次数

如何在类中使用 scipy 的最小化?

我是 python 新手,所以这可能是一个愚蠢的问题,但是我在任何地方都找不到答案。

我试图根据另一个玩家的动作找到一个玩家的最佳反应。对于那些熟悉的经济学,这种情况是典型的伯特兰价格竞争。代码如下:

import numpy as np
from scipy.optimize import minimize

class Player:
    def __init__(self):
        self.action = np.random.choice(np.linspace(0, 1, 11))

    def payoff(self, other):
        if self.action < other.action:
            return (1 - self.action) * self.action
        elif self.action == other.action:
            return 0.5 * (1 - self.action) * self.action
        else:
            return 0

    def best_reply(self, other):
        br = minimize(-self.payoff, 0.5, other)
        return br['x']

A = Player()
B = Player()

print(A.best_reply(B))
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我收到以下错误:

TypeError: bad operand type for unary -: 'method'
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这是为什么吗?我能够通过将收益乘以 -1 并从 best_reply 函数中删除“-”来规避这个问题。但是,当我运行代码时,我得到: …

python scipy scipy-optimize scipy-optimize-minimize

5
推荐指数
1
解决办法
1695
查看次数

Scipy 优化最小化总是返回初始猜测(SLSQP)

正如标题所解释的,我的程序总是返回最初的猜测。

就上下文而言,该计划正在尝试找到在多个商店之间分配某些产品的最佳方式。每家商店都有对未来几天预计销售商品的预测(sales_data)。该预测不一定必须是整数或大于 1(很少如此),它是统计意义上的期望。因此,如果商店的 sales_data = [0.33, 0.33, 0.33],则预计 3 天后,他们将售出 1 单位的产品。

我想最大限度地减少出售我分配的单位所需的总时间(我想以最快的速度出售它们),我的限制是我必须分配可用的单位,并且我不能分配负数的产品到一家商店。我现在可以接受非整数分配。对于我的初始分配,我将我可用的单位平均分配给所有商店。

下面是我遇到问题的代码的较短版本:

import numpy, random
from scipy.optimize import curve_fit, minimize

unitsAvailable = 50
days = 15

class Store:

    def __init__(self, num):
        self.num = num

        self.sales_data = []


stores = []
for i in range(10):
    # Identifier
    stores.append(Store(random.randint(1000, 9999)))
    # Expected units to be sold that day (It's unlikey they will sell 1 every day)
    stores[i].sales_data = [random.randint(0, 100) / 100 for i in range(days)]
    print(stores[i].sales_data)


def days_to_turn(alloc, store): …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy scipy-optimize scipy-optimize-minimize

4
推荐指数
1
解决办法
6007
查看次数

打印选择的 scipy.optimize.minimize 方法

这是一个简短的问题,但谷歌每次都会指向我找不到答案的文档。

我正在使用 scipy.optimize.minimize。它运作得很好,一切都很好。我可以定义一个要使用的方法,但即使我不指定该方法它也可以工作。

有没有办法获得输出,使用哪种方法?我知道结果类,但那里没有提到方法。

这是一个例子:

solution = opt.minimize(functitionTOminimize,initialGuess, \
                      constraints=cons,options={'disp':True,'verbose':2})
print(solution)
Run Code Online (Sandbox Code Playgroud)

我可以将 value 方法设置为类似slsqp或 的值cobyla,但我想看看程序正在选择什么。我怎样才能得到这些信息?

python scipy scipy-optimize scipy-optimize-minimize

3
推荐指数
1
解决办法
1216
查看次数

如何在 scipy.optimize.minimize 中隐藏 `delta_grad == 0.0` 警告?

我有一个循环,使用 scipy.optimize.minimize 执行数百次优化。不幸的是,我不断收到这个恼人的警告:

C:\Users\Leonidas\Anaconda3\lib\site-packages\scipy\optimize\_hessian_update_strategy.py:186: UserWarning: delta_grad == 0.0. Check if the approximated function is linear. If the function is linear better results can be obtained by defining the Hessian as zero instead of using quasi-Newton approximations.
  'approximations.', UserWarning)
Run Code Online (Sandbox Code Playgroud)

因为我正在运行数百次优化,所以这个警告在循环期间出现了几十次,它只会使控制台变得混乱并掩盖程序输出的其余部分。有没有办法

  1. 检查此警告是否已显示,如果是,则不再显示,或者
  2. 完全压制警告?

python warnings scipy scipy-optimize scipy-optimize-minimize

3
推荐指数
1
解决办法
2114
查看次数