ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

python如何实现最优化

python如何实现最优化

最优化的方法是存在的, 这些方法的包含内容有: 使用优化库, 像SciPy这样的东西可以通过这种方式来获取;还有通过梯度下降算法来进行操作;也可以自定义目标函数来实现相应的目的;还可以使用约束条件来配合;现在本文将重点介绍的内容是如何利用这些方法进行最优化这一件事儿, 这里面的特别是有关使用库进行优化的详细过程的详细介绍。

一、使用SCIPY库进行优化

SciPy是一个功能强大的库, 该库提供了各种各样的数学、科学以及工程计算工具, 而在这些工具里面, 它包含了一个专门的优化模块, 该优化模块包含了多种不同的优化算法, 比如线性规划、非线性最小二乘法、针对单变量函数的最优化问题处理, 以及对多变量函数的最优化问题处理等。

线性规划

线性规划这个东西, 它是属于最优化问题这一类当中的。它具体是怎么做的? 就是依靠那种线性的关系来描述目标函数以及约束条件方面的事儿。而在SciPy这个软件包里, 有个相关的函数可以用来帮助解决线性规划方面的这些个具体计算和处理工作。

from scipy.optimize import linprog

定义目标函数系数

c = [-1, 4]

定义不等式约束矩阵

A = [[-3, 1], [1, 2]]

b = [6, 4]

定义变量的界限

x_bounds = (None, None)

y_bounds = (-3, None)

求解线性规划问题

result = linprog(c, A_ub=A, b_ub=b, bounds=[x_bounds, y_bounds])

print(result)

在这个例子当中, 我们定义了一个比较简单的线性规划方面的问题, 然后, 我们是使用了相关的函数来进行这个求解的任务的。

这种不是线性的, 是用最小二乘法来搞定。

使用非线性最小二乘法对模型的参数进行拟合, 其核心目标在于使得模型所产生的输出与所收集的实际数据之间的差异被降到尽量小的程度。SciPy这个工具库里头提供了相关的函数, 就是专门用来实现这一类计算任务的。

import numpy as np

from scipy.optimize import curve_fit

import matplotlib.pyplot as plt

定义模型函数

def model(x, a, b):

return a * x + b

生成数据

x_data = np.array([1, 2, 3, 4, 5])

y_data = np.array([2.2, 2.8, 3.6, 4.5, 5.1])

使用curve_fit进行拟合

params, covariance = curve_fit(model, x_data, y_data)

绘制拟合结果

plt.scatter(x_data, y_data, label='Data')

plt.plot(x_data, model(x_data, *params), label='Fitted model', color='red')

plt.legend()

plt.show()

print("Fitted parameters:", params)

在这段代码里, 大家看到了使用函数来拟合线性模型的方法, 并且还绘制出了这种拟合的结果。

二、通过梯度下降这种算法来完成最优化这个任务的实现。

梯度下降是一种很多人都在用的优化算法, 这种办法只适合用在那些目标函数可以进行求微分的情况下, 具体的步骤是先计算出目标函数里面包含的梯度信息, 然后带着这些信息往梯度出现降落的路线方向去改变参数的数值, 就这么一直做下去, 直到结果稳定下来不再变化为止。

梯度下降算法原理

关于梯度下降这个方法的更新计算公式。

把那个叫 theta 的值减去 alpha 和 J 关于 theta 的梯度相乘之后的结果, 就得到了新的 theta。

在这些符号里, 括号 theta 代表的是参数, 括号 alpha 指的是学习率, 而那个带有箭头的 J 加括号 theta 的公式部分呢, 意思是目标函数的梯度。

把这个梯度下降的算法给实现出来。

def gradient_descent(gradient_func, initial_params, learning_rate, num_iterations):

params = initial_params

for _ in range(num_iterations):

gradients = gradient_func(params)

params = params - learning_rate * gradients

return params

示例:最小化二次函数

def quadratic_gradient(params):

return 2 * params # f(x) = x^2 的梯度为 2x

initial_params = np.array([10.0])

learning_rate = 0.1

num_iterations = 100

optimal_params = gradient_descent(quadratic_gradient, initial_params, learning_rate, num_iterations)

print("Optimal parameters:", optimal_params)

在这个例子中, 我们把梯度下降这个算法给用起来了, 为的是要把一个简单的二次函数里的那个最小值给找出来。

三、用户自行定义目标函数, 以此来开展优化工作。

自定义目标函数允许用户针对具体情况, 自己去定义相关的目标以及对应的约束条件。SciPy里的优化函数可以被用来实现最小化这个由用户自定义的目标函数的功能操作。

定义目标函数

