我使用Python和Numpy来计算任意次的最佳拟合多项式。我传递了一个列表,其中包括x值、y值和我想要拟合的多项式的次数(线性、二次等)。
这很有效,但我还想计算r(相关系数)和r平方(决定系数)。我正在将我的结果与Excel的最佳拟合趋势线功能以及它计算出的r平方值进行比较。使用这个,我知道我可以正确地计算线性最佳拟合的r平方(度数等于1)。但是,我的函数不适用于次数大于1的多项式。
Excel可以做到这一点。如何使用Numpy计算高阶多项式的r-平方?
下面是我的函数:
import numpy
# Polynomial Regression
def polyfit(x, y, degree):
results = {}
coeffs = numpy.polyfit(x, y, degree)
# Polynomial Coefficients
results['polynomial'] = coeffs.tolist()
correlation = numpy.corrcoef(x, y)[0,1]
# r
results['correlation'] = correlation
# r-squared
results['determination'] = correlation**2
return results
发布于 2009-05-21 20:48:35
从numpy.polyfit文档中可以看出,它是拟合线性回归。具体地说,次数为'd‘的numpy.polyfit用均值函数拟合线性回归
E(y|x) = p_d * x**d + p_{d-1} *x **(d-1) + ... + p_1 *x+ p_
所以你只需要计算拟合的R平方。linear regression上的维基百科页面提供了完整的细节。您对R^2很感兴趣,可以用几种方法计算它,最简单的可能是
SST = Sum(i=1..n) (y_i - y_bar)^2
SSReg = Sum(i=1..n) (y_ihat - y_bar)^2
Rsquared = SSReg/SST
其中,我使用'y_bar‘作为y的平均值,使用'y_ihat’作为每个点的拟合值。
我对numpy不是很熟悉(我通常在R中工作),所以可能有一种更整洁的方法来计算R平方,但下面的方法应该是正确的
import numpy
# Polynomial Regression
def polyfit(x, y, degree):
results = {}
coeffs = numpy.polyfit(x, y, degree)
# Polynomial Coefficients
results['polynomial'] = coeffs.tolist()
# r-squared
p = numpy.poly1d(coeffs)
# fit values, and mean
yhat = p(x) # or [p(z) for z in x]
ybar = numpy.sum(y)/len(y) # or sum(y)/len(y)
ssreg = numpy.sum((yhat-ybar)**2) # or sum([ (yihat - ybar)**2 for yihat in yhat])
sstot = numpy.sum((y - ybar)**2) # or sum([ (yi - ybar)**2 for yi in y])
results['determination'] = ssreg / sstot
return results
发布于 2009-10-04 21:15:51
一个非常晚的回复,但以防有人需要一个现成的函数来做这个:
即
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)
就像@Adam Marples的答案一样。
发布于 2015-06-12 21:41:03
在yanl (另一个库)中,sklearn.metrics
有一个r2_score
函数;
from sklearn.metrics import r2_score
coefficient_of_dermination = r2_score(y, p(x))
https://stackoverflow.com/questions/893657
复制相似问题