我想知道如何为 scipy.optimize.minimize 选择最佳的最小化方法以及结果可能有多大不同?
我试图最小化以下表达式(求解 g):
|a1.g.x + a2.g.x^3 - K|
我建立了一个具有线性等式约束的优化问题,如下所示
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
我有一个简单的优化问题,使用一些特定的数据,使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) 我正在使用 scipyminimize函数来查找某些参数的最佳值,H并且Q. 我的目标函数kalman是根据变量 进行评估的log_likelihood。简而言之,我试图找到 的最佳值H和Q最大化变量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) 我正在尝试使用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 来制作模型。我阅读了scipy.optimize.fmin. 它还推荐scipy.optimize.minimize. 这似乎scipy.optimize.minimize是一种更高级的方法。真的很想知道这两者之间有什么区别。
从 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) 我正在使用 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
我是 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 函数中删除“-”来规避这个问题。但是,当我运行代码时,我得到: …
正如标题所解释的,我的程序总是返回最初的猜测。
就上下文而言,该计划正在尝试找到在多个商店之间分配某些产品的最佳方式。每家商店都有对未来几天预计销售商品的预测(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) 这是一个简短的问题,但谷歌每次都会指向我找不到答案的文档。
我正在使用 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,但我想看看程序正在选择什么。我怎样才能得到这些信息?
我有一个循环,使用 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)
因为我正在运行数百次优化,所以这个警告在循环期间出现了几十次,它只会使控制台变得混乱并掩盖程序输出的其余部分。有没有办法
python warnings scipy scipy-optimize scipy-optimize-minimize