我正在尝试将sin函数绘制到数据集中。我使用scipy.optimize在线发现了一个教程,但即使我完全复制了代码,它似乎也无法工作。
在顶部:
def func(x, a, b, c, d):
return a * np.sin(b * (x + c)) + d
最后:
scipy.optimize.curve_fit(func, clean_time, clean_rate)
pylab.show()
输出窗口上没有行。
如果有人想要屏幕或全部代码,请随时在下面发表评论。
谢谢!
答案 0 :(得分:7)
当然它没有绘制任何东西,curve_fit
没有绘制。
在文档中,curve_fit
的返回值是具有估计参数的数组和具有估计协方差矩阵的2d数组。您必须自己使用估计参数绘制拟合函数。
我还建议适合a*sin(bx +c) +d
,因为b和c不相关。
这有效:
import matplotlib.pyplot as plt
import numpy as np
from numpy.random import normal
from scipy.optimize import curve_fit
x_data = np.linspace(0, 2*np.pi, 30)
y_data = np.sin(x_data) + normal(0, 0.2, 30)
def func(x, a, b, c, d):
return a * np.sin(b*x + c) + d
parameter, covariance_matrix = curve_fit(func, x_data, y_data)
x = np.linspace(min(x_data), max(x_data), 1000)
plt.plot(x_data, y_data, 'rx', label='data')
plt.plot(x, func(x, *parameter), 'b-', label='fit') # the star is to unpack the parameter array
plt.show()
这是结果:
答案 1 :(得分:1)
我有一个示例代码,其中包含正弦曲线形式的数据和适合数据的用户定义函数。
以下是代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import math
xdata = np.array([2.65, 2.80, 2.96, 3.80, 3.90, 4.60, 4.80, 4.90, 5.65, 5.92])
ydata = np.sin(xdata)
def func(x,p1,p2,p3): # HERE WE DEFINE A SIN FUNCTION THAT WE THINK WILL FOLLOW THE DATA DISTRIBUTION
return p1*np.sin(x*p2+p3)
# 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,1.0,1.0)) #THESE PARAMETERS ARE USER DEFINED
print(popt) # This contains your two best fit parameters
# Performing sum of squares
p1 = popt[0]
p2 = popt[1]
p3 = popt[2]
residuals = ydata - func(xdata,p1,p2,p3)
fres = sum(residuals**2)
print(fres) #THIS IS YOUR CHI-SQUARE VALUE!
xaxis = np.linspace(1,7,100) # we can plot with xdata, but fit will not look good
curve_y = func(xaxis,p1,p2,p3)
plt.plot(xdata,ydata,'*')
plt.plot(xaxis,curve_y,'-')
plt.show()