前回は,回帰直線を数学的に詳しく学びました。今回は前回の知識を使って,Java言語で回帰直線のグラフを描きましょう。Officeソフトで回帰直線を得ることと,Java言語のプログラムで回帰直線を得ることの比較は,電卓での計算と筆算での計算の比較に例えられます。2つの結果が等しい,あるいは非常に近ければ,それぞれの方法が正しく実行されたかどうかの確認になります。
サンプルのソースコードが少々長くなりますが,解答の必要な部分はわずかです。是非ともくじけずに取り組んでみてください。
問題 最小二乗法を用いて,回帰直線の定数を求め,データにフィットするグラフを描きましょう。
今回の問題で示すソースコードには,最小二乗法を計算する部分のコードが欠落しています。コードを補充して完成させてください。
できる限り短いコードにするために,GUIでプログラムを終了させるためのコードを含みません。Windows上で実行中ならコマンドプロンプトのウインドウをアクティブにし,CTRL+C(※1)のキー操作でプログラムを終了する必要があります。その他のOS上で実行中なら,プロセスをkillして終了させてください。
今回読み込むデータは次のCSV(※2)ファイルです。各行にひとつの座標値(x,y)が記述されています。このデータファイルをテキストエディタで作成して,Sample_RegLine.javaと同じディレクトリにファイル名"data001.csv"として保存してください。
データファイル data001.csv
- 100,120
- 200,195
- 278,280
コンパイル時には,ソースコードの5行目に示した-Xlint:uncheckedというオプション(※3)を忘れずに付けてください。Java言語の古い規格を使用していますので,このオプション無しにはコンパイルが許可されません。コンパイルが許可されませんから,実行に必要なクラスファイルが作成されません。
正しくプログラムを作成したとしても,次のような警告を表示します。
C:\>javac Sample_RegLine.java -Xlint:unchecked
Sample_RegLine.java:126: 警告:[unchecked] raw 型java.util.Vector のメンバとしてのadd(E) への無検査呼び出しです。
Data.add(pos);
^
Sample_RegLine.java:145: 警告:[unchecked] raw 型java.util.Vector のメンバとして
のadd(E) への無検査呼び出しです。
v.add(rdata);
^
注:Sample_RegLine.java は推奨されないAPI を使用またはオーバーライドしています。
注:詳細については,-Xlint:deprecation オプションを指定して再コンパイルしてください。
警告2個
今回のプログラムが正しく実行されると,次の出力と別ウインドウに表示されるグラフ(図61.1)を得ることができます。
C:\>java Sample_RegLine
y=ax+b
value of a = 0.4660083326656518
value of b = 125.40942232192933
バッチジョブを終了しますか(Y/N)? y
「バッチジョブを~」はCTRL+Cで表示されますので,yキーを押し,エンターキーを打ってください。グラフが画面から消えて,プログラムが終了します。グラフ右上の×ボタンを押してもプログラムは終了しません。この出力は,第59回の図59.9でOfficeソフトを使った結果とまったく同じです。
- ※1)
- 先ず,CTRLキーを押さえ,そのままCキーを押さえる操作です。実行中のプログラムを中断するときに使います。
- ※2)
- Comma Separated Values。コンマで区切られたテキストデータの記録形式です。ほとんどのデータベースや表計算ソフトで読み込み・保存が可能です。
- ※3)
- Sunのjavacコマンドに関するマニュアルページには,”Java言語仕様で指定されている未検査変換警告の詳細を示します。”と書かれています。現在のJava言語の規格では,今回のサンプルプログラムで用いたようなコードの書き方は推奨しないのですが,このオプションをつけることで,警告をプログラマに与えた上でコンパイルは許可してくれます。「注意はしたからね。あとはあなたの責任で実行してね」ということです。

