情報基礎II (第1回)

情報基礎Ⅱ/基礎工学Ⅲ
(第11回)
月曜4限
担当:北川 晃
最小二乗法による直線の推定
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を決める
最小二乗法による直線の推定(つづき)
E
 2  yi  axi  b   xi   0
a
i


2
2
x
y

a
x

b
x

n
xy

ax
 bx  0
ii i i
i
i
i
E
 2  yi  axi  b  1  0
b
i
 y  a x  b  n  y  ax  nb   0
i
i
i
i
上の条件式をa, bについて解く
a
xy  x  y
x x
2
2
b  y  ax
x 2 :二乗の平均
2
x :平均の二乗
最小二乗法の計算
x
y
xy
xy
1.2
2.2
2.1
3.8
3.3
5.6
4.1
7.1
5.0
8.8
a
xy  x  y
x x
2
2
x2
x2
b  y  ax
x
y
プログラミング演習
‘least_square_data.csv’より,データの点数nと,(xi,yi) (i=1,…,n)
を読み込んで,最小二乗法よりその回帰直線y=ax+bを求めよ.
n
x
n
x
i 1
i
xy 
n
n
y
x y
i
i 1
i
n
n
 yi
x2 
i 1
n
2
x
i
i 1
n
配列a(i)と,要素数nを引数として,
平均値’ave’を返す関数を用いる
a
xy  x  y
x x
2
2
b  y  ax
least_square_data.csv
5
1.2,
2.1,
3.3,
4.1,
5.0,
2.2
3.8
5.6
7.1
8.8
最小二乗法による回帰直線:出力例
データには有効数字
二桁分しか信頼性がない
データの型の変更
• Cint(x): xを整数型へ変換
• CStr(x): xを文字列へ変換
• CSng(x): xを単精度実数型へ変換
• CDbl(x): xを倍精度実数型へ変換
• CBool(x): xを論理型へ変換
最小二乗法による回帰直線:プログラム例
Sub Main()
Dim n As Integer, s, items(10) As String, a, b As Single
Dim x(10), x2(10), y(10), xy(10), x_a, y_a, x2_a, xy_a As Single
Dim ReadText As New IO.StreamReader( _
"D:\…\least_square_data.csv", System.Text.Encoding.Default)
n = ReadText.ReadLine()
For i As Integer = 1 To n
s = ReadText.ReadLine()
items = Split(s, ",")
x(i) = CSng(items(0))
y(i) = CSng(items(1))
x2(i) = x(i) ^ 2
xy(i) = x(i) * y(i)
Next
ReadText.Close()
• xi
• xiyi
の計算
最小二乗法による回帰直線:プログラム例
x_a = average(n, x)
y_a = average(n, y)
xy_a = average(n, xy)
x2_a = average(n, x2)
それぞれの
平均値の計算
a = (xy_a - x_a * y_a) / (x2_a - x_a ^ 2)
傾き,切片の計算
b = y_a - a * x_a
Console.WriteLine("回帰直線は,y={0}x+{1}", a, b)
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
乱数とは?
サイコロを振って出る目の数のように,予測はできないが,
ある確率法則に従うでたらめな数.
 一様乱数
 正規乱数
 ポアッソン乱数
乱数の利用:
1. 自然科学および社会科学の問題のシミュレーション
2. 暗号の秘密鍵生成
乱数の発生方法
1. サイコロを振る.
例: 6
4
6
4
3
4
3
2
3
5
4
3
1
2
2
2
4
6
2
1
5
6
3
5
3
4
4
1
2
6
1
6
2. 自然現象を利用する(電子管のノイズ,放射性崩壊など)
3. 一つ前の値から次の値を計算する乱数列を生成する
(擬似乱数).
混合型合同法(擬似一様乱数列の生成法)
(μを法として合同)
疑似乱数列の特徴
•生来の乱数ではないので(初期値を与えている),
同じ条件で計算すれば,再現性がある.
•周期がある.少なくとも
回後には,同じ数列が現れる.
を大きくとる.
16ビットの乱数列だと・・・
  2  32768
15
(計算機で使える最大の数を使うとよい)
例題:疑似乱数列の発生
混合型合同法を用いて,乱数の初期値より,
擬似乱数列を生成するプログラムを作れ.
考え方:
1. 初期値
2.
を読み込む.
を計算し, で割ったあまりを計算する.
3. あまりを次の乱数として,
とおく.
4. さらに次の乱数を計算する.
  2 ,   12869, c  6925
15
疑似乱数列の発生:出力例
疑似乱数列の発生:プログラム例
Dim mu As Integer = 2 ^ 15
Dim x, lambda, c As Integer
Console.WriteLine("xの初期値(0-32768)を入力して下さい")
Console.Write("x0=")
x = Console.ReadLine()
lambda = 12869
c = 6925
For i As Integer = 1 To 20
x = (lambda * x + c) Mod mu
Console.WriteLine("{0,8}", x)
Next
プログラミング演習
疑似乱数列を発生させるプログラムを用いて,
六面サイコロの出目を生成するプログラムを作れ.
考え方
• 混合型合同法では,0≦x<μの乱数が得られる.
• 得られた乱数をμで割れば,[0,1)の乱数が得られる.
• [0,1)の規格化乱数が得られれば,これに(b-a)
をかけてaを加えることで,[a,b)の乱数が得られる.
• 実数で得られる乱数列を整数化する.
サイコロの出目:出力例
サイコロの出目の発生:プログラム例
Dim mu As Integer = 2 ^ 15
Sub Main()
Console.Title = "乱数の発生"
Dim x, x_dice As Integer, n As Integer = 100
Console.WriteLine("xの初期値(0-32768)を入力して下さい")
Console.Write("x0=")
一様乱数を生成する関数
x = Console.ReadLine()
For i As Integer = 1 To n
x_dice = Fix(6 * uni_rnd(x) / mu + 1)
If i Mod 10 <> 0 Then
Console.Write("{0,5}", x_dice)
1≦x<7の
Else
Console.WriteLine("{0,5}", x_dice) 実数列を生成
End If
x = uni_rnd(x)
Next
xを次の値に置き直す
End Sub
サイコロの出目の発生:プログラム例(つづき)
Function uni_rnd(x) As Single
Dim lambda, c As Integer
lambda = 12869
c = 6925
x = (lambda * x + c) Mod mu
Return x
End Function
一様乱数を計算する
関数副プログラム