[解決済み] PythonとNumpyを使ってr-2乗を計算するには?
質問
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
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonで文字列を小文字にするには?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] Pythonでファイルの読み込みと上書きをする