1

我想要適合以下功能:將信噪比enter image description here降到我的數據中。 C1,C2和h是我需要從leastsq方法獲得的參數。 C1和C2很簡單,但問題是我的h(t)實際上是:Function based on B-Splines。我想獲得的是函數內部的係數hj(在我的例子中有35個不同的hj)。該函數是不同基底B樣條的總和,每個樣條加權不同,係數數量等於B樣條的結點數量。正如我想獲得C1,C2和h1..35我執行以下操作:leastsq麻煩傳遞參數Python

funcLine = lambda tpl, eix_x: (tpl[0]*np.sin((4*math.pi*np.sum(bsplines_evaluades * np.transpose([tpl[2],tpl[3],tpl[4],tpl[5],tpl[6],tpl[7],tpl[8],tpl[9],tpl[10],tpl[11],tpl[12],tpl[13],tpl[14],tpl[15],tpl[16],tpl[17],tpl[18],tpl[19],tpl[20],tpl[21],tpl[22],tpl[23],tpl[24],tpl[25],tpl[26],tpl[27],tpl[28],tpl[29],tpl[30],tpl[31],tpl[32],tpl[33],tpl[34],tpl[35],tpl[36],tpl[37]]) , axis=0))*eix_x/lambda1) + tpl[1]*np.cos((4*math.pi*np.sum(bsplines_evaluades * np.transpose([tpl[2],tpl[3],tpl[4],tpl[5],tpl[6],tpl[7],tpl[8],tpl[9],tpl[10],tpl[11],tpl[12],tpl[13],tpl[14],tpl[15],tpl[16],tpl[17],tpl[18],tpl[19],tpl[20],tpl[21],tpl[22],tpl[23],tpl[24],tpl[25],tpl[26],tpl[27],tpl[28],tpl[29],tpl[30],tpl[31],tpl[32],tpl[33],tpl[34],tpl[35],tpl[36],tpl[37]]) , axis=0))*eix_x/lambda1))*np.exp(-4*np.power(k, 2)*lambda_big*np.power(eix_x, 2)) 
func = funcLine 
ErrorFunc = lambda tpl, eix_x, ydata: np.power(func(tpl, eix_x) - ydata,2) 
tplFinal1, success = leastsq(ErrorFunc, [2, -2, 8.2*np.ones(35)], args=(eix_x, ydata)) 

TPL(0)= C1,TPL(1)= C2和TPL(2..35)=我的係數。 bsplines_evaluades是一個矩陣[35,86000],其中每行是每個基b樣條的時間函數,所以我用每個行的各個係數加權,86000是eix_x的長度。 ydata(eix_x)是我想要近似的函數。 lambda1 = 0.1903; lambda_big = 2; K = 2 * PI/lambda1。輸出是與邏輯不同的初始參數。 任何人都可以幫助我嗎?我也嘗試過curvefit,但它不起作用。 數據位於:http://www.filedropper.com/data_5>http://www.filedropper.com/download_button.png width = 127 height = 145 border = 0 />
http://www.filedropper。 COM>在線備份存儲

編輯 代碼現在的問題是:

lambda1 = 0.1903 
k = 2 * math.pi/lambda1 
lambda_big = 2 
def funcLine(tpl, eix_x): 
    C1, C2, h = tpl[0], tpl(1), tpl[2:] 
    hsum = np.sum(bsplines_evaluades * h, axis=1) # weight each 
    theta = 4 * np.pi * np.array(hsum) * np.array(eix_x)/lambda1 
    return (C1*np.sin(theta)+C2*np.cos(theta))*np.exp(-4*lambda_big*(k*eix_x)**2) # lambda_big = 2 
if len(eix_x) != 0: 
    ErrorFunc = lambda tpl, eix_x, ydata: funcLine(tpl, eix_x) - ydata 
    param_values = 7.5 * np.ones(37) 
    param_values[0] = 2 
    param_values(1) = -2 
    tplFinal2, success = leastsq(ErrorFunc, param_values, args=(eix_x, ydata)) 

