python-3.x - 使用 SciPy 的多变量函数局部最小值
问题描述
考虑函数:
def f(x,y):
return x + 3*exp(y**2)
我想知道,是否可以使用 SciPy.optimize.minimize
找到说[0,1](单位间隔)的最小值(对于x和y)?
这是我的尝试:
bound = (0,1)
bds = [bound,bound]
x_0 = [0,0] (initial guess)
因此,
scipy.optimize.minimize(f,x_0,method='SLSQP', \ bounds = bds)
但这行不通。
我不断得到:
“行继续字符后的意外字符” At \ bounds = bnds
请注意,我希望我的 x 和 y 在 [0,1] 上的实数上有所不同
编辑:
def f(x):
return x[0] + 3*exp(x[1]**2)
bound = (0,1)
bds = [bound,bound]
x_0 = [0,0] (initial guess)
scipy.optimize.minimize(f,x_0,method='SLSQP', bounds = bds)
这个最小化函数是否只查看整数值 0 和 1?还是查看 [0,1] 中的所有实数(单位间隔?)。如果它是第一个,我不确定如何进入第二个我该怎么做?
解决方案
您的原始代码不起作用,因为
""行继续字符后的意外字符" At \ bounds = bnds":
告诉您“行继续符”(反斜杠)引起了问题。在那个角色之后你不能有任何东西。在反斜杠后插入换行符,或完全删除反斜杠
一旦你修复它,你会得到一个错误说
TypeError: f() missing 1 required positional argument: 'y'
这是因为minimize
想要一个接受一个输入的函数(阅读“参数:文档的有趣部分” )。该输入可以是一个形状数组(n, )
。当你想要一个多元最小化时,所有 n 个变量都进入你的函数的单个参数
回复:“这个最小化函数是只查看整数值 0 和 1?还是查看 [0,1] 中的所有实数(单位间隔?)。如果它是第一个,我不知道如何使它第二。”
如果它只检查边界值,那将是一个非常无用的优化器,你不觉得吗?
这很容易检查!您当前的函数的最小值为[0, 0]
,因此这不是测试函数功能的好方法。让我们定义一个具有不同数字的最小值的函数。例如,让我们定义一个具有最小值的函数[0.5, 0.5]
def f(X):
return abs(X[0] - 0.5) * abs(X[1] - 0.5)
运行您的代码会得到结果:
fun: 0.0
jac: array([0., 0.])
message: 'Optimization terminated successfully.'
nfev: 8
nit: 2
njev: 2
status: 0
success: True
x: array([0.5, 0.5])
这很清楚地显示minimize()
了整个区间。
不过,它并没有真正查看区间中的所有实数(这是不可能的,因为在任何区间中都有无限的实数)。相反,它使用您在method
参数中指定的优化算法。
推荐阅读
- swift - 如何将日期类型变量设置为初始值?
- google-apps-script - 谷歌表格应用脚本根据每个选项卡的 las 列批量隐藏行
- java - RowSet 的 Java 8 到 Java 11 迁移(出现错误)
- curl - 在 Azure、wordpress Web 应用程序上启用 cURL
- c# - 以逗号分隔的组加入选择
- vue.js - 为什么在使用 NumericTextField 时会出现“避免直接更改道具”?
- asp.net - 我想在一行中使用 linq 获得最短登录时间和最长注销时间?
- python - 如何在 df.apply() 之后返回数据帧
- bit-manipulation - 位操作(遍历所有子集)
- android - 如何使用约束布局创建浮动操作按钮菜单?