这个目标函数, 它属于这样一种东西, 就是把参数空间里面的每一个元素, 都对应到一个实数上去, 这样的一种映射关系, 然后呢, 用户在定义它的时候, 完全可以去根据自己的具体优化问题的需求, 来去进行相应的设定。

def objective_function(x):

return x[0]2 + x[1]2 + 1

使用初始猜测和边界进行优化

initial_guess = [2, 2]

bounds = [(-10, 10), (-10, 10)]

使用.进行优化

from scipy.optimize import minimize

result = minimize(objective_function, initial_guess, bounds=bounds)

print("Optimized parameters:", result.x)

我们可以针对自定义问题实施优化, 具体做法是去对目标函数进行定义, 并且配合着使用相关的操作。

四、对相关的约束条件加以利用, 以便实现优化的目标。

在实际的优化问题里面, 约束条件是一个不能少的部分。SciPy提供了能够处理约束条件的选项。

定义约束条件

约束的条件是可以变成等式的, 或者也可以是非等式的情况, 也就是说不等式的形式也是有可能的, 所以, 用户就必须要去根据自己具体的问题来定义相对应的约束函数。

def constrnt1(x):

return x[0] + x[1] - 10

constraints = {'type': 'ineq', 'fun': constraint1}

在进行优化操作的时候, 是需要去对约束条件作出应用的。

result_with_constraints = minimize(objective_function, initial_guess, bounds=bounds, constraints=constraints)

print("Optimized parameters with constraints:", result_with_constraints.x)

通过去定义那些约束的条件,并且把这些条件应用到优化的过程当中这一步操作上面来, 我们是可以把更加复杂的优化问题给解决掉的。

五、总结

为大家提供了多种方式来实现在最优化方面的好结果, 靠着使用SciPy这个库, 人们去解决那些线性的以及非线性的优化问题会显得比较方便。除此之外, 借助梯度下降算法和自定义目标函数, 使用者们能够较为灵活地去解决在各类情况下的最优化难题。

在实际运用到的场景里面去处理事情的时候, 合理地选择适合自身的优化算法以及相关的参数, 是获得最为理想的成果的一个关键因素。通过不间断地去做实践的操作以及去做出相应的调整, 使用者们能够在处于不同情形的优化环境当中去收获到最终的成就。

相关问答FAQs:

如何在中实现优化算法?

在当前的这个环境里面, 存在着好几种不同的程序库, 程序员能够拿这些东西来干活以完成优化算法的设计与执行任务, 其中比较常见的包括SciPy、NumPy以及另一个未写全名的库, SciPy这部库里头装载了许多专门用于优化的函数工具包, 它们主要用来帮忙解决各种最小化或者是最大化的计算难题, 只要人们去调用scipy.模块内部提供的具体功能接口, 就可以从众多策略中进行挑选, 好比说是梯度下降法或者是牛顿法这样的典型手段, 至于NumPy这一项资源, 它更多是负责处理那些需要数值的运算过程还有涉及矩阵层面的复杂操作, 这样一来就方便大伙儿根据自己的需求自行开发出个性化的优化方案。

此外, 像那些深度学习框架之类的东西, 它们里面也自带了一些优化器, 这些优化器呢, 是拿来处理那些比较复杂的机器学习任务的, 大家懂的。

大家经常想知道应该怎么选, 才能找到那个最适合用来优化的法子。

当选择优化算法的时候, 用户需要考虑问题的性质以及它的规模, 如果是小规模的问题, 并且问题是可微分的状态, 那么梯度下降和牛顿法是经常使用的算法类型, 相反, 如果遇到的是大规模的情况或者非线性问题, 这个时候遗传算法与模拟退火这种启发式的算法可能会更加合适, 另外, 处理约束优化的问题时, 拉格朗日乘数法或者是罚函数法也是被推荐的选择方式, 用户在决定选用哪种算法的过程当中, 也必须要把收敛速度还有计算资源这类因素考虑进去。

在中, 有哪些可视化工具可以帮助理解优化过程?

在中, 和这两个库是常用的数据可视化工具, 它们能够帮到用户, 使得用户可以直接看到优化这个过程的样子。通过把人家的函数画成图的样式, 用户就能看到优化的路径是咋样的, 还有收敛的这个情况是不是达到了要求。

并且的话, 使用像等这样的交互式可视化库去弄的话, 是可以弄出动态的那个图表的样子的, 这样便于大家深入地去进行分析这个优化算法的效果究竟是咋回事。把这些这些可视化的工具给结合在一块子的话, 用户能够更好地去明白这个优化算法的工作原理到底是啥, 还有最后的这个是啥结果的样子呢。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进