scipy.optimize.least_squares scipy 0.17 (जनवरी 2016) हैंडल सीमाओं में है; इसका उपयोग करें, यह हैक नहीं।
बाउंड की कमी को आसानी से द्विघात बनाया जा सकता है और बाकी के साथ leastsq द्वारा कम से कम।
आप 10 वर्गों Σ f_i (पी)^2 की राशि कम करना चाहते हैं कहो, तो अपने समारोह (पी) एक 10 वेक्टर [f0 (पी) ... F9 (पी)],
और भी है 0 पैरामीटर के लिए 0 < = p_i < = 1 चाहते हैं।
"टब फ़ंक्शन" अधिकतम (- पी, 0, पी -1), पर विचार करें जो 0 के अंदर 0 है .. 1 और बाहर सकारात्मक, \ \_____/टब की तरह।
अगर हम leastsq
13-लंबे वेक्टर
[ f0(p), f1(p), ... f9(p), w*tub(p0), w*tub(p1), w*tub(p2) ]
w के साथ
= 100 कहना देते हैं, यह बहुत कुछ के वर्गों का योग कम कर देंगे: टब विवश होगा 0 < = पी < = 1. जनरल लो < = पी < = हाय समान है।
निम्नलिखित कोड सिर्फ एक रैपर है जो 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
धन्यवाद! मेरी समस्या के लिए आने वाले दिनों में इस बनाम mpfit का परीक्षण करेगा और Asap की रिपोर्ट करेगा! – user1293231
बस slsqp की कोशिश की। मैं इसे ठीक से उपयोग नहीं कर सकता लेकिन मूल रूप से यह बहुत अच्छा नहीं करता है। बहुत कम ईपीएसलॉन मानों का उपयोग करते समय यह क्रैश प्रतीत होता है। और अन्यथा मेरे इनपुट पैरामीटर में कुछ भी (या लगभग) नहीं बदलता है। मैं कुछ डीबगिंग करूँगा, लेकिन ऐसा लगता है कि इसका उपयोग करना इतना आसान नहीं है (अब तक)। आगे की कोशिश करेंगे। – user1293231
असल में मुझे बस निम्न त्रुटि ==> लाइनशर्च के लिए सकारात्मक दिशात्मक व्युत्पन्न प्राप्त होता है (निकास मोड 8)। यही कारण है कि मैं कहीं भी नहीं मिल रहा हूं .... बहुत उपयोगी नहीं। कोई संकेत? – user1293231