[英]Curve Fitting scipy
為什么這個配件這么差?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def fit(x, a, b, c, d):
return a * np.sin(b * x + c) + d
xdata = np.linspace(0, 360, 1000)
ydata = 89.9535 + 60.9535 * np.sin(0.0174 * xdata - 1.5708)
popt, pcov = curve_fit(fit, xdata, ydata)
plt.plot(xdata, 89.9535 + 60.9535 * np.sin(0.0174 * xdata - 1.5708))
plt.plot(xdata, fit(xdata, popt[0], popt[1], popt[2], popt[3]))
plt.show()
擬合的曲線看起來很奇怪,或者也許我很想念它,謝謝您的幫助。
結果如下:
curve_fit
查找最小二乘問題的局部最小值。 在這種情況下,有很多局部最小值。
解決此問題的一種方法是使用盡可能好的初始猜測。 對於具有多個局部最小值的問題, curve_fit
的默認值(默認值)可能非常糟糕。 對於您的功能,關鍵參數是b
,即頻率。 如果您知道該值會很小,即約為0.01,請使用0.01作為初始猜測:
In [77]: (a, b, c, d), pcov = curve_fit(fit, xdata, ydata, p0=[1, .01, 1, 1])
In [78]: a
Out[78]: 60.953499999999998
In [79]: b
Out[79]: 0.017399999999999999
In [80]: c
Out[80]: -102.10176491487339
In [81]: ((c + np.pi) % (2*np.pi)) - np.pi
Out[81]: -1.570800000000002
In [82]: d
Out[82]: 89.953500000000005
或者,僅繪制原始數據,然后使用它對參數進行初始猜測。 對於周期函數,可以很容易地估計周期和幅度。 在這種情況下,猜測不必太接近。
然后我在curve_fit中使用了這些:
popt, pcov = curve_fit(fit, xdata, ydata, [ 80., np.pi/330, 1., 1. ])
它返回的結果本質上是原始值。
array([ 6.09535000e+01, 1.74000000e-02, -1.57080000e+00,
8.99535000e+01])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.