Reputation: 4499
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
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
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