python - scipy.optimize 陷入局部最小值。我能做些什么?
问题描述
from numpy import *; from scipy.optimize import *; from math import *
def f(X):
x=X[0]; y=X[1]
return x**4-3.5*x**3-2*x**2+12*x+y**2-2*y
bnds = ((1,5), (0, 2))
min_test = minimize(f,[1,0.1], bounds = bnds);
print(min_test.x)
我的函数f(X)
有一个x=2.557, y=1
我应该能够找到的局部最小值。
上面显示的代码只会给出结果 where x=1
。我尝试了不同的公差和三种方法:L-BFGS-B、TNC 和 SLSQP。到目前为止,这是我一直在关注的主题:
Scipy.optimize: how to restrict argument values
我怎样才能解决这个问题?
我正在使用 Spyder(Python 3.6)。
解决方案
您刚刚遇到了局部优化的问题:它在很大程度上取决于您传入的起始(初始)值。如果您提供[2, 1]
它,它将找到正确的最小值。
常见的解决方案是:
在循环中使用您的优化,在您的边界内随机起点
import numpy as np from numpy import *; from scipy.optimize import *; from math import * def f(X): x=X[0]; y=X[1] return x**4-3.5*x**3-2*x**2+12*x+y**2-2*y bnds = ((1,3), (0, 2)) for i in range(100): x_init = np.random.uniform(low=bnds[0][0], high=bnds[0][1]) y_init = np.random.uniform(low=bnds[1][0], high=bnds[1][1]) min_test = minimize(f,[x_init, y_init], bounds = bnds) print(min_test.x, min_test.fun)
使用可以摆脱局部最小值的算法,我可以推荐 scipy 的
basinhopping()
使用全局优化算法并将其结果用作局部算法的初始值。推荐的是 NLopt
DIRECT
或 MADS 算法(例如NOMAD
)。scipy 中还有另一个shgo
,我还没有尝试过。
推荐阅读
- python - 如何创建每另一列的前一行为1时增加1的ID
- php - 使用 ip 和掩码获取网络地址。(php, IPv6)
- java - javax.persistence.PersistenceException: org.hibernate.TransactionException: 已经有一个关联的托管连接
- c# - 如何减少代码中的 SQL 查询量?
- php - 是否有一个内置的 PHP 函数可以打印格式化为的数组
标签?
- pyspark - 无法在 Oozie 中使用 spark 操作执行 Pyspark 脚本 - 实例化 'org.apache.spark.sql.hive.HiveExternalCatalog 时出错
- java - 在 Spring Boot 中使用具有不同 jdbc 驱动程序的两个数据源
- powerbi - 与现有日期表匹配的 PowerBI 日期层次结构
- python - 在 PySimpleGUI 中创建一个文本框
- c# - Linq ToList() 会生成新项目吗?