출처 : https://stackoverflow.com/questions/893657/how-do-i-calculate-r-squared-using-python-and-numpy
Python과 Numpy를 사용하여 r-제곱을 계산하는 방법?
Python과 Numpy를 사용하여 임의의 차수에 가장 적합한 다항식을 계산합니다. x값, y값 및 내가 맞추려는 다항식의 차수(선형, 2차 등) 목록을 전달합니다.
이것은 많은 효과가 있지만 r(상관 계수)과 r-제곱(결정 계수)도 계산하고 싶습니다. Excel의 최적 추세선 기능 및 제가 계산하는 r-제곱 값 결과와 비교하고 있습니다. 이것을 사용하여 선형 최적 맞춤(차수는 1과 같음)에 대해 r-제곱을 올바르게 계산하고 있다는 것을 알고 있습니다. 그러나 내 함수는 차수가 1보다 큰 다항식에서는 작동하지 않습니다.
엑셀로 이를 할 수 있습니다. Numpy를 사용하여 고차 다항식에 대한 r-제곱을 어떻게 계산합니까?
제가 만든 함수는 다음과 같습니다.
import numpy
# 다항 회귀
def polyfit(x, y, degree):
results = {}
coeffs = numpy.polyfit(x, y, degree)
# 다항 상관 계수
results['polynomial'] = coeffs.tolist()
correlation = numpy.corrcoef(x, y)[0,1]
# r
results['correlation'] = correlation
# r-제곱
results['determination'] = correlation**2
return results
12개 중 2개의 답변
numpy.polyfit 문서로부터 이는 선형 회귀에 적합(fit) 합니다. 특히, 차수가 'd'인 numpy.polyfit은 평균 함수를 사용하여 선형 회귀에 맞춥니다.
E(y|x) = p_d * x ** d + p_{d-1} * x ** (d-1) + ... + p_1 * x + p_0
따라서 해당 회귀에 적합(fit)하도록 R-제곱을 계산하기만 하면 됩니다. 선형 회귀에 대한 wikipedia 페이지는 자세한 내용을 제공합니다. 당신은 몇 가지 방법으로 계산할 수 있는 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의 평균으로 'y_bar'를 사용하고 각 점에 대한 맞춤(fit) 값으로 'y_ihat'을 사용합니다.
저는 numpy에 익숙하지 않습니다(저는 일반적으로 R에서 작업합니다). 따라서 R-제곱을 계산하는 더 깔끔한 방법이 있을 수 있지만 다음 방법은 정확할 것입니다.
import numpy
# 다항 회귀
def polyfit(x, y, degree):
results = {}
coeffs = numpy.polyfit(x, y, degree)
# 다항 상관 계수
results['polynomial'] = coeffs.tolist()
# r-제곱
p = numpy.poly1d(coeffs)
# 적합(fit) 값들과 평균
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
매우 늦은 답변이지만, 이를 위해 준비된 함수가 누군가는 필요할 것입니다.
예시
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)
'Python' 카테고리의 다른 글
함수 호출에서 별(*)과 쌍별(**) 연산자의 의미는 무엇입니까? (0) | 2021.09.26 |
---|---|
Python에서 enumerate()와 zip() 함께 사용하기 (2) | 2021.09.07 |
Python에서 날짜 범위를 반복하기 (0) | 2021.05.26 |
Unix 시간을 pandas dataframe에서 읽을 수 있는 날짜로 변환하기 (0) | 2021.05.17 |
pytorch에서 reshape와 view 간에 차이점은 무엇입니까? (0) | 2021.04.07 |