2013-10-31 39 views
7

我有一組數據點(下面的代碼中的x和y),我試圖通過我的要點創建最適合的線性線。我正在使用scipy.optimize.curve_fit。我的代碼產生一條線,但不是最適合的線。我試着給函數模型參數用於我的漸變和截取,但每次產生完全相同的線條,不適合我的數據點。爲什麼scipy.optimize.curve_fit不會爲我的觀點提供最適合的線條?

藍點是我的數據點的紅線應安裝:

enter image description here

如果有人能指出我要去的地方錯了,我會非常感激:

import numpy as np 
import matplotlib.pyplot as mpl 
import scipy as sp 
import scipy.optimize as opt 

x=[1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7] 
y=[6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828] 
trialX = np.linspace(1.0,4.0,1000)       #Trial values of x 

def f(x,m,c):          #Defining the function y(x)=(m*x)+c 
    return (x*m)+c 

popt,pcov=opt.curve_fit(f,x,y)      #Returning popt and pcov 
ynew=f(trialX,*popt)             

mpl.plot(x,y,'bo') 
mpl.plot(trialX,ynew,'r-') 
mpl.show() 
+0

我自己設法弄清楚了這個問題。 x被定義爲一個列表,而不是一個數組。我通過將np.array放在定義的x和y數組的前面來修復它。 –

+0

我得出同樣的結論李子,我應該先看到這個評論!下次發生這種情況時,請隨時將其發佈爲您自己問題的答案並接受。 – Hooked

+0

請注意,這已被修補:https://github.com/scipy/scipy/issues/3037 – Hooked

回答

4

您可以選擇使用numpy.polyfit獲得最適合的線條:

import numpy as np 
import matplotlib.pyplot as mpl 

x=[1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7] 
y=[6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828] 
trialX = np.linspace(1.0,4.0,1000)       #Trial values of x 

#get the first order coefficients 
fit = np.polyfit(x, y, 1) 

#apply 
ynew = trialX * fit[0] + fit[1]            

mpl.plot(x,y,'bo') 
mpl.plot(trialX,ynew,'r-') 
mpl.show() 

這裏是輸出:enter image description here

+0

你可以通過改變擬合線來縮放這個答案:'fit_poly = np.poly1d(np.polyfit(x ,y,1))'和'ynew = fit_poly(trialX)'。如果您稍後想要,則可以更輕鬆地更改爲二次方。 – Hooked

+2

我給了你另一個upvote,這應該足以將圖片添加到你的後續帖子(並編輯這一個)。歡迎來到堆棧溢出!你不需要添加諸如「希望這會有所幫助」之類的東西,如果是的話,你會得到投票,如果不是的話,你會得到要求澄清的提示或評論。我們儘量保持答案的清潔! – Hooked

2

編輯:這種行爲現在已經在SciPy的當前版本的補丁,使.curve_fit多一點萬無一失:

https://github.com/scipy/scipy/issues/3037


對於一些原因,.curve_fit真的希望輸入是一個numpy數組,並且會給你錯誤的結果,如果你將它傳遞給一個常規列表(恕我直言,這是意想不到的行爲,可能是一個錯誤)。的x定義更改爲:

x=np.array([1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7]) 

,你會得到:

enter image description here

我猜測,因爲m*x,其中M爲整數且x的發生是一個列表將產生一m副本那個清單,顯然不是你要找的結果!

+0

這聽起來像是curve_fit中的一個bug:你會在https://github.com/scipy/scipy上提出問題嗎? –

+0

@ Zhenya我一直在想它,它不是一個錯誤,但它對於新用戶來說是意想不到的。因此,https://github.com/scipy/scipy/issues/3037 – Hooked

+0

注意:f是**你的**功能,並且curve_fit只是將你的** x傳遞給它。所以,你應該檢查你的函數是否適合你的數據。 :) – user333700