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

2024-06-08 23:20:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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

Tags: 功能numpy列表线性次数excel趋势results
3条回答

很晚才回复,但万一有人需要一个现成的函数:

scipy.stats.linregress

slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)

就像亚当·马普莱斯的回答一样。

来自yanl(另一个库)sklearn.metrics有一个^{}函数

from sklearn.metrics import r2_score

coefficient_of_dermination = r2_score(y, p(x))

numpy.polyfit文档来看,它适合线性回归。具体来说,具有“d”度的numpy.polyfit与均值函数的线性回归拟合

E(y | x)=p_d*x**d+p_d{d-1}*x**(d-1)+。。。+1*x+0磅

所以你只需要计算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

相关问题 更多 >