库方法介绍
官方文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
方法的入参:
scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
fun:
求最小值的目标函数
x0:
变量的初始猜测值,如果有多个变量,需要给每个变量一个初始猜测值。
args:
常数值,fun中没有数字,都以变量的形式表示,对于常数项,需要在这里给值
method:
求极值的方法,官方文档给了很多种。一般使用默认。每种方法我理解是计算误差,反向传播的方式不同而已,这块有很大理论研究空间
constraints:
约束条件,针对fun中为参数的部分进行约束限制
from scipy.optimize import minimize
# 计算 1/x+x 的最小值
def fun(x):
return 1 / x[0] + x[0]
if __name__ == "__main__":
x0 = 2 #初始猜测值
res = minimize(fun, x0, method='SLSQP')
print(res.fun)
print(res.success)
print(res.x)
“”“
执行结果
2.0000000815356342
True
[1.00028559]
“””
力扣:
5463. 服务中心的最佳位置
https://leetcode-cn.com/problems/best-position-for-a-service-centre/
一家快递公司希望在新城市建立新的服务中心。公司统计了该城市所有客户在二维地图上的坐标,并希望能够以此为依据为新的服务中心选址:使服务中心 到所有客户的欧几里得距离的总和最小 。
给你一个数组 positions ,其中 positions[i] = [xi, yi] 表示第 i 个客户在二维地图上的位置,返回到所有客户的 欧几里得距离的最小总和
提示:
1 <= positions.length <= 50
positions[i].length == 2
0 <= positions[i][0], positions[i][1] <= 100
from scipy.optimize import minimize
class Solution:
def getMinDistSum(self, positions: List[List[int]]) -> float:
def getSum(x):
return sum(sqrt((x[0] - x1) ** 2 + (x[1] - y1) ** 2 ) for x1, y1 in positions)
return minimize(getSum, [50,50]).fun
拓展
全局最优的函数: scipy.optimize.basinhopping
有一个缺点是无法设置约束,求全局的最优解的函数
官方文档:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.basinhopping.html