的問題是,輸出參數不相對於最初的那些改變。數據(X_AXIS,YDATA,bsplines_evaluades): gist.github.com/hect1995/dcd36a4237fe57791d996bd70e7a9fc7 gist.github.com/hect1995/39ae4768ebb32c27f1ddea97e24d96af gist.github.com/hect1995/bddd02de567f8fcbedc752371b47ff71

回答

0

它總是有幫助的(對自己以及我們)提供可讀的例子足夠完整,可以運行。您的lambda s和很長的行的例子絕對不可讀,因此您很容易錯過簡單的錯誤。使用Python的一個要點是使代碼更易於閱讀。

可以將樣條係數作爲擬合變量,但您希望將變量的np.ndarray精確爲一維。所以你的參數數組應該是

param_values = 8.2 * np.ones(37) 
param_values[0] = 2 
param_values[1] = -2. 
result_params, success = leastsq(errorFunc, param_values, ....) 

也應該可以使用curve_fit()了。除此之外,很難提供很多幫助,因爲既沒有給出完整的可運行程序(留下很多未定義的術語),也沒有運行代碼的輸出或錯誤消息。

+0

非常感謝您的評論,下次我將嘗試更好地解釋(我將在本文中進行編輯以闡明它)。現在的問題是,在最少次數之後輸出參數沒有改變的參數的初始值並不重要。你知道我該如何發佈我擁有的數據(表格),以便人們可以嘗試嗎? –

+0

你的代碼仍然使用lambda,並且有很多未定義的變量(k,lambda1,lambda_big,bsplines_evaluades)。它不能由其他人運行。您仍然沒有發佈輸出或錯誤消息。對於發佈數據,許多人使用github gists或其他類似的服務。 –

+0

但是,現在我可以對你的代碼進行排序了:如果bsplines_evaluades是一個數組(看起來像是),那麼你的擬合不會取決於你的35個參數的個別值,而只取決於總和他們給。也就是說,你實際上並不使用'h',只使用'hsum'。那是故意的嗎?它肯定會使適合的結果對大多數這些值不太敏感。 –

0

有幾件事情可能是錯在這裏:我m不確定你是否正確索引tpl陣列(如果它有37個條目,索引應該是0:36)。你的errorFunc可能應該返回殘差而不是殘差。

最後,我認爲你的h-sum可能不正確:你想總結$ N $軸而不是$ x $軸,對吧?

如下你可能會整理你的代碼,看看是否有幫助(沒有一些數據很難測試自己):

def funcLine(tpl, eix_x): 
    C1, C2, h = tpl[0], tpl[1], tpl[2:] 
    hsum = np.sum(bsplines_evaluades * h, axis=1) 
    theta = 4 * np.pi * hsum * eix_x/lambda1 
    return (C1 * np.sin(theta) + C2 * np.cos(theta)) * np.exp(-4 *lambda_big * 
       (k * eix_x)**2) 

errorFunc = lambda tpl, eix_x, ydata: funcLine(tpl, eix_x) - ydata 
tplFinal2, success = leastsq(errorFunc, [2, -2, 8.2*np.ones(35)], 
          args=(eix_x, ydata)) 
+0

你是對的0:36左右。我忘了在我的問題中改變它。一旦我有所有的基本樣條,並且每一個樣本都被它乘以它的權重,我想添加所有的基礎貢獻,每次我有一個86000的數組。我會嘗試你所說的,但提供數據很難提供很多數據,但我會嘗試 –

+0

Data:gist.github.com/hect1995/dcd36a4237fe57791d996bd70e7a9fc7 gist.github.com/hect1995/39ae4768ebb32c27f1ddea97e24d96af gist.github.com/hect1995/bddd02de567f8fcbedc752371b47ff71 –