Optimize.curve.fit का उपयोग कर पैरामीटर मानों का आकलन करना

मैं गैर-रैखिक समीकरण के मानकों का अनुमान लगाने का प्रयास कर रहा हूं:

y(x1, x2) = x1/A + Bx1 + Cx2 

इस प्रश्न के उत्तर में उल्लिखित विधि का उपयोग करके, लेकिन मिल सकता है curve_fit फ़ंक्शन पर उचित रूप से एकाधिक स्वतंत्र चर को कैसे पास किया जाए, इस पर कोई प्रलेखन नहीं है।

विशेष रूप से, मैं पौधे की घनत्व (x1), और प्रतिद्वंद्वी (x2) की घनत्व के आधार पर पौधे बायोमास (वाई) का अनुमान लगाने का प्रयास कर रहा हूं। मेरे पास तीन घातीय समीकरण (फॉर्म वाई = ए [एक्स-एक्स (-बी * x1)] है) प्लांट घनत्व और पौधे बायोमास के बीच संबंधों के लिए, तीन प्रतियोगी घनत्व के लिए विभिन्न पैरामीटर मानों के साथ:

For x2 == 146: y = 1697 * [1 - exp(-0.010 * x1)]

For x2 == 112: y = 1994 * [1 - exp(-0.023 * x1)]

For x2 == 127: y = 1022 * [1 - exp(-0.008 * x1)]

इसलिए मैं इस तरह के कोड के साथ कोड लिखना चाहूंगा:

def model_func(self, x_vals, A, B, C):
    return x_vals[0]/(A + B * x_vals[0] + C * x_vals[1])

def fit_nonlinear(self, d, y):
    opt_parms, parm_cov = sp.optimize.curve_fit(self.model_func, [x1, x2], y, p0 = (0.2, 0.004, 0.007), maxfev=10000)
    A, B, C = opt_parms
    return A, B, C

हालांकि मुझे x_vals ( curve_fit के लिए प्रलेखन कहता है कि वाई एन-लम्बाई अनुक्रम होना चाहिए)। क्या मैं curve_fit के साथ संभव प्रयास कर रहा हूं?

0
पूर्व: वाई (x1, x2) x1 और x2 के लिए मान दिया गया एक एकल नंबर देता है। हालांकि, मुझे यकीन नहीं है कि वाई-मानों को एन-लम्बाई अनुक्रम के रूप में कैसे व्यवस्थित किया जाए ताकि एक्स-मानों के 2-आयामी मैट्रिक्स के साथ उनका संबंध स्पष्ट हो।
जोड़ा लेखक Scott B., स्रोत
मैं आपके प्रश्न को काफी समझ नहीं पा रहा हूं। क्या y (x1, x2) एक स्केलर फ़ंक्शन (यानी, दो नंबर x1 और x2 दिए गए हैं, यह एक एकल नंबर देता है? यदि ऐसा है, तो तर्क y को fit_nonlinear को द्वि-आयामी नहीं होना चाहिए। यदि y (x1, x2) को वेक्टर फ़ंक्शन माना जाता है (यह प्रत्येक x1, x2 जोड़ी के लिए दो संख्या देता है), तो आप इसे दो स्केलर फ़ंक्शन ( y1 (x1, x2) और y2 (x1, x2) ) में विभाजित कर सकते हैं और उन्हें प्रत्येक व्यक्तिगत रूप से फिट कर सकते हैं।
जोड़ा लेखक hunse, स्रोत

1 उत्तर

उपरोक्त आपकी टिप्पणी के आधार पर, आप matrices के फ्लैट संस्करणों का उपयोग करना चाहते हैं। यदि आप X1 और X2 मैट्रिस दोनों से एक ही तत्व लेते हैं, तो मानों की जोड़ी एक संबंधित वाई-मान है। यहां एक न्यूनतम उदाहरण दिया गया है

import numpy as np
import scipy as sp
import scipy.optimize

x1 = np.linspace(-1, 1)
x2 = np.linspace(-1, 1)
X1, X2 = np.meshgrid(x1, x2)

def func(X, A, B, C):
    X1, X2 = X
    return X1/(A + B * X1 + C * X2)

# generate some noisy points corresponding to a set of parameter values
p_ref = [0.15, 0.001, 0.05]
Yref = func([X1, X2], *p_ref)
std = Yref.std()
Y = Yref + np.random.normal(scale=0.1 * std, size=Yref.shape)

# fit a curve to the noisy points
p0 = (0.2, 0.004, 0.007)
p, cov = sp.optimize.curve_fit(func, [X1.flat, X2.flat], Y.flat, p0=p0)

# if the parameters from the fit are close to the ones used 
# to generate the noisy points, we succeeded
print p_ref
print p
0
जोड़ा