calculate coefficient of determination (R2) and root mean square error (RMSE) for non linear curve fitting in python

StackOverflow https://stackoverflow.com/questions/20115272

Pregunta

How to calculate coefficient of determination (R2) and root mean square error (RMSE) for non linear curve fitting in python. Following code does until curve fitting. Then how to calculate R2 and RMSE?

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()
¿Fue útil?

Solución

You could do it like this:

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

This is taking the definitions directly, as for example in the wikipedia: http://en.wikipedia.org/wiki/Coefficient_of_determination#Definitions

Otros consejos

Martin Böschen, not y but yn here:

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

And read this about root-mean-square error (RMSE): http://en.wikipedia.org/wiki/Regression_analysis

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

Now it calculates as Excel 2003 Analysis ToolPak.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top