मेरे पास इस तरह का डेटा है:

x = np.array([   0.  ,    3.  ,    3.3 ,   10.  ,   18.  ,   43.  ,   80.  ,
            120.  ,  165.  ,  210.  ,  260.  ,  310.  ,  360.  ,  410.  ,
            460.  ,  510.  ,  560.  ,  610.  ,  660.  ,  710.  ,  760.  ,
            809.5 ,  859.  ,  908.5 ,  958.  , 1007.5 , 1057.  , 1106.5 ,
            1156.  , 1205.5 , 1255.  , 1304.5 , 1354.  , 1403.5 , 1453.  ,
            1502.5 , 1552.  , 1601.5 , 1651.  , 1700.5 , 1750.  , 1799.5 ,
            1849.  , 1898.5 , 1948.  , 1997.5 , 2047.  , 2096.5 , 2146.  ,
            2195.5 , 2245.  , 2294.5 , 2344.  , 2393.5 , 2443.  , 2492.5 ,
            2542.  , 2591.5 , 2640.  , 2690.  , 2740.  , 2789.67, 2839.33,
            2891.5 ])
y = array([ 1.45  ,  1.65  ,  5.8   ,  6.8   ,  8.0355,  8.0379,  8.04  ,
           8.0505,  8.175 ,  8.3007,  8.4822,  8.665 ,  8.8476,  9.0302,
           9.528 ,  9.6962,  9.864 , 10.032 , 10.2   , 10.9222, 11.0553,
           11.1355, 11.2228, 11.3068, 11.3897, 11.4704, 11.5493, 11.6265,
           11.702 , 11.7768, 11.8491, 11.9208, 11.9891, 12.0571, 12.1247,
           12.1912, 12.2558, 12.3181, 12.3813, 12.4427, 12.503 , 12.5638,
           12.6226, 12.6807, 12.7384, 12.7956, 12.8524, 12.9093, 12.9663,
           13.0226, 13.0786, 13.1337, 13.1895, 13.2465, 13.3017, 13.3584,
           13.4156, 13.4741, 13.5311, 13.5899, 13.6498, 13.6533, 13.657 ,
           13.6601])

और इस तरह दिखें:

enter image description here

मुझे इस ट्रेंड के लिए कर्व फिटिंग बनाने की जरूरत है। मैं स्मूथिंग के लिए मूविंग एवरेज का उपयोग कर रहा हूं और इस तरह दिखता हूं:

enter image description here

जहां मैजेंटा रंग एमए है, और मैं बहुपद (5 वां ऑर्डो) का उपयोग कर रहा हूं और इस तरह दिखता हूं:

enter image description here

जहां नीला बहुपद का परिणाम है। मैंने उच्च ऑर्डो की कोशिश की है, लेकिन परिणाम खराब हो रहा है। मैं एक परिणाम कैसे प्राप्त कर सकता हूं जहां पहला बिंदु (0,0) है और इस तरह दिखता है (जैसे काला वक्र)?

enter image description here

यह मेरा कोड है:

import numpy as np
from scipy import interpolate
def movingaverage(interval, window_size):
     window= np.ones(int(window_size))/float(window_size)
     print(window)
     return np.convolve(interval, window, 'same')
y_av = movingaverage(y, 2)
X = np.arange(0,np.max(x),30).ravel()
yinter = interpolate.interp1d(x,y_av)(X)
z = np.poly1d(np.polyfit(x,y_av,5))
Y = z(X)
plt.figure(1)
plt.plot(xm,ym,'*-r')
plt.plot(xm,y_av,'.-m')
plt.plot(X,Y,'*-b')
1
Wahyu Hadinoto 19 मार्च 2021, 23:03

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा करने के लिए, आपको कुछ धारणा (न केवल बहुपद कार्य) के आधार पर अपने विश्लेषणात्मक कार्य (पैरामीटर के साथ) का उपयोग करना चाहिए। आप curve_fit फ़ॉर्म scipy.optimize का उपयोग करके अपने विश्लेषणात्मक फ़ंक्शन के अज्ञात पैरामीटर ढूंढ सकते हैं जो आपके इनपुट डेटा के लिए सबसे उपयुक्त हैं।

उदाहरण के लिए:

import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# your analytical function (theoretical function) with parameters: a, b (or more)
def your_analytical_func(x, a, b):
    return a * np.log(x + b) # this is just for example 
# or using anonymous (lambda) function
# your_analytical_func = lambda x, a, b: a * np.log(x + b)


# Fit for the parameters a, b (or more) of the function your_analytical_func:
popt, pcov = curve_fit(your_analytical_func, x, y)

plt.plot(x, y, 'r.', label='incoming data')
plt.plot(x, your_analytical_func(x, *popt), '-', color="black", label='fit: your_analytical_func(x, a=%5.3f, b=%5.3f)' % tuple(popt))
plt.legend()

enter image description here

2
Alexander Korovin 21 मार्च 2021, 01:05
आपके उत्तर के लिए धन्यवाद, बहुत मददगार। मेरा एक प्रश्न है, क्या मैं प्रत्येक डेटा सेट (100 से अधिक) के लिए स्वचालित रूप से कार्य कर सकता हूं?
 – 
Wahyu Hadinoto
20 मार्च 2021, 10:08
माफ़ करना। मुझे तुम्हारा प्रश्न समझ में नहीं आता। आपका क्या मतलब है "स्वचालित रूप से कार्य प्राप्त करें"? आमतौर पर, फिट होने के लिए, कुछ अनुमान की आवश्यकता होती है (कुछ सिद्धांत से)। इसलिए, उदाहरण के लिए, आप पैरामीटर के साथ एक फ़ंक्शन का उपयोग कर सकते हैं (उदाहरण के लिए, बहुपद फ़ंक्शन) जो प्रत्येक सेट के लिए भिन्न होते हैं।
 – 
Alexander Korovin
20 मार्च 2021, 10:56