2964502
2964502

Reputation: 4499

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

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()

Upvotes: 3

Views: 11413

Answers (2)

Volodimir Kopey
Volodimir Kopey

Reputation: 600

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.

Upvotes: 0

Martin Böschen
Martin Böschen

Reputation: 1789

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

Upvotes: 6

Related Questions