0
我已經注意到一些不尋常的行爲時,試圖適應一些嘈雜的數據:當我改變陣列的長度,我得到瘋狂不同的擬合。奇怪的行爲在scipy.optimize.leastsq
import numpy as np
import matplotlib.pyplot as plt
# set up true function and "measured" data
x = np.linspace(0, 6e-2, 500);
A, k, theta = 10, 1.0/3e-2, np.pi/6;
y_true = A * np.sin(2 * np.pi * k * x + theta);
y_meas = y_true + 2*np.random.randn(x.size);
plt.plot(x, y_meas);
plt.plot(x, y_true);
plt.show()
哪個給出了這樣的形象:
我已經創造了一些輔助功能,然後我做了最小二乘法擬合:
# residual function, e_i
def residuals(p, y, x):
A, k, theta = p;
err = y - A * np.sin(2 * np.pi * k * x + theta);
return err;
def peval(x, p):
return p[0] * np.sin(2 * np.pi * p[1] * x + p[2]);
# starting values of A, k and theta
p0 = [12, 1/2.3e-2, np.pi/3];
print(np.array(p0));
# do least squares fitting
from scipy.optimize import leastsq
plsq = leastsq(residuals, p0, args=(y_meas, x));
print(plsq[0]); print(np.array([A, k, theta]));
繪製這給:
plt.plot(x, peval(x, plsq[0]))
plt.plot(x, y_meas,'ro')
plt.plot(x, y_true);
plt.title('Least-squares fit to noisy data');
plt.legend(['Fit', 'Noisy', 'True']);
當我改變我的設置爲:
x = np.linspace(0, 18e-2, 500);
A, k, theta = 10, 1.0/3e-2, np.pi/6;
y_true = A * np.sin(2 * np.pi * k * x + theta);
y_meas = y_true + 2*np.random.randn(x.size);
(即我三倍的時間,我衡量)的長度,然後運行該代碼的其餘部分,我得到的配合變爲:
我試圖單步調試代碼,但不能拿出這個例子失敗的原因。