簡體   English   中英

如何在python中擬合非線性數據

[英]How to fit non-linear data's in python

如何使用以下3種方法在Python使用scipy.optimize import curve_fit擬合非線性數據:

  1. 高斯。
  2. 洛倫茲(Lorentz)適合。
  3. 朗繆爾適合。

我只能夠從我的數據文件進行鏈接和繪圖。

from matplotlib import pyplot as plt
from matplotlib import style
import numpy as np
import pylab
from scipy.optimize import curve_fit
style.use('ggplot')
data = np.genfromtxt('D:\csvtrail3.csv', delimiter=',', skiprows=1)
x=data[:,0]
y=data[:,1]
data.fit_lorentzians()
plt.plot(x, y)
plt.title('Epic chart')
plt.ylabel('Y Axis')
plt.xlabel('X Axis')
plt.show()

請建議我如何提交此數據行。 我不想直接擬合。 我想要順滑。

通常,一旦我們知道最適合我們數據集的方程式, scipy.optimize.curve_fit可以工作。 由於要擬合遵循高斯,洛倫茲等分布的數據集,因此可以通過提供它們的特定方程式來實現。

舉一個小例子:

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

xdata = np.array([-2,-1.64,-1.33,-0.7,0,0.45,1.2,1.64,2.32,2.9])
ydata = np.array([0.69,0.70,0.69,1.0,1.9,2.4,1.9,0.9,-0.7,-1.4])

def func(x, p1,p2):
  return p1*np.cos(p2*x) + p2*np.sin(p1*x)

# Here you give the initial parameters for p0 which Python then iterates over
# to find the best fit
popt, pcov = curve_fit(func,xdata,ydata,p0=(1.0,0.3))

print(popt) # This contains your two best fit parameters

# Performing sum of squares
p1 = popt[0]
p2 = popt[1]
residuals = ydata - func(xdata,p1,p2)
fres = sum(residuals**2)

print(fres)

xaxis = np.linspace(-2,3,100) # we can plot with xdata, but fit will not look good 
curve_y = func(xaxis,p1,p2)
plt.plot(xdata,ydata,'*')
plt.plot(xaxis,curve_y,'-')
plt.show()

以上是針對我的特定情況的,其中我只使用了適合我的數據集的諧波加法公式 通過在func定義中提供高斯方程式或任何其他方程式,您可以進行相應的更改。

您的參數將相應地變化。 如果是高斯分布,您將擁有sigma (標准偏差)和mean作為未知參數。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM