1. ホーム
  2. python

[解決済み] PythonとNumpyを使ってr-2乗を計算するには?

2022-08-21 04:51:53

質問

PythonとNumpyを使って、任意の次数の最適な多項式を計算しています。 私はx値、y値、およびフィットしたい多項式(線形、二次、など)の次数のリストを渡します。

ここまではうまくいくのですが、r(相関係数)とr-squared(決定係数)も計算したいのです。 私は、Excel の最適なトレンド ライン機能、およびそれが計算する r2 乗の値と、私の結果を比較しています。 これを使うと、線形ベストフィット(次数が1)の場合は正しくr2乗を計算できていることがわかります。 しかし、私の関数は次数が 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

どのように解決するのですか?

からの numpy.polyfit のドキュメントを見ると、線形回帰のフィッティングを行っています。 具体的には、次数'd'のnumpy.polyfitは、平均関数を用いた線形回帰をフィットさせます。

E(y|x) = p_d * x**d + p_{d-1} * x **(d-1) + ... + p_1 * x + p_0

つまり、その適合度に対するR2乗を計算すればいいわけです。 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'、各ポイントのフィット値を'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