2013-11-21 4 views
3

파이썬에서 비선형 커브 피팅에 대한 결정 계수 (R2) 및 RMSE를 계산하는 방법. 다음 코드는 커브 피팅 때까지 수행됩니다. 그런 다음 R2와 RMSE를 계산하는 방법은 무엇입니까?파이썬의 비선형 커브 피팅에 대한 결정 계수 (R2) 및 RMSE (root mean square error)를 계산하십시오.

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

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

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

popt, pcov = curve_fit(func, x, yn) 

plt.figure() 
plt.plot(x, yn, 'ko', label="Original Noised Data") 
plt.plot(x, func(x, *popt), 'r-', label="Fitted Curve") 
plt.legend() 
plt.show() 
+0

statsmodels 개발자 중 한 사람의이 [post] (https://github.com/scipy/scipy/issues/2962)에 따르면'scipy.stats.linregress'의'std_err'은 실제로 기울기 계수. 이 값은 RMSE와 같지 않습니다. RMSE는 자유도에 따라 실제로 달라지는 값인 0.5 (잔차 제곱의 평균)입니다. – pylang

+0

아니요, scipy 문서에 따르면 SE는 추정치의 표준 오차입니다. http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html#scipy.stats.linregress – Borys

+0

내가 제공 한 링크에서 제공 한 scipy doc의 작성자가이 정의를 다룹니다. 그의 게시물은 scipy의 SE가 경사면의 오류임을 확인합니다. – pylang

답변

5

이처럼 할 수있는 :

print "Mean Squared Error: ", np.mean((y-func(x, *popt))**2) 

ss_res = np.dot((yn - func(x, *popt)),(yn - func(x, *popt))) 
ymean = np.mean(yn) 
ss_tot = np.dot((yn-ymean),(yn-ymean)) 
print "Mean R :", 1-ss_res/ss_tot 

이것은 위키 피 디아 예를 들면로 직접 정의를 취하고있다 : http://en.wikipedia.org/wiki/Coefficient_of_determination#Definitions

+0

빠른 교정 : 링크 된 위키피디아 페이지에 따르면, "평균 R"에 대한 값은 실제로 R^2입니다. –

0

마틴 Böschen하지 y 그러나 여기 yn :

np.mean((y-func(x, *popt))**2) 

그리고 이것에 대해 제곱 평균 제곱 오차 (RMSE) 읽기 : http://en.wikipedia.org/wiki/Regression_analysis

residuals = yn - func(x,*popt) 
print "RMSE",(scipy.sum(residuals**2)/(residuals.size-2))**0.5 

가 지금은 Excel 2003의 분석 도구로 계산합니다.

관련 문제