Python有效地找到多个多项式的局部最大值/最小值

2023-12-28

我正在寻找一种有效的方法来查找多个(> 100万)但独立的四阶多项式的局部最小值给定/指定范围/边界.

我有两个要求:

R1:即使对于 100 万个不同的多项式方程也有效

R2:局部最小值精确到 0.01(即 2dp)

这是我使用创建的一些代码scipy。没关系,但我想知道是否有其他更好的软件包可以执行此类任务在我进行并行编程之前。

为了说明我的问题,让我们首先从一个多项式开始:

下面我试图在 (-5, 5) 范围内找到 4x^4 + 6x^3 + 3x^2 + x + 5 的局部最小值。

在我的笔记本电脑上,大约需要 2 毫秒才能找到本地最小值(约为 -0.72770502)。

对于一个多项式来说时间还可以,但我想要更快的速度,因为我需要定期执行此操作超过 100 万次。

from scipy import optimize
import numpy as np

# Define a objective and gradient function for 4th order polynomial
# x is the value to be evaluated
# par is a numpy array of len 5 that specifies the polynomial coefficients.
def obj_grad_fun_custom(x,par):
    obj = (np.array([x**4,x**3,x**2,x**1,1]) * par).sum()
    grad = (np.array([4*x**3,3*x**2,2*x,1]) * par[:-1]).sum()
    return obj, grad

# Try minimise an example polynomial of 4x^4 + 6x^3 + 3x^2 + x + 5
# with contrainted bound
res = optimize.minimize(
    fun = obj_grad_fun_custom,
    x0 = 0,
    args=(np.array([4,6,3,1,5])), # polynomial coefficients
    jac=True ,
    bounds=[(-2, 10)],
    tol=1e-10)
print(res.x)

# Timing (this takes about 2 ms for me)
%timeit optimize.minimize(fun = obj_grad_fun_custom, x0 = 0, args=(np.array([4,6,3,1,5])), jac=True, bounds=[(-5, 5)], tol=1e-10)

下面是我计划对 100 万个不同的 4 阶多项式进行常规操作,我希望在本地最小化这些多项式。希望有人能给我指出一个比scipy。或者还有其他替代方法吗?谢谢!

# Multiple polynomials
result = [] # saving the local minima
poly_sim_no = 1000000 #ideally 1 million or even more
np.random.seed(0)
par_set = np.random.choice(np.arange(10), size=(poly_sim_no, 5), replace=True) #generate some order 4 polynomial coefficients 

for a in par_set:
    res = optimize.minimize(obj_grad_fun_custom, 0,args=(a), jac=True ,bounds=[(-5, 5)], tol=1e-10)
    result.append(res.x)

print(result)

由于您要查找多项式的最小值,因此您可以利用以下事实:获取多项式的导数很容易,并且有许多很好的算法可以查找多项式的根。

它的工作原理如下:

  1. 首先,求导数。所有最小值点的导数都为零。
  2. 寻找那些零,也就是找到导数的根。
  3. 一旦我们有了候选者名单,请检查解决方案是否真实。
  4. 检查解决方案是否在您设置的范围内。 (我不知道你添加边界是因为你实际上想要边界,还是为了让它运行得更快。如果是后者,请随意删除这一步。)
  5. 实际上用多项式评估候选者并找到最小的一项。

这是代码:

import numpy as np
from numpy.polynomial import Polynomial

def find_extrema(poly, bounds):
    deriv = poly.deriv()
    extrema = deriv.roots()
    # Filter out complex roots
    extrema = extrema[np.isreal(extrema)]
    # Get real part of root
    extrema = np.real(extrema)
    # Apply bounds check
    lb, ub = bounds
    extrema = extrema[(lb <= extrema) & (extrema <= ub)]
    return extrema

def find_minimum(poly, bounds):
    extrema = find_extrema(poly, bounds)
    # Note: initially I tried taking the 2nd derivative to filter out local maxima.
    # This ended up being slower than just evaluating the function.

    # Either bound could end up being the minimum. Check those too.
    extrema = np.concatenate((extrema, bounds))
    # Check every candidate by evaluating the polynomial at each possible minimum,
    # and picking the minimum.
    value_at_extrema = poly(extrema)
    minimum_index = np.argmin(value_at_extrema)
    return extrema[minimum_index]

# Warning: polynomial expects coeffients in the opposite order that you use.
poly = Polynomial([5,1,3,6,4]) 
print(find_minimum(poly, (-5, 5)))

在我的计算机上这需要 162 微秒,比 scipy.optimize 解决方案快大约 6 倍。 (问题中显示的解决方案在我的计算机上需要 1.12 毫秒。)

编辑:更快的替代方案

这是一种更快的方法。然而,它放弃了边界检查,使用了已弃用的 API,并且通常更难以阅读。

p = np.poly1d([4,6,3,1,5])  # Note: polynomials are opposite order of before

def find_minimum2(poly):
    roots = np.real(np.roots(poly.deriv()))
    return roots[np.argmin(poly(roots))]

print(find_minimum2(p))

其计时速度为 110 微秒,比原始速度快大约 10 倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python有效地找到多个多项式的局部最大值/最小值 的相关文章

随机推荐

  • 从浏览器中删除cookie

    如何在asp net c 中从浏览器中删除cookie 就是这样 if Request Cookies MyCookie null HttpCookie myCookie new HttpCookie MyCookie myCookie E
  • 行尾有一个字母单词(对齐)

    我想知道如果文本行末尾有一个字母单词我能做什么 例如 Hello my name is John Smith and I am a freshman 如何将 I 移动到下一行 并调整整行 因为当我把 br 然后证明崩溃的合理性 这是jsfi
  • XCode自动生成注释?

    每次当我在 XCode 中创建一个新文件时 它都会在文件顶部做出一些注释 最近它发生了某种变化 我不知道为什么以及如何重置它 现在是这样的 Filename cpp Projectname Created by Name on Date C
  • 为什么 setMap(null) 不起作用 google 地图 api v3?

    我正在使用谷歌地图 API 3 9 在应用程序中 用户可以添加标记或删除标记 当用户单击地图时 将显示信息窗口 用户可以在其中输入名称 纬度 经度 然后单击保存图像 如下所示 google maps event addListener ma
  • Git:创建新分支并推送到远程的有效步骤

    我想出了步骤 但看起来很麻烦 采取bitbucket例如 假设我已经有一个名为prj 我从服务器端 bitbucket com 分支一个新项目 名为prj bz 从本地我添加添加远程git remote add prj bz https b
  • 在 SLURM 中运行没有顶级脚本的二进制文件

    在 SGE PBS 中 我可以像在本地一样向集群提交二进制可执行文件 例如 qsub b y cwd echo hello 将提交一个名为 echo 的作业 该作业将单词 hello 写入其输出文件 我如何向 SLURM 提交类似的工作 它
  • 删除所有行,从 /pattern/ 之后的两行开始

    假设我有一个文件如下 drink eat XXX pizza blunzn sushi 我想从文件中删除所有行 从模式后的第三行开始XXX 所以结果应该是这样的 drink eat XXX pizza blunzn 删除之后的所有行XXX很
  • Hibernate Criteria n+1 最大结果问题

    使用 hibernate ctiteria 我想选择一个对象及其关联的 oneToMany 对象列表 我想对此列表进行分页 以避免可怕的休眠 n 1 选择问题 这是一个可行的解决方案 需要 10 个父对象对数据库进行 11 次访问 Crit
  • PHP登录系统硬编码用户名和密码

    我必须做一个基本的登录系统来保护页面 并且我无法访问数据库 所以我将用户名和密码硬编码存储在 php 页面中 我的问题是 这个登录系统能抵御攻击吗 我需要它保持大约1个月 任何改进建议都会有所帮助 该代码不在 Laravel 中 即使它看起
  • Nuxt部署错误:服务器资源不可用

    为了在 ssr 模式下部署我们的 nuxt 网站 我们首先在 bitbucket 管道中构建和单元测试网站 如果测试成功 我们将构建文件从 bitbucket 服务器复制到我们的生产服务器并触发启动 问题是 Nuxt 文档没有说明服务器上需
  • 与同时使用 minmax_element 相比 min_element 和 max_element 是否有任何效率优势?

    std minmax element 返回一个对 其中包含一个到最小元素的迭代器作为第一个元素 一个到最大元素的迭代器作为第二个元素 std min element 返回一个迭代器到范围 first last 中的最小元素 std max
  • 如何向我的 Linq 选择添加唯一的行号?

    我有以下代码 public IEnumerable
  • Django 1.5:访问 models.py 中的自定义用户模型字段

    我正在开发 Django 1 5 项目 我有一个自定义用户模型 我们称之为CustomUser 另一个应用程序 SomeApp 需要引用此自定义用户模型 为了ForeignKey等的目的 Django文档说使用 User settings
  • 连接两个字符数组?

    如果我有两个像这样的字符数组 char one 200 char two 200 然后我想做第三个连接这些的我该怎么做呢 我努力了 char three 400 strcpy three one strcat three two 但这似乎不
  • 使用 MultipartEntity 构造 POST 请求

    我想构造一个多部分请求 具有以下参数 名称 字符串 电子邮件 字符串 和文件上传 文件 我正在使用下面的 Java 代码 在 Android 中工作 httppost getRequestLine 打印 POST http www myur
  • Shell 重定向与显式文件处理代码

    我的母语不是英语 所以请原谅这个问题的尴尬标题 我只是不知道如何更好地表达它 我在 FreeBSD 机器上 我有一个用以下语言编写的小过滤工具C它通过读取数据列表stdin并通过输出处理后的列表stdout 我像这样调用它 find typ
  • 为什么微调器中的 onNothingSelected 没有被调用?

    我有一个 Android Spinner 当用户在显示 Spinner 的选择面板时按 后退键 时 我想监听该事件 我已经实现了 OnItemSelectedListener 但按后退键时未调用 onNothingSelected Adap
  • Django 的 mod_wsgi 错误:从守护进程读取响应标头时超时

    我正在运行 Django 2 0 4 和 mod wsgi 4 5 20 当我尝试将站点部署到我们的开发环境时 出现错误 parature 奇怪的是 该站点部署在根目录下VirtualHost正在正常响应 Tue Apr 10 13 34
  • 如何在字段级别创建元注释?

    我有这个带注释的休眠类 Entity public class SimponsFamily Id TableGenerator name ENTITY ID GENERATOR table ENTITY ID GENERATOR TABLE
  • Python有效地找到多个多项式的局部最大值/最小值

    我正在寻找一种有效的方法来查找多个 gt 100万 但独立的四阶多项式的局部最小值给定 指定范围 边界 我有两个要求 R1 即使对于 100 万个不同的多项式方程也有效 R2 局部最小值精确到 0 01 即 2dp 这是我使用创建的一些代码