= ∑ = ∑ ∑ ∑ ∑

ソフトウェア演習Ⅱ〔課題 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