2013-11-22 64 views
1

我從文件讀取一些x和y數據,轉換爲浮點數並放入單獨的數組,然後調用scipy的曲線擬合函數。scipy曲線擬合 - 我遇到類型錯誤

它給了我不同的錯誤消息,這取決於我使用哪個方程(在定義的函數中)。我已經在我想使用的等式之後對代碼進行了評論,它是最高的,未註釋的等式(第9行)。

我可以理解爲什麼它可能需要一個浮點數而不是字符串,但我的類型轉換嘗試似乎沒有奏效。我最常見的錯誤是TypeError: a float is required

如果我試圖通過它的值不是從我的文件中讀取,而是使用np.linspace作爲我在scipy網站上找到的示例,它給了我一個不同的錯誤。

我已經評論了關於代碼的錯誤,我希望你覺得它是明確的。我也粘貼了我正在使用的輸入文本文件。

import sys 
import numpy as np 
import math as m 
from scipy.optimize import curve_fit 


def func(x, a, b): 
    return a*m.pow(x, 2)*np.exp(-b*x); #the function I want!: line 9 in funcTypeError:  a float is required 
    #return a*m.exp(-b*x)   #line 10 in func TypeError: a  float is required 
    #return a*np.exp(-b*x)   #Example equation. line 444 in _general_function 
            #ValueError:operands could not be broadcast together with shapes 
    #return a*b*m.pow(x, 2);   #line 10 in func TypeError: a float is required 

#end def 

file = sys.argv[1]; 

f = open(file); 
y_array = []; 
x_array = []; 

for line in f: 
    words = line.split();   
    x = words[0].rstrip('\r\n'); 
    y = words[1].rstrip('\r\n'); 
    x_array.append(float(x)); 
    y_array.append(float(y)); 
#end for 
#data = f.read(); 

popt, pcov = curve_fit(func, x_array, y_array); 

OR我嘗試這從他們給SciPy的網站上的例子,我的上面,未加註釋,所需式

x = np.linspace(0,4,50) 
y = func(x, 2.5, 1.3) 
yn = y + 0.2*np.random.normal(size=len(x)) 
popt, pcov = curve_fit(func, x, yn) 

#TypeError: only length-1 arrays can be converted to Python scalars. 

輸入文件(只有幾行,還有更多)。數字

352 28 
423 30 
494 32 
565 3 
636 0 
707 0 

回答

4

x的兩列列表,你打電話就可以了math.powmath.pow只知道如何提高漂浮物或可轉換爲漂浮物的東西。因此,TypeError: a float is required。這是我們有numpy的原因之一。 :^)

通過與numpy在整個工作,我們可以使這更簡單。然後我們可以簡單地使用**來獲取整個陣列的功率。

def func(x, a, b): 
    return a * x**2 * np.exp(-b*x) 

file = sys.argv[1] 
x,y = np.loadtxt(file, unpack=True) 
popt, pcov = curve_fit(func, x, y) 

給我

>>> popt 
array([ 1., 1.]) 
>>> pcov 
inf 

與您的數據,這是不是很基本符合該功能。這個例子效果更好:

>>> x = np.linspace(0,4,50) 
>>> y = func(x, 2.5, 1.3) 
>>> yn = y + 0.2*np.random.normal(size=len(x)) 
>>> popt, pcov = curve_fit(func, x, yn) 
>>> popt 
array([ 3.15537828, 1.43218611]) 
>>> pcov 
array([[ 0.08045745, 0.01257863], 
     [ 0.01257863, 0.00232191]]) 
+0

謝謝,是的,你的例子正在工作。我實際上並不需要x值,這似乎混淆了它,所以使用x = linspace(1,len(y),len(y))。它的行爲如我現在所期望的那樣。 它提供了一些警告:RuntimeWarning:在exp中遇到溢出,RuntimeWarning:在multiply中遇到溢出 - 是否可以忽略這些? 非常感謝您的幫助x – James

+0

這是一個單獨的問題,但忽略它可能並不安全。請記住,你只能使用小於大約700的浮點數的指數。 – DSM