【问题标题】:fit a sine curve to my data in python, matplotlib在 python,matplotlib 中为我的数据拟合正弦曲线
【发布时间】:2020-12-11 13:09:33
【问题描述】:

Here is my data in excel 我想将这些数据拟合成正弦曲线

这是我的代码,

#Fitting function
def func(x, offset, A, freq, phi):
    return offset + A * np.sin(freq * x + phi)

#Experimental x and y data points   
# test_df is the input excel df 
x_data = test_df['x_data']
y_data = test_df['y_data']


#Plot input data points
plt.plot(x_data, y_data, 'bo', label='experimental-data')

# Initial guess for the parameters
initial_guess = [.38, 2.3, .76, 2.77]    

#Perform the curve-fit
popt, pcov = curve_fit(func, x_data, y_data, initial_guess)
print(popt)

#x values for the fitted function
x_fit = np.arange(0.0, 31, 0.01)

#Plot the fitted function
plt.plot(x_fit, func(x_fit, *popt), 'r')

plt.show()

这是图表。 我认为这不是最合适的。我想提出改进曲线拟合的建议。

【问题讨论】:

标签: python matplotlib scikit-learn curve-fitting


【解决方案1】:

嗯,它似乎不是一个数学函数,例如对于参数值15,您可能有多个值(f(x) 等于什么?)。因此,它不会是经典 在这种情况下插值。如果你能以某种方式规范化数据,即用它制作一个函数,那么你可以使用 numpy。

最简单的方法是在参数值相等的地方添加一些小干扰。让我们看一下您的数据中的一个示例:

4   0.0326
4   0.014
4   -0.0086
4   0.0067

因此,如您所见,您无法判断 f(4) 的关系值是多少。如果您稍微打扰一下争论,例如:

3.9     -0.0086
3.95    0.0067
4       0.014
4.05    0.0326

对于您数据文件中的所有此类示例,依此类推。最简单的方法是通过它们的 x 参数、排序和干扰来分组这些值。

这显然会引入一些错误,但是,嗯……无论如何,你是曲线拟合,对吧?

要制定正弦,您必须知道幅度、频率和相位:f(x) = A * sin(F*x + p) 其中A 是幅度,F 是频率,@ 987654328@ 是相位。如果您准备了适当的数据集,Numpy 有专门的方法: How do I fit a sine curve to my data with pylab and numpy?

【讨论】:

  • ....一个输入的多个值....这就是为什么您要进行拟合而不是插值....
  • 有趣的观点,感谢您的时间。 x_data 是日期和 15th Jan/Feb 等有自己的价值。你建议的SO答案,我已经用过了。它很好,但不是很好。嗯......无论如何我都是曲线拟合,对吧?干杯!
  • 在数学意义上,我猜你和@mikuszefski 是对的,我刚刚看到了 numpy 的 API,在所有示例中,他们假设 y 是 x 的函数,而不仅仅是任何关系,因此建议了最简单的解决方案.此外,如果这些是日期,那么我们谈论的是离散域 - 在这种情况下为什么需要曲线?顺便说一句,如果答案有帮助但没有直接提供解决方案,我想你可以投票但不接受。不过不确定。
  • 很抱歉,尽管您的回答被排除在外,但我想指出您的建议没有意义。在真实的现场系统中(统计问题,n 次 1000 人或在相同条件下测量 1000 次物理值),一个输入参数给出统计分布的输出参数是绝对正常的。这就是为什么插值没有意义并在您的输入中引入人为随机性以避免相同 x 的多个 y 甚至更少......
  • ...拟合过程(大多数情况下是最小二乘法)通过将二次距离最小化为理论“真实”值来解决该问题。此外,具有离散的测量点并不意味着潜在的现象是不连续的。
猜你喜欢
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2019-09-04
  • 2012-06-07
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多