2015-11-24 49 views
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() 

哪個給出了這樣的形象:

Noisy Data

我已經創造了一些輔助功能,然後我做了最小二乘法擬合:

# 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']); 

Least squares fit to noisy data

當我改變我的設置爲:

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); 

(即我三倍的時間,我衡量)的長度,然後運行該代碼的其餘部分,我得到的配合變爲:

Very bad fit

我試圖單步調試代碼,但不能拿出這個例子失敗的原因。

回答

1

,如果你與最初的猜測

p0=[12.0, 35.0, 0.39269908169872414] 

嘗試它會在兩種情況下工作。您使用的初始參數是殘差> 60e3。

請記住,增加點數會改變問題,如果您檢查https://en.wikipedia.org/wiki/Least_squares中的非線性最小二乘方法,您可以看到執行最小化時存在點數總和,所以它不是不尋常的是,當添加更多點時,適合不起作用。