首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Python和Numpy计算r平方?

如何使用Python和Numpy计算r平方?
EN

Stack Overflow用户
提问于 2009-05-21 15:55:54
回答 8查看 311.9K关注 0票数 122

我使用Python和Numpy来计算任意次的最佳拟合多项式。我传递了一个列表,其中包括x值、y值和我想要拟合的多项式的次数(线性、二次等)。

这很有效,但我还想计算r(相关系数)和r平方(决定系数)。我正在将我的结果与Excel的最佳拟合趋势线功能以及它计算出的r平方值进行比较。使用这个,我知道我可以正确地计算线性最佳拟合的r平方(度数等于1)。但是,我的函数不适用于次数大于1的多项式。

Excel可以做到这一点。如何使用Numpy计算高阶多项式的r-平方?

下面是我的函数:

代码语言:javascript
复制
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
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 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很感兴趣,可以用几种方法计算它,最简单的可能是

代码语言:javascript
复制
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平方,但下面的方法应该是正确的

代码语言:javascript
复制
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
票数 75
EN

Stack Overflow用户

发布于 2009-10-04 21:15:51

一个非常晚的回复,但以防有人需要一个现成的函数来做这个:

scipy.stats.linregress

代码语言:javascript
复制
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)

就像@Adam Marples的答案一样。

票数 163
EN

Stack Overflow用户

发布于 2015-06-12 21:41:03

在yanl (另一个库)中,sklearn.metrics有一个r2_score函数;

代码语言:javascript
复制
from sklearn.metrics import r2_score

coefficient_of_dermination = r2_score(y, p(x))
票数 65
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/893657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档