Transcript Document

情報基礎Ⅱ/基礎工学Ⅲ
(第10回)
月曜4限
担当:北川 晃
平均値と標準偏差
n個のデータx1, x2, …, xnが与えられている.
データを逐次読み込んで,その平均値と
標準偏差を求めよ.
平均値:
標準偏差:
平均値と標準偏差:具体例
(i) N≧2のとき
:平均値
:標準偏差
プログラミング演習
• 外部データ’normal_data.txt’よりデータ点数および
各データを読み込んで,それらの平均値を計算す
るプログラムを作れ.
• 上記のプログラムをSubプロシージャに書き直し,平
均値を計算するプログラムを作れ.
出力例:平均値の計算
プログラム例:平均値の計算
Dim a(100), ave As Single, s As Single = 0, n As Integer
Dim ReadText As New IO.StreamReader( _
"D:\…\normal_data.txt", System.Text.Encoding.Default)
n = ReadText.ReadLine()
For i As Integer = 1 To n
a(i) = ReadText.ReadLine()
Next
データ点数の
読み込み
データを配列
へ読み込む
For i As Integer = 1 To n
データの和の計算
s = s + a(i)
Next
ave = s / n
平均値の計算
Console.WriteLine("平均はE={0,8}", ave)
ReadText.Close()
例題:平均値を求める関数副プログラム
データ点数nとa(i) (i=1,…,n)を引数として,それらの
平均値を返す関数副プログラムを作れ.
関数プロシージャの引数には,配列を取ることも可能.
配列
Sub Main()
Dim a(10), ave As Single, n As Integer
…
ave = average(n,a)
…
End Sub
配列
Function average(n,a)
…
Return ave0
配列
End Function
平均値を求める関数副プログラム:プログラム例
Sub Main()
Dim a(10000), ave As Single, n As Integer
Dim ReadText As New IO.StreamReader( _
"D:\…\normal_data.txt", System.Text.Encoding.Default)
n = ReadText.ReadLine()
For i As Integer = 1 To n
a(i) = ReadText.ReadLine()
Next
ReadText.Close()
ave = average(n, a)
Console.WriteLine("平均はE={0,8}", ave)
End Sub
平均値を求める関数副プログラム:プログラム例
Function average(n, a)
Dim s As Single = 0, ave As Single
For i As Integer = 1 To n
s = s + a(i)
Next
ave = s / n
Return ave
End Function
関数副プロシージャで,
以下のものは宣言不要
• 共通に宣言した変数
• 関数の仮引数
プログラミング演習(再)
• 外部データ’normal_data.txt’よりデータ点数および
各データを読み込んで,それらの平均値を計算す
るプログラムを作れ.
• 上記のプログラムをSubプロシージャに書き直し,平
均値と標準偏差を計算するプログラムを作れ.
• さらに,標準偏差を計算する部分もSubプロシー
ジャとして記述し,プログラムを書き直せ.
Subプロシージャとは
• 主プログラムの一部を外部の副プログラムに移す
• 繰り返し同じ記述をする場合などに有効
• Functionプロシージャとは異なり,
主プログラムに値は返さない
• 主プログラムと変数のやりとりをすることもできる
Mainプログラムも,
プログラムで
Sub Main()
Subプロシージャの一つ
共有する変数は,
…
Mainよりも外で
プロシージャ名(変数)
…
宣言する
End Sub
Sub プロシージャ名(変数)
値は返さないので,
文ブロック
“Return *”はいらない
End Sub
Subプロシージャの例
Sub Main()
For i As Integer = 1 To 20
If i - (i \ 3) * 3 = 0 Then
fizz(i)
‘fizz’という名の
Else
Subプロシージャ
Console.WriteLine(i)
を呼び出す
End If
Next
End Sub
iの値と,’Fizz’と
書き出すプログラム
Sub fizz(i)
Console.WriteLine("{0} Fizz", i)
End Sub
Subプロシージャの例:出力例
標準偏差の計算:考え方
• 平均値の計算のプログラムより,データの和,
平均値の計算,平均値の書き出しの部分を
Subプロシージャとして,分離する.
• 配列’a()’,変数’ave’はSubプロシージャでも用いるので,
共通の変数として宣言する.
• その他,Main()で用いる変数,Subプロシージャで
用いる変数などを整理する.
• 標準偏差の計算部分を加える.
出力例:標準偏差の計算
プログラム例:標準偏差の計算
Dim a(100), ave As Single
Sub Main()
Dim var, sd As Single, s2 As Single = 0, n As Integer
Dim ReadText As New IO.StreamReader( _
"D:\…\normal_data.txt", System.Text.Encoding.Default)
データ点数の
読み込み
n = ReadText.ReadLine()
For i As Integer = 1 To n
a(i) = ReadText.ReadLine()
Next
データを配列
へ読み込む
average(n)
平均値の計算
For i As Integer =
s2 = s2 + a(i)
Next
var = s2 - n * ave
sd = Math.Sqrt(var
1 To n
^ 2
二乗の和の計算
^ 2
/ n)
標準偏差の計算
プログラム例:標準偏差の計算(続き)
Console.WriteLine("標準偏差は{0,8}", sd)
標準偏差の
書き出し
ReadText.Close()
End Sub
Sub average(n)
Dim s As Single = 0
For i As Integer = 1 To n
s = s + a(i)
Next
ave = s / n
データの和の計算
平均値の計算
Console.WriteLine("平均はE={0,8}", ave)
End Sub
平均値の書き出し
プログラミング演習(再)
• 外部データ’normal_data.txt’よりデータ点数および
各データを読み込んで,それらの平均値を計算す
るプログラムを作れ.
• 上記のプログラムをSubプロシージャに書き直し,平
均値と標準偏差を計算するプログラムを作れ.
• さらに,標準偏差を計算する部分もSubプロシー
ジャとして記述し,プログラムを書き直せ.
プログラム例:平均値と標準偏差の計算
Dim a(100), ave, sd As Single
Sub Main()
Dim n As Integer
Dim ReadText As New IO.StreamReader( _
"D:\…\normal_data.txt", System.Text.Encoding.Default)
データ点数の
読み込み
n = ReadText.ReadLine()
データを配列
へ読み込む
For i As Integer = 1 To n
a(i) = ReadText.ReadLine()
Next
平均値の計算
average(n)
standard_deviation(n)
ReadText.Close()
End Sub
標準偏差の計算
プログラム例:平均値と標準偏差の計算
Sub average(n)
Dim s As Single = 0
For i As Integer = 1 To n
s = s + a(i)
Next
ave = s / n
Console.WriteLine("平均はE={0,8}", ave)
End Sub
Sub standard_deviation(n)
Dim s2 As Single = 0, var As Single
二乗の和の計算
For i As Integer = 1 To n
s2 = s2 + a(i) ^ 2
Next
標準偏差の計算
var = s2 - n * ave ^ 2
sd = Math.Sqrt(var / n)
標準偏差の
Console.WriteLine("標準偏差は{0,8}", sd)
書き出し
End Sub
最小二乗法による直線の推定
n個のデータの真ん中を通るように
直線を引きたい
y
y  ax  b
傾きa, 切片bはいくらにすればよいか?
回帰直線
 xi , yi 
i番目のデータと直線とのズレをεiとする.
yi  axi  b   i
x
E      yi  axi  b 
2
i
i
2
i
の値を最小にするようなa, bを決める