2015-06-11 78 views
0

我正在嘗試爲多個噪音正弦波創建平均線/最適合的線。這是我來產生所述正弦波代碼:試圖爲多個噪音正弦波找到最合適的線

import matplotlib.pyplot as plt 
import numpy as np 
from scipy.optimize import leastsq 



x = np.arange(0,10,.05) 
noise = np.random.normal(0,.05,200) 
wave = np.sin(x) 
y = noise + wave 

noise2 = np.random.normal(0,.05,200) 
y2 = noise2 + wave 

noise3 = np.random.normal(0,.05,200) 
y3 = noise3 + wave 


plt.plot(x, y) 
plt.plot(x, y2) 
plt.plot(x, y3) 
plt.xlabel('x-axis') 
plt.ylabel('y-axis') 

plt.show() 

的問題,當我在網上搜索我有/本網站的建議是,大多數人都在爲創建一組數據的最佳擬合線點,而不是多行。

任何意見將不勝感激,謝謝!

這是我到目前爲止已經試過:

guess_mean = np.mean(y) 
guess_std = 3.0*np.std(y)/(2**.5) 
guess_phase = 0 

first_guess= guess_std*np.sin(x+guess_phase) + guess_mean 

plt.plot(first_guess, label='first guess') 

,但是這是行不通的,我認爲它是因爲期間關閉。

+0

編輯帖子 –

回答

0

有幾種方法可以做到這一點。這是我認爲最簡單的實現。

首先,讓我們定義一個函數,它接受一個元組(a, b, c),並且發現的A * SIN(B * X + C)的擬合到每個的y, y1, y2總和。

def f(params): 
    y_hat = params[0] * np.sin(params[1] * x + params[2]) 
    return np.linalg.norm(y_hat - y) + np.linalg.norm(y_hat - y2) + np.linalg.norm(y_hat - y3) 

這樣,我們可以稱之爲scipy.optimize

import scipy.optimize as optimize 

>> optimize.minimize(f, [1,1,1]) 
    status: 0 
    success: True 
    njev: 28 
    nfev: 140 
hess_inv: array([[ 2.58018841e-03, -7.55654731e-05, 5.12200054e-04], 
     [ -7.55654731e-05, 2.40734497e-04, -1.23067851e-03], 
     [ 5.12200054e-04, -1.23067851e-03, 8.57449579e-03]]) 
     fun: 2.1219465700417786 
     x: array([ 0.99811506, -1.00102866, 3.14393633]) 
    message: 'Optimization terminated successfully.' 
    jac: array([ -1.46031380e-06, -7.89761543e-06, -1.75833702e-06]) 

對於一個全面的檢查,請嘗試解決方案([ 0.99811506, -1.00102866, 3.14393633]):

>> plot(0.99811506 * sin(-1.00102866 * x + 3.14393633)) 

enter image description here

比。嘈雜的數據:

enter image description here