情報基礎Ⅱ/基礎工学Ⅲ (第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 一様乱数を計算する 関数副プログラム
© Copyright 2025 ExpyDoc