具有边界约束的 scipy.optimize.leastsq

2023-12-20

我正在寻找 scipy/numpy 中的优化例程,它可以解决非线性最小二乘型问题(例如,将参数函数拟合到大型数据集),但包括边界和约束(例如参数的最小值和最大值)优化)。目前我正在使用 mpfit 的 python 版本(翻译自 idl...):这显然不是最佳的,尽管它工作得很好。

python/scipy/等中的高效例程可能会很棒! 这里非常欢迎任何意见:-)

thanks!


scipy.optimize.least_squares http://scipy.github.io/devdocs/generated/scipy.optimize.least_squares.html在 scipy 0.17 中(2016 年 1 月) 处理边界;使用那个,而不是这个黑客。


边界约束可以很容易地变成二次的, 并通过最小化与其余部分一起最小化。
假设您想要最小化 10 个平方之和 Σ f_i(p)^2, 所以你的 func(p) 是一个 10 向量 [f0(p) ... f9(p)],
并且还希望 0 考虑“tub 函数” max( - p, 0, p - 1 ), 0 .. 1 内部为 0,外部为正值,就像 \_____/ 浴缸一样。
如果我们给leastsq13 长向量

[ f0(p), f1(p), ... f9(p), w*tub(p0), w*tub(p1), w*tub(p2) ]

当 w = 100 时,它将最小化手数的平方和: 桶将限制 0 下面的代码只是一个运行的包装器leastsq例如这样一个 13 长的向量就最小化了。

# leastsq_bounds.py
# see also test_leastsq_bounds.py on gist.github.com/denis-bz

from __future__ import division
import numpy as np
from scipy.optimize import leastsq

__version__ = "2015-01-10 jan  denis"  # orig 2012


#...............................................................................
def leastsq_bounds( func, x0, bounds, boundsweight=10, **kwargs ):
    """ leastsq with bound conatraints lo <= p <= hi
    run leastsq with additional constraints to minimize the sum of squares of
        [func(p) ...]
        + boundsweight * [max( lo_i - p_i, 0, p_i - hi_i ) ...]

    Parameters
    ----------
    func() : a list of function of parameters `p`, [err0 err1 ...]
    bounds : an n x 2 list or array `[[lo_0,hi_0], [lo_1, hi_1] ...]`.
        Use e.g. [0, inf]; do not use NaNs.
        A bound e.g. [2,2] pins that x_j == 2.
    boundsweight : weights the bounds constraints
    kwargs : keyword args passed on to leastsq

    Returns
    -------
    exactly as for leastsq,
http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html

    Notes
    -----
    The bounds may not be met if boundsweight is too small;
    check that with e.g. check_bounds( p, bounds ) below.

    To access `x` in `func(p)`, `def func( p, x=xouter )`
    or make it global, or `self.x` in a class.

    There are quite a few methods for box constraints;
    you'll maybe sing a longer song ...
    Comments are welcome, test cases most welcome.

"""
    # Example: test_leastsq_bounds.py

    if bounds is not None  and  boundsweight > 0:
        check_bounds( x0, bounds )
        if "args" in kwargs:  # 8jan 2015
            args = kwargs["args"]
            del kwargs["args"]
        else:
            args = ()
#...............................................................................
        funcbox = lambda p: \
            np.hstack(( func( p, *args ),
                        _inbox( p, bounds, boundsweight ))) 
    else:
        funcbox = func
    return leastsq( funcbox, x0, **kwargs )


def _inbox( X, box, weight=1 ):
    """ -> [tub( Xj, loj, hij ) ... ]
        all 0  <=>  X in box, lo <= X <= hi
    """
    assert len(X) == len(box), \
        "len X %d != len box %d" % (len(X), len(box))
    return weight * np.array([
        np.fmax( lo - x, 0 ) + np.fmax( 0, x - hi )
            for x, (lo,hi) in zip( X, box )])

# def tub( x, lo, hi ):
#     """ \___/  down to lo, 0 lo .. hi, up from hi """
#     return np.fmax( lo - x, 0 ) + np.fmax( 0, x - hi )

#...............................................................................
def check_bounds( X, box ):
    """ print Xj not in box, loj <= Xj <= hij
        return nr not in
    """
    nX, nbox = len(X), len(box)
    assert nX == nbox, \
        "len X %d != len box %d" % (nX, nbox)
    nnotin = 0
    for j, x, (lo,hi) in zip( range(nX), X, box ):
        if not (lo <= x <= hi):
            print "check_bounds: x[%d] %g is not in box %g .. %g" % (j, x, lo, hi)
            nnotin += 1
    return nnotin
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有边界约束的 scipy.optimize.leastsq 的相关文章

随机推荐

  • 在非开发层预览邮件程序

    我在下面有几个邮件预览spec mailer previews On development我可以查看下面的所有预览 rails mailers 但是默认情况下 其他环境中不存在此功能 我想在staging环境并排队这篇文章在这里 http
  • Android中的缩放、旋转和平移操作后如何获取相对于Parent的View位置?

    我正在开发一项功能 其中包括图像缩放 旋转和平移操作 所有这些操作对我来说都运行良好 现在 我需要检查相对于父级的视图位置 我开发了以下代码来获取缩放和翻译后的视图位置 private fun findViewPosition view V
  • 如何在react.js中递归渲染子组件

    我想从其自己的组件中递归添加一个反应组件 我看到了这个例子这是通过子 TreeNodes 进行映射并以相同的方式添加子节点 不幸的是它对我来说根本不起作用 这个想法是有一个简单的评论组件 并且回复将重用相同的组件 var Comment R
  • 是否可以在 MatLab 中使用 .NET 应用程序?

    我对 C 感觉很熟悉 我将设计一个控制台应用程序 该应用程序将从 Web 服务中获取一些数据 我想让一组科学家使用 MatLab 中的数据 实现此目的的一种方法是将其存储在 HDD 上的文件中 然后将其内容加载到 MatLab 中 但这让我
  • getJSON 回调未触发

    我正在通过参与一个包括 SubSonic 和 jQuery 的测试项目来学习 asp net mvc 我遇到的问题是 每次我想要返回的不仅仅是简单字符串 例如 Json 对象 时 我都会遇到困难 因为回调似乎不会触发 或者返回失败 我获取数
  • 德语最好的 MySQL 排序规则是什么

    我正在用德语建立一个网站 所以我将使用像 等等 那么您有什么建议呢 这个答案已经过时了 如需完整的表情符号支持 请参阅这个答案 https stackoverflow com a 48325386 2898712 至于字符集 如果可以的话
  • Tibco - 最大流量限制属性

    我有一个启用了最大流量限制的进程 该值设置为 10 它是一个异步进程 用于每天获取数千条消息 我们注意到 在高峰期 随着EMS服务器队列中消息的增加 tibco进程的性能下降 Tibco 的速度缓慢与 EMS 消息流入的增加之间是否存在任何
  • std::vector 的比较运算符无法找到 T 的比较运算符

    以下非常简单的代码将无法编译 include
  • 使用flutter_bloc库有什么缺点

    BLoC 模式的实现有很多版本 其中之一是 Felix Angelov 的 flutter bloc 在一个社交媒体上 我看到了这样的声明 flutter bloc 对于该项目来说不是一个好的选择 应该选择另一个 BLoC 或另一个状态管理
  • 使用纯 sed 进行复杂的列转置

    我尝试了几个小时才找到pure sed questions tagged sed解决方案this https stackoverflow com q 17384781 2468910问题 显然 不幸的是我没有成功 一个非常棘手的问题 示例
  • 如何在 Excel 中对齐两列中的匹配值,并在其他列中引入关联值

    我想知道如何将一列中的值与另一列中的匹配值对齐 如下所示如何在 Excel 中对齐同一行上的重复项 https stackoverflow com questions 12836396 how to align duplicates on
  • 什么时候应该在 LLVM IR 中向结构添加填充?什么时候不应该?

    当向结构添加填充时 Clang 在不同情况下有不同的行为 规则是什么 对于下面的 C 代码 struct CT1 char c1 c double d1 char c2 struct CT2 char c1 double d1 char c
  • SWT 如何打印scrolledComposite 的内容?

    有谁知道如何打印滚动复合材料的内容 每当我打印到 GC 上时 它只会复制滚动复合材料的当前可视区域 我想要的是能够复制滚动复合的全部内容 例如 下面的代码在一个小窗口内创建了一个巨大的按钮 当我打印下面的 gc 时 它只会输出滚动复合的小可
  • 将新行追加到现有 csv 文件中[重复]

    这个问题在这里已经有答案了 我想将新行添加到系统中现有的 csv 文件中 下面是 MWE 首先 创建一个数据表并将其写入文件 date lt 2017 08 01 investPercent lt 20 expenses lt 20000
  • Java列表参数化?

    我对 Java 很陌生 我写了一个名为 DLPFile 的类 它基本上是其他对象的容器 如字符串 整数 浮点数等 将我的文件放入列表中 然后将其保存在我的会话 来自 Map 类 变量中时很容易 DLPFile file new DLPFil
  • 如何将 .jar 文件安装到 Eclipse 中?

    我已经编写了一个 Eclipse 插件项目并成功导出了 jar 文件 但是当我将 jar 文件复制到 Plugins 文件夹中 也尝试了 dropins 文件夹 并重新启动 Eclipse 后 我仍然无法在 Eclipse Installa
  • sqlalchemy:类型错误:创建实例的不可散列类型,sqlalchemy

    我在尝试更新代码时遇到错误 https github com thrisp flask security https github com thrisp flask security从Python 2 7到3 3 给出以下最基本的实例 te
  • ASCII 转换

    我想将 ASCII 值转换为其相应的字符 所以我编写了这个简单的代码 public class Test public static void main String args int i 0 char ch c for i 0 i lt
  • 如何使用 Symfony2 表单清除字段值

    我正在编写自己的验证码类 当表单未验证时 出于显而易见的原因 我不想用之前的答案预先填充验证码输入 我只想在渲染之前清除输入 我发现了data选项仅适用于默认值 默认值会被用户输入的内容覆盖 我尝试了以下代码 form gt get cap
  • 具有边界约束的 scipy.optimize.leastsq

    我正在寻找 scipy numpy 中的优化例程 它可以解决非线性最小二乘型问题 例如 将参数函数拟合到大型数据集 但包括边界和约束 例如参数的最小值和最大值 优化 目前我正在使用 mpfit 的 python 版本 翻译自 idl 这显然