ソフトウェア演習Ⅱ〔課題 3:回帰分析クラス〕青野雅樹 以下の問題に対する解答を、C++言語でのプログラム(Regression.cpp, Regression.h, Food.h, MainRegression.cpp 等)を作成し,プログラムと実行結果(kadai3.txt) をつけて Moodle にアップロードせよ。締め切りは 7 月 4 日(金)までとする。 100 g あ た り の い ろ い ろ な 食 物 の カ ロ リ ー や 炭 水 化 物 含 有 量 な ど の デ ー タ (http://www.kde.cs.tut.ac.jp/~aono/data/food.csv)がある。 ① このデータを読み込み、Food クラスを作成せよ。 ② カロリー(calorie)を炭水化物(carbon)の単回帰(Regression クラス)で 表現せよ。 ③ カロリーを脂質(fat)の単回帰で表現せよ。 ④ 2つの回帰モデルのどちらが「良い」回帰であるかを評価せよ。回帰のよさは、 【コ メントとヒント】で表現される寄与率で比較すること。 【コメントとヒント】 多変量データに対する線形回帰(単回帰、重回帰)は、データマイニングの基礎技術のひと つであり、適応範囲が広く有名な技術です。単回帰モデルは、目的変数を y として、1 個の説明変数 x を用いて n 個のサンプルから以下の式を推定することが目的です。 y ax b ε ここで、ε は誤差を表し、a と b は係数( a を回帰係数、b を回帰切片と呼ぶ)を意味し、 これらを推測することが単回帰の主たる問題となります。 今回のデータは 49 個の「食べ物」 データがあるので、 n 49 です。サンプルで式を書き直すと y i a xi b i となり、誤差の 2 乗和から、最小二乗法で a と b を推定します。最小二乗法の詳細は省略 と b )は、以下の S ( x のサンプル平方和)、 S ( y の しますが、 a と b の推定値( a xx yy サンプル正方和)、S xy( x と y のサンプル偏差積和)を用いて以下のように表現されます。 n n 、x 1 x 、y 1 y a S xy / S xx 、 b y ax i i n i 1 n i 1 n S xx xi x i 1 2 、 S yy n i 1 回帰の「良さ」は、誤差の平方和 Se R2 1 yi y y i 2 、 S xy b ) (ax i 2 x n i 1 i x yi y と定義したとき、 S yy aS xy Se (=寄与率)と定義され、この値が 1.0 に近いほど、寄与率が高い回帰であ S yy や b はサンプルデータから推定された回帰係数と切片です。 るとされます。なお、 a C++の Regression(回帰)クラスでは、少なくとも以下の値をクラスに保持してください。 これら以外のメンバ変数やメンバ関数は自由です。 private なメンバ変数、メンバ関数: (ア) 係数 a, b:(例:double 型) (イ) 寄与率 R2:(例:double 型) (ウ) X と y の平均値:(例:それぞれ double 型)途中計算で使用 public なメンバ変数、メンバ関数: (ア) Regression クラスのコンストラクタ(パラメータは自由とする) (イ) 係数 a, b, ならびに寄与率 R2 を計算しプリントし、呼び出し側に寄与 率(例:double 型)を返す関数 なお、main関数では、「食べ物」データを読み込み、Regressionクラスを呼び出すよう にしてください。その際、説明変数として、炭水化物、脂質、GI値などを選択できるよう にしておいてください。なお、前のページのURLで示したデータファイルは、各自の作業 ディレクトリにコピーして読みだしてください。課題では、②と③の カロリーを炭水化物で表す単回帰、と カロリーを脂質で表す単回帰 とで、Regressionクラスを合計2回生成し、それらのR2を比較し、どちらのR2が1.0に 近いかによって、回帰の良さを比較し、その部分もプリントしてください。データ数は以 下の実行例のように、外部から(コマンドラインなどから)明示的に与えても、動的に計 算しても結構です。 【プリント例】 以下は、GI値だけで単回帰を実行した例です。実際は、説明変数は炭水化物と脂質で実行 し、寄与率を比較してください。 $ g++ -Wall -o Regression Regression.cpp MainRegression.cpp $ ./Regression calorie.txt 49 ************************************* 課題3:青野雅樹, 01162069 (カロリーをGIで単回 500 帰を行った場合) 200 b(回帰切片) = -18.311 カロリー a(回帰係数) = 3.11671 300 400 ************************************* 0 R2(寄与率) = 1 – (Se/Syy) = 0.344 100 Se(誤差平方和) = 502832.9 20 40 60 GI 80
© Copyright 2024 ExpyDoc