2021-05-12

 

文章转自 男票的博客 哈哈哈!

Together_CZ的博客

种一棵树,最好的时间是十年前,其次是现在 

 

首先:目标导向~

SciPy库提供了一套针对不同目的的不同优化算法。
SciPy中提供了本地搜索优化算法。
SciPy中提供了全局搜索优化算法。

其次:开课~ 第一节课 “科学的优化”

用于科学计算的Python SciPy开源库提供了一套优化技术。

         许多算法被用作SciPy库以及机器学习库(例如scikit-learn)中其他算法的构建块。

以下是库提供的算法类型:

标量优化:凸单变量函数的优化。
本地搜索:优化单峰多变量函数。
全局搜索:多模式多变量函数的优化。
最小二乘:解决线性和非线性最小二乘问题。
曲线拟合:将曲线拟合到数据样本。
根查找:查找函数的根(输出为零的输入)。
线性规划:线性优化受约束。

       所有算法都假设正在优化的目标函数是最小化函数。如果函数正在最大化,则可以通过向目标函数返回的值添加负号来将其转换为最小化。

        除了上面的列表之外,该库还提供一些算法使用的实用程序功能以及Rosenbrock测试问题。

       有关SciPy库优化功能的概述,请参见:男票原文!

 开课~ 第二节课 “使用SciPy进行本地搜索”

         局部搜索或局部功能优化是指寻找输入到函数的算法,该算法会导致最小或最大输出,其中假定正在搜索的函数或受约束区域具有单个最优值,例如。 单峰的。

         正在优化的函数可以是凸函数,也可以不是哦,并且可以具有一个或多个输入变量。

        如果功能被认为或已知是单峰的,则可以直接应用局部搜索优化来优化功能。 否则,可以应用局部搜索算法来微调全局搜索算法的结果。SciPy库通过minimal()函数提供本地搜索。minimal()函数将要最小化的目标函数的名称以及开始搜索的起始点作为输入,并返回OptimizeResult,该结果概述搜索的成功或失败以及解决方案的详细信息(如果找到)。

上代码

# minimize an objective function
result = minimize(objective, point)

 如果已知,则可以提供有关目标函数的其他信息,例如输入变量的界限,用于计算函数一阶导数的函数(梯度或雅可比矩阵),用于计算函数二阶导数的函数(Hessian) 矩阵),以及对输入的任何约束。重要的是,该函数提供了“方法”参数,该参数允许指定在本地搜索中使用的特定优化。

  下面给仙女们一套流行的本地搜索算法:

Nelder-Mead算法(方法=“ Nelder-Mead”)。
牛顿法(method ='Newton-CG')。
鲍威尔的方法(方法=“鲍威尔”)。
BFGS算法和扩展名(方法=“ BFGS”)。

 下面给仙女们示例演示如何使用L-BFGS-B局部搜索算法求解二维凸函数

# l-bfgs-b algorithm local optimization of a convex function
from scipy.optimize import minimize
from numpy.random import rand
 
# objective function
def objective(x):
	return x[0]**2.0 + x[1]**2.0
 
# define range for input
r_min, r_max = -5.0, 5.0
# define the starting point as a random sample from the domain
pt = r_min + rand(2) * (r_max - r_min)
# perform the l-bfgs-b algorithm search
result = minimize(objective, pt, method='L-BFGS-B')
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['x']
evaluation = objective(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))

 运行示例将执行优化,并报告搜索的成功或失败,执行的功能评估的次数以及导致功能最佳化的输入。

Status : b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
Total Evaluations: 9
Solution: f([3.38059583e-07 3.70089258e-07]) = 0.00000

开课~ 第三节课 “使用SciPy进行本地搜索”

全局搜索或全局功能优化是指寻找功能输入的算法,该算法会导致最小或最大输出,其中假定正在搜索的功能或约束区域具有多个局部最优值,例如,多式联运。要优化的函数通常是非线性的,非凸的,并且可能具有一个或多个输入变量。全局搜索算法通常是随机的,这意味着它们会在搜索过程中利用随机性,并且可能会或可能不会在搜索过程中管理大量候选解决方案。

       SciPy库提供了许多随机的全局优化算法,每种算法都通过不同的功能。他们是:

通过Basinhopping()函数实现盆地跳跃优化。
通过differential_evolution()函数进行差分进化优化。
通过dual_annealing()函数进行的模拟退火。

 该库还提供用于序列优化的shgo()函数和用于网格搜索优化的brute()。每种算法都返回一个OptimizeResult对象,该对象概述搜索的成功或失败以及解决方案的详细信息(如果找到)。

 下面给仙女们示例演示如何使用模拟退火求解二维多峰函数。  

# simulated annealing global optimization for a multimodal objective function
from scipy.optimize import dual_annealing
 
# objective function
def objective(v):
	x, y = v
	return (x**2 + y - 11)**2 + (x + y**2 -7)**2
 
# define range for input
r_min, r_max = -5.0, 5.0
# define the bounds on the search
bounds = [[r_min, r_max], [r_min, r_max]]
# perform the simulated annealing search
result = dual_annealing(objective, bounds)
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['x']
evaluation = objective(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值