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

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

Question

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()
Was it helpful?

Solution

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

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top