2013-11-21 3 views
3

Как рассчитать коэффициент определения (R2) и среднеквадратичную ошибку (RMSE) для филирования нелинейной кривой в python. Следующий код делает до подгонки кривой. Затем, как вычислить R2 и RMSE?вычислить коэффициент определения (R2) и среднеквадратичную ошибку (RMSE) для подгонки нелинейной кривой в python

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

В соответствии с этим [сообщение] (https://github.com/scipy/scipy/issues/2962) от одного из разработчиков statsmodels, 'std_err' из' scipy.stats.linregress' на самом деле является ошибкой в коэффициент наклона. Это значение не совпадает с 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 вы дали адреса этого определения. Его сообщения подтверждают, что SE scipy является ошибкой на склоне. – 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

Быстрая коррекция: согласно странице wikipedia, которую вы связали, значение, которое вы даете для «Среднее R», на самом деле является R^2. –

0

Martin Бошен, не y но yn здесь:

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

И прочитал это о среднеквадратическая ошибка (СКО): 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 пакета анализа.