2016-09-30 1 views
0

scipy.optimize.curve_fit을 시각적으로 명백한 데이터에 올바르게 입력 할 수 없습니다. 나는 매개 변수 값이 있어야 할 무엇을 대략 알고 내가 지정된 파라미터로 함수를 계산하면 계산과 실험 데이터는 잘 일치하는 표시 :Scipy.optimize가 내 데이터에 적합하지 않음

calculated and experimental data 나는 가장 작은 scipy.optimize.curve_fit 출력 매개 변수를 사용하지만

, 오류는 (시각적 인 검사로) 훨씬 나 빠지게됩니다. 적합 함수 출력의 예와 같이 내 초기 추측으로서 "알려진"매개 변수를 사용하여 상대적으로 좁은 윈도우 파라미터 바인딩 경우

example of output from fit function

나는 오차 값 ~ 10^2 배 수득 커지지 만 시각적 인 느낌의 외모가 더 좋아 보인다. 필자가 데이터를보기 좋게 볼 수있는 유일한 방법은 모든 매개 변수를 "알려진"매개 변수의 ~ 0.3 단위로 바인딩하는 것입니다. 필자는이 코드를 사용하여보다 복잡한 데이터에 맞도록 계획 했으므로 매개 변수를 미리 알지 못하므로 계산 된 플롯을 사용할 수 없습니다.

관련 코드는 아래에 포함되어 있습니다 :

import matplotlib.pyplot as plt 
import numpy as np 
import scipy 
from scipy.optimize import curve_fit 
d_1= 2.72 #Anstroms 
sig_cp_1= 0.44 
sig_int_1= 1.03 
d_1, sig_cp_1,sig_int_1=float(d_1),float(sig_cp_1),float(sig_int_1) 
Ref=[] 
Qz_F=[] 
Ref_F=[] 
g=open("Exp_Fresnal.csv",'rb')#"Test_Fresnal.csv", 'rb') 
reader=csv.reader(g) 
for row in reader: 
    Qz_F.append(row[0]) 
    Ref.append(row[1]) 
    Ref_F.append(row[2]) 
Ref=map(lambda a:float(a),Ref) 
Ref_F=map(lambda a:float(a),Ref_F) 
Qz_F=map(lambda a:float(a),Qz_F) 
Ref_F_arr=np.array((Ref_F)) 
Qz_arr=np.array((Qz_F)) 
x=np.array((Qz_arr,Ref_F)) 
def func(x,d,sig_int,sig_cp): 
    return (x[1])*(abs(x[0]*d*(np.exp((-sig_int**2)*(x[0]**2)/2)/(1-np.exp(complex(0,1)*x[0]*d)*np.exp((-sig_cp**2)*(x[0]**2)/2)))))**2 
DC_ref=func(x,d_1,sig_int_1,sig_cp_1) 
Y=np.array((Ref)) 
popt, pcov=curve_fit(func,x,Y,)#p0=[2.72,1.0,0.44]) 
perr=np.sqrt(np.diag(pcov)) 
print "par=",popt;print"Var=",perr 
Fit=func(x,*popt) 
Fit=func(x,*popt) 
Ref=np.transpose(np.array([Ref])) 
Qz_F=np.transpose(Qz_F) 

plt.plot(Qz_F, Ref, 'bs',label='Experimental') 
plt.plot(Qz_F, Fit, 'r--',label='Fit w/ DCM model') 
plt.axis([0,3,10**(-10),100]) 
plt.yscale('log') 
plt.title('Reflectivity',fontweight='bold',fontsize=15) 
plt.ylabel('Reflectivity',fontsize=15) 
plt.xlabel('qz /A^-1',fontsize=15) 
plt.legend(loc='upper right',numpoints=1) 
plt.show() 

배열은 파일에서 가져올 수 있습니다 (I 포함 할 수없는)와 맞춤이 왜곡 될 원인이 더 특이 사항이 없습니다. 어떤 도움을 주셔서 감사합니다.

편집 나는 코드와 함께 가야하지만, 당신이 MS-DOS .CSV

+1

입력 데이터가 없으므로 실제로 그래프를 생성하는 방법을 알지 못합니다 (적합도를 추정하는 데 사용되며 chisq가 더 좋습니다). 그래서 당신을 도우려는 것이 정말 어렵습니다. – Evert

+0

질문을 직접적으로 포함 시키십시오. 질문을 읽기 쉽고 독립형으로 만들 수 있습니다. – Evert

+0

복잡한 기능을 사용하면 적합을 위해 지역 최소로 걸리기 쉽습니다. – Evert

답변

3

@WarrenWeckesser has a really good point하지만, 더 노트로 다시 저장해야합니다 추가 코드와 input data을 포함 그 y 축 대수입니다. 오른쪽 상단의 거대한 오차는 크기가 1e-5 정도 인 반면 왼쪽 상단의 점은 약 0.1의 반사 값을가집니다. 꼬리에서 오는 제곱 오류는 왼쪽에있는 거대한 용어와 비교할 때 중요하지 않습니다.

나는 curve_fit이 위대한 작품이라고 확신합니다. 더 나은 시각적 적합성을 원한다면 모델의 log()으로 log(y)에 맞는 것을 시도하는 것이 좋습니다 (그 중 하나 또는 피팅 중 포인트를 가중시킵니다). 그 결과는 시각적으로 (그리고 물리적 관점에서) 더 안정적 일 수 있습니다. 시스템 전반에 대한 광범위한 스펙트럼 설명을 제공하려 할 것이므로 이것은 예상 한 것과 더 가깝습니다 (그러나 이것은 반사율이 높은 곳에서는 필연적으로 덜 정확하게 맞을 것입니다).

관련 